• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在 iOS Metal 中透视正确的纹理映射

[复制链接]
菜鸟教程小白 发表于 2022-12-12 16:30:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我尝试了各种方法来进行插值工作并生成透视正确的图像,但建议的方法都不起作用。

我当前的代码是:

struct VertexStruct
{
  float4 normalizedPosition [[ position ]];
  float4 texCoord;
}

vertex VertexStruct testVertex(device float4 *vertices [[ buffer(0) ]],
                                     uint vid [[ vertex_id ]])
{
  VertexStruct outVertices;

  outVertices.normalizedPosition = ...;

  outVertices.texCoord = float4(vertices[vid].x, vertices[vid].y, 0.0, 127.0);

  return outVertices;
}

fragment half4 testFragment(VertexStruct inFrag [[ stage_in ]],
                            texture2d<half, access::sample> volume [[ texture(0) ]])
{
  float2 texCoord = float2(inFrag.texCoord.xy * (1.0 / inFrag.texCoord.w));
  constexpr sampler s(coord::normalized, filter::linear, address::clamp_to_zero);
  return volume.sample(s, texCoord);
}

纹理为 128x128,顶点为:

  • 0,0
  • 0,127
  • 127,0
  • 127,127

理论上,第 4 个参数 w 应该有助于透视正确插值。据报道,此技巧可在 OpenGL ES 中使用,但就我而言,无论我是否拥有它,都不会发生任何变化。

我得到的是:

enter image description here

蓝色是清晰的颜色,而黑色梯形内的任何东西都是纹理的内容。红色梯形应位于黑色梯形的中心。如果你用 Photoshop 打开它并跟踪黑色梯形的对角线,它会完全通过红色梯形的对角线。

enter image description here

这意味着渲染的两个三角形没有通过透视正确采样读取纹理。这是纹理映射的经典问题,但我无法理解。

任何人都可以看到错误吗?



Best Answer-推荐答案


透视正确的纹理映射已经成为十多年的规范,并且被每个图形 API 默认使用,尤其是 Metal。你不需要做任何事情来获得正确的结果,只要你没有在你的设置中做一些完全错误的事情

事实上,Metal 允许您直接在 MSL 中指定插值和采样。 默认情况下,所有内容都使用 center_perspective 限定符(像素中心、透视正确插值,但位置明显异常(exception),即 center_no_perspective。 p>

鉴于从光栅化器进入片段函数的数据是 stage_in,您只需在 MSL 代码中直接声明成员后添加所需的采样/插值限定符,就像任何其他属性一样.显式详细规范示例:

struct Fragment {

    float4 position             [[ center_no_perspective ]];    // Default, can be omitted.
    float4 specialTreatment     [[ centroid_perspective ]];     // Let's say you need centroid + perspective correct.
    float2 textureCoordinates   [[ center_perspective ]];       // Default, can be omitted.

};

至于您的其他选项,它基本上是 center/centroid/sample 和 perspective/no_perspective 组合,以及 flat (没有插值,显然是整数)。在列表中,它看起来像:

  • [[ flat ]] 无插值,整数成员。
  • [[ center_perspective ]] 居中,透视正确(默认)
  • [[ center_no_perspective ]] 中心,线性 (默认位置)
  • [[ centroid_perspective ]] 质心,透视正确
  • [[ centroid_no_perspective ]]质心,线性
  • [[ sample_perspective ]]示例,透视正确*
  • [[ sample_no_perspective ]] 样本,线性*

警告: sample_* 限定符将使片段函数按样本执行,而不是通常按片段执行。去亚像素是一个潜在的性能危险信号,所以在必要时使用。

关于ios - 在 iOS Metal 中透视正确的纹理映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33048343/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap