4

我正在尝试让 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;
}

但它坏了。

我究竟做错了什么?

4

2 回答 2

1

texCoord 计算是正确的。一开始我很困惑,因为我会做 (unit + .5) / 8.0,但它是一样的。

有一件事仍然让我担心。由于 texFetch 将是 vec4,您不需要在采样器语句的末尾写 .rg 吗?我很惊讶你的编译器没有抱怨它。

尝试:

texture1D(sliceOffset, texCoord).rg;
于 2010-12-04T12:29:47.157 回答
1

你展示的一切看起来都是正确的。“它坏了”虽然不是很有描述性。有什么症状?

您没有显示的一些事情可能是错误的:

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

您可以尝试的另一件事是:改用 texture2d,只有 height=1。DX 不需要 1d 纹理支持,因此根据硬件,可能会模拟对它的 opengl 支持。您可以尝试远离此类仿真。

于 2010-12-04T08:12:22.333 回答