数组 – 如何用一维纹理替换GLSL均匀数组

我想让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

为纹理创建一维缓冲区

> width = 8 * 4 = 32个浮点数,或32 * 4 = 32个字节大
>像这样填充浮动缓冲区:

[X0,y0,0,0,X 1,y1,0,0,X2,y2,0,0,X3,y3,0,0,X4,y4,0,0,X5,y5,0,0,5233 ,y6,0,0,X7,y7,0,0]

为纹理创建一维采样器

> min filter =最近,没有mip贴图
> mag filter =最近的
> wrap mode = clamp to edge

在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;
}

但它被打破了.

我究竟做错了什么?

最佳答案 你展示的一切看起来都很正确. “它被打破”虽然不是很具描述性.有什么症状?

你没有表现出来的一些事情可能是错的:

> 2个采样器使用相同的纹理单元.
>在纹理数据中键入问题(尽管如果您有经验,我对此表示怀疑)

您可以尝试另外一件事:使用texture2d代替,只有height = 1. DX不需要1d纹理支持,因此根据硬件,可能会模拟对opengl的支持.你可以试着远离这种模仿.

点赞