【问题标题】:How to replace a GLSL uniform array with a 1D texture如何用一维纹理替换 GLSL 统一数组
【发布时间】:2010-12-04 02:48:48
【问题描述】:

我正在尝试让 Ardor3D 的地形系统在 SM3.0 硬件上工作。

当前的 GLSL 片段着色器使用统一的 vec2 数组将 xy 坐标数组传递给片段着色器。

由于动态索引统一数组仅适用于 SM4.0+ 硬件,要使其在 SM3.0 上运行,我需要将其替换为一维浮点纹理。

当前数组如下所示: uniform vec2 sliceOffset[8];

并像这样访问: vec2 offset = sliceOffset[int(unit)];

我对 OpenGL 和 GLSL 非常有经验,所以我在转换时遇到了一些问题。

到目前为止,我已经这样做了: 创建一维纹理 - 宽度 = 8 - 格式 = RGBA32F

为纹理创建一维缓冲区

  • width = 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;
}

但它坏了。

我做错了什么?

【问题讨论】:

    标签: arrays opengl glsl textures fragment-shader


    【解决方案1】:

    您展示的所有内容看起来都不错。 “它坏了”虽然不是很有描述性。有什么症状?

    你没有展示的一些事情可能是错误的:

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

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

    【讨论】:

    • 我已经尝试将从纹理返回的颜色输出到 gl_FragColor 以便进行更多调试。纹理响应变化,因此采样器使用正确的纹理。
    • 所以我把它写到缓冲区 [1.0, 0, 0, 0, ... 1.0, 0, 0, 0]。现在我希望结果是红色的,但我得到蓝色!,如果我将数据格式设置为 GL_BGRA,我就会得到红色。另外,如果我使用 unit = 0, 2, 4, ... 我会得到蓝色,但是对于 unit = 1, 3, 5, ... 我会得到黑色。这有帮助吗?
    • 也有人可以验证texCoord计算是否正确?
    • @Leith。请通过调用 glTexImage1D 及其数据来更新您的问题。
    【解决方案2】:

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

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

    试试:

    texture1D(sliceOffset, texCoord).rg;
    

    【讨论】:

    • 对不起,我错过了,但我正在使用它。当我创建那个例子时它错过了它。关于为什么我在调试中得到奇怪颜色的任何想法?
    • 我想不通。唯一可能的问题是格式不正确,但看起来也不错。
    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2018-03-23
    • 2020-12-03
    相关资源
    最近更新 更多