我在对简单的彩色四边形应用抖动处理时发现一个奇怪的问题。我有一个片段着色器,它应该在某个uv处计算抖动并返回抖动的颜色。这在带纹理的四边形上可以正常工作,但是奇怪的是,当我从inVertex访问颜色数据时,uv坐标更改为一些奇怪的值,并且y值似乎映射到了x轴。我将尝试说明在片段着色器代码周围进行更改时发生的情况。

fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]],
                                              float2 uv[[point_coord]]) {
        float4 color = inVertex.color;
        uv = (uv/2) + 0.5;
        if (uv.y < 0.67) {
            return float4(uv.y, 0, 0, 1);
        }
        else {
            return color;
        }
    }


产生以下结果:ios -  Metal 片段着色器的uv坐标在读取顶点颜色时发生更改-LMLPHP

在图像左侧显示我的渐变四边形的地方,请注意if (uv.y < 0.67)映射到图像🤔中的x值。

如果我更改此片段着色器,而无需更改代码中的任何其他内容,例如,在我return float4(0, 0, 1, 0)代替inVertex.color的地方,uv坐标将正确映射。

fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]],
                                          float2 uv[[point_coord]]) {
    float4 color = inVertex.color;
    uv = (uv/2) + 0.5;
    if (uv.y < 0.67) {
        return float4(uv.y, 0, 0, 1);
    }
    else {
        return float4(0, 0, 1, 0); //return color;
    }
}


产生以下(正确)结果:
ios -  Metal 片段着色器的uv坐标在读取顶点颜色时发生更改-LMLPHP

我想我可以通过将1x1纹理应用于渐变并使用纹理坐标来解决此问题,但是我真的很想知道这里发生了什么,这是我不了解的错误还是功能?

最佳答案

为什么使用[[point_coord]]?您认为它代表什么?

除非绘制点图元,否则不应该使用它。由于您正在绘制“四边形”并给出了屏幕截图,因此我假设您未绘制点图元。

我怀疑只是未定义,在绘制三角形时会受到随机现象的影响。随机性显然受片段着色器细节(例如堆栈布局)的影响。

您应该使用[[point_coord]]并按窗口大小进行缩放,或者使用[[position]]结构中的插值字段来承载“纹理”坐标。

10-06 02:56