如何使用opengl纹理将非标准化/非固定值发送到GLSL着色器?

Rat*_*vel 3 opengl glsl texture-mapping heightmap

我正在尝试将浮点值(高度图)数组作为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);
Run Code Online (Sandbox Code Playgroud)

我要发送的值在900.0f至1590.0f范围内。但这在加载到时会被完全钳制到1.0f GL_TEXTURE_2D

如何保持值不被钳制到[0,1]。如何修改glTexImage2D()函数以实现此目标?

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

Nic*_*las 5

首先,您应该始终使用内部尺寸格式(这是的第三个参数glTexImage*)。GL_RED留给实施太多了。

其次,您正在尝试存储和使用浮点数据。因此,您需要选择一种浮点内部格式,而不是标准化的整数格式。如果内部格式的大小不以结尾F,则它不存储浮点值。GL_R32F将是适当的。