顶点着色器中的GLSL 1.2 floor()问题

时间:2014-02-01 16:20:45

标签: opengl glsl

我试图根据顶点着色器中传入顶点的坐标计算纹理坐标。这是我尝试的精简版:

#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中。所以我基本上要做的是

  • 首先从ivec2 heightmapSize创建一个float vec2,它保存heightmap采样器的宽度和高度。
  • 然后我将顶点坐标转换为区间[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,我将结果颜色设置为绿色,否则设置为红色。图像几乎都是红色的。

  

Result image

如何可能fract()不会导致两个整数值的向量(或因浮点精度而接近整数),或添加vec2(0.5, 0.5)无效?我错过了别的什么吗?

0 个答案:

没有答案