我在对简单的彩色四边形应用抖动处理时发现一个奇怪的问题。我有一个片段着色器,它应该在某个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值。如果我更改此片段着色器,而无需更改代码中的任何其他内容,例如,在我
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纹理应用于渐变并使用纹理坐标来解决此问题,但是我真的很想知道这里发生了什么,这是我不了解的错误还是功能?
最佳答案
为什么使用[[point_coord]]
?您认为它代表什么?
除非绘制点图元,否则不应该使用它。由于您正在绘制“四边形”并给出了屏幕截图,因此我假设您未绘制点图元。
我怀疑只是未定义,在绘制三角形时会受到随机现象的影响。随机性显然受片段着色器细节(例如堆栈布局)的影响。
您应该使用[[point_coord]]
并按窗口大小进行缩放,或者使用[[position]]
结构中的插值字段来承载“纹理”坐标。