如何使用 opengl 纹理将 non-normalized/unclamped 值发送到 GLSL 着色器?

How to send non-normalized/unclamped values to GLSL shader using opengl textures?

我正在尝试将一组浮点值(高度图)作为 GL_TEXTURE_2D 发送到 GLSL。虽然我的采样器设置正确,但问题出在我使用 glTexImage2D() 上传纹理时发生的夹紧。

  glGenTextures(1, &_idnewTID);
  glBindTexture(GL_TEXTURE_2D, _idnewTID);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, regMesh._cols, regMesh._rows, 0, GL_RED, GL_FLOAT, regMesh._heightMap);

我发送的值在 900.0f 到 1590.0f 的范围内。但是当它加载到 GL_TEXTURE_2D 时,它会完全限制在 1.0f。

如何防止值被限制为 [0,1]。我应该如何修改 glTexImage2D() 函数以实现此目的?

P.S 我知道采样器工作正常,因为当我将值除以 1500.0f 并将其上传到 GPU 并在着色器中对其进行缩放时,我得到了正确的高度图结构。

首先,您应该始终使用 sized internal format(这是 glTexImage* 的第三个参数)。 GL_RED 留给实施的事情太多了。

其次,您正在尝试存储和使用 floating-point 数据。所以你需要选择一个 floating-point 内部格式,而不是一个规范化的整数格式。如果内部格式的大小不以 F 结尾,则它不会存储 floating-point 值。 GL_R32F 比较合适。