【问题标题】:Metal fragment shader uv coordinates change when reading in vertex color以顶点颜色读取时,金属片段着色器 uv 坐标发生变化
【发布时间】:2017-10-05 10:31:34
【问题描述】:

我正在尝试对一个简单的彩色四边形应用抖动,发现一个奇怪的问题。我有一个片段着色器,它应该计算一些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;
        }
    }

产生以下结果:

图像左侧显示我的渐变四边形的位置,请注意if (uv.y &lt; 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;
    }
} 

产生这个(正确的)结果:

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

【问题讨论】:

    标签: ios macos shader metal metalkit


    【解决方案1】:

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

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

    我怀疑[[point_coord]] 只是未定义并且在您绘制三角形时会受到随机行为的影响。随机性显然受到片段着色器的细节(例如堆栈布局)的影响。

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

    【讨论】:

    • 谢谢,我会尝试为“texCoord”添加一个字段,看看会发生什么。再次阅读规范,我误解了 point_coord 属性,因为它的行为类似于 uv 坐标!
    • 添加了一个额外的字段,它就像一个魅力,再次感谢你指出我显而易见的地方:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多