如何使用 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
比较合适。
我正在尝试将一组浮点值(高度图)作为 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
比较合适。