【发布时间】:2017-06-03 08:42:27
【问题描述】:
我正在使用 OpenGL 执行以下操作。我的屏幕尺寸为 512*512。我有一个与屏幕大小相同的纹理。我想绘制一个覆盖整个屏幕的四边形,并在像素和纹素之间建立一对一的映射,这样我就可以在着色器中使用屏幕坐标进行texelFetch。
首先,如果我像下面这样设置四边形的角:
(-1, 1)+-----------+(1,1)
| |
| |
| |
| |
| |
(-1,-1)+-----------+(1,-1)
并将它们对应的纹理坐标设置为:
(0,511)+-----------+(511,511)
| |
| |
| |
| |
| |
(0, 0)+-----------+(511,0)
我刚刚使用以下片段着色器获得了一个白屏,它试图为其四个边界分配不同的颜色:
#version 330
in vec2 fUV; // sent from vertex shader
out vec4 color;
void main() {
if (fUV.x == 0) // leftmost
color = vec4(1.0, 0.0, 0.0, 1.0);
else if (fUV.y == 0) // bottom
color = vec4(0.0, 1.0, 0.0, 1.0);
else if (fUV.x == 511) // rightmost
color = vec4(0.0, 0.0, 1.0, 1.0);
else if (fUV.y == 511) // top
color = vec4(1.0, 0.0, 1.0, 1.0);
else // otherwise
color = vec4(1.0, 1.0, 1.0, 1.0);
// check if uv equals an integer
if (fUV.y == 100)
color = vec4(0.0, 0.0, 0.0, 1.0);
}
这意味着所有的相等测试都失败了。
其次,如果我向所有 -1 坐标添加半像素宽度偏移 d= 1.0 / 512:
(-1+d, 1 )+-----------+(1,1)
| |
| |
| |
| |
| |
(-1+d,-1+d)+-----------+(1,-1+d)
保持其他不变,我在屏幕上画了最左边的红线。
我得到的上述结果确实令人困惑。为什么只画了最左边的那一列,而最下面的那一行没有?
我想知道如何绘制四边形并设置它们的坐标,以便在像素和纹素之间建立一对一的映射。
【问题讨论】:
-
您不应该使用
==运算符进行浮点比较。使用abs(fUV.x - 511) < 0.001
标签: opengl