我试图根据顶点着色器中传入顶点的坐标计算纹理坐标。这是我尝试的精简版:
#version 120
varying vec4 color;
uniform sampler2D heightmap;
uniform ivec2 heightmapSize;
void main(void)
{
vec2 fHeightmapSize = vec2(heightmapSize);
vec2 pos = gl_Vertex.zx + vec2(0.5f, 0.5f);
vec2 offset = floor(fHeightmapSize * pos) + vec2(0.5f, 0.5f);
if (fract(offset.x) > 0.45f && fract(offset.x) < 0.55f
&& fract(offset.y) > 0.45f && fract(offset.y) < 0.55f)
color = vec4(0.0f, 1.0f, 0.0f, 1.0f);
else
color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
// gl_Position = ...
// ...
}
gl_Vertex在XZ平面上的[-0.5, 0.5]^2
中。所以我基本上要做的是
[0, 1]^2
。 然后我通过将顶点位置与高度图大小相乘来计算纹理坐标中的偏移量。左侧部分(使用floor()
)应返回每个方向上的纹素数。
示例:纹理的大小为
4x4
,位置为(0.55, 0.5)
。这意味着我会在右边有两个纹素,两个纹素向上 - &gt;(2.0, 2.0)
。
在右边部分,我添加了另一个(0.5, 0.5)
因为我想要纹素的中心。 (2.0, 2.0)
变为(2.5, 2.5)
。 注意:无论坐标是什么,小数部分最后应为0.5
。
现在出现了奇怪的部分。我通过指定两种颜色来测试结果。如果偏移的小数部分是&#34;关闭&#34;到0.5
,我将结果颜色设置为绿色,否则设置为红色。图像几乎都是红色的。
如何可能fract()
不会导致两个整数值的向量(或因浮点精度而接近整数),或添加vec2(0.5, 0.5)
无效?我错过了别的什么吗?