0

我正在尝试将抖动应用于一个简单的彩色四边形,并发现了一个奇怪的问题。我有一个片段着色器,它应该计算一些抖动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 < 0.67)映射到图像中的 x 值。

如果我更改此片段着色器而不更改代码中的其他任何内容,就像这样,在 Ireturn float4(0, 0, 1, 0)而不是 的地方inVertex.coloruv坐标被正确映射。

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 纹理应用于渐变并使用纹理坐标来解决这个问题,但我真的很想知道这里发生了什么,这是我不理解的错误还是功能?

4

1 回答 1

3

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

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

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

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

于 2017-05-07T14:01:19.647 回答