我正在尝试让 Ardor3D 的地形系统在 SM3.0 硬件上工作。
当前的 GLSL 片段着色器使用统一的 vec2 数组将 xy 坐标数组传递给片段着色器。
由于动态索引统一数组仅适用于 SM4.0+ 硬件,要使其在 SM3.0 上运行,我需要将其替换为 1D 浮点纹理。
当前数组如下所示:
uniform vec2 sliceOffset[8];
并像这样访问:
vec2 offset = sliceOffset[int(unit)];
我对 OpenGL 和 GLSL 非常有经验,所以我在转换时遇到了一些问题。
到目前为止,我已经这样做了:创建一维纹理 - 宽度 = 8 - 格式 = RGBA32F
为纹理创建一维缓冲区
- 宽度 = 8 * 4 = 32 个浮点数,或 32 * 4 = 32 个字节大
- 像这样填充浮动缓冲区:
[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]
为纹理创建一维采样器
- 最小过滤器=最近的,没有mip贴图
- mag 过滤器 = 最近
- 环绕模式 = 夹到边缘
在 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;
}
但它坏了。
我究竟做错了什么?