我试图让Ardor3D的地形系统在SM3.0硬件上运行。
当前的GLSL片段着色器使用统一的vec2数组将xy坐标数组传递给片段着色器。
由于动态索引统一数组仅适用于SM4.0 +硬件,为了使其在SM3.0上运行,我需要用1D浮点纹理替换它。
当前数组如下所示:
uniform vec2 sliceOffset[8];
并像这样访问:
vec2 offset = sliceOffset[int(unit)];
我对OpenGL和GLSL非常有经验,所以我在转换时遇到了一些问题。
到目前为止,我已经这样做了: 创建一维纹理 - 宽度= 8 - format = RGBA32F
为纹理
创建一维缓冲区 [x0,y0,0,0,x1,y1,0,0,x2,y2,0,0,x3,y3,0,0,x4,y4,0,0,x5,y5,0,0,x6,y6,0,0,x7,y7,0,0]
为纹理
创建一维采样器在GLSL中,我将采样器定义为:
uniform sampler1D sliceOffset;
并访问它:
vec2 getSliceOffset(float unit)
{
float texCoord = (unit * 2.0f + 1.0f) / (2.0f * 8.0f);
vec2 offset = texture1D(sliceOffset, texCoord);
return offset;
}
但它已经坏了。
我做错了什么?
答案 0 :(得分:1)
你展示的一切看起来都是正确的。 “它被打破”虽然不是很具描述性。有什么症状?
有些事情你没有表明可能是错的:
您可以尝试另外一件事:使用texture2d代替,只有height = 1。 DX不需要1d纹理支持,因此根据硬件,可能会模拟对opengl的支持。你可以试着远离这种模仿。
答案 1 :(得分:1)
texCoord计算是正确的。因为我已经完成了(单位+ .5)/ 8.0,所以起初很困惑,但它是一样的。
但有一件事仍然让我担心。你不需要在sampler语句的末尾写.rg,因为texFetch将是vec4吗?我很惊讶您的编译器没有抱怨它。
尝试:
texture1D(sliceOffset, texCoord).rg;