我正试图让Ardor3D的地形系统在SM3.0硬件上工作。
当前的GLSL片段着色器使用统一的vec2数组将xy坐标数组传递到片段着色器。
由于动态索引统一数组只在SM4.0+硬件上工作,为了让它在SM3.0上运行,我需要用一维浮点纹理代替它。
当前数组如下所示:uniform vec2 sliceOffset[8];
并且访问如下:vec2 offset = sliceOffset[int(unit)];
我非常有经验的OpenGL和GLSL,所以我有一些问题,以进行转换。
到目前为止,我已经完成了以下工作:创建一个一维纹理宽度=8-格式= 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;
}但它坏了。
我做错了什么?
发布于 2010-12-04 08:12:22
你展示的一切看起来都是对的。“它是坏的”并不是很有描述性。症状是什么?
有些事情你没有表现出来,可能是错的:
使用相同纹理单元的
您还可以尝试另一件事:使用texture2d代替,只使用height=1。DX不需要一维纹理支持,因此根据硬件的不同,它的支持可能会被模仿。你可以试着远离这样的模拟。
发布于 2010-12-04 12:29:47
texCoord计算是正确的。一开始它让人困惑,因为我本来可以完成(unit + .5) / 8.0,但它是一样的。
不过,有一件事我还是很担心。您不需要在.rg语句的末尾编写texFetch,因为texFetch将是一个vec4?我很惊讶你的编译器没有抱怨这件事。
尝试:
texture1D(sliceOffset, texCoord).rg;https://stackoverflow.com/questions/4351662
复制相似问题