OpenGL灰度纹理为浮动错误格式

时间:2018-09-27 07:07:33

标签: c++ opengl graphics glsl swizzling

我有一个浮点值在0.0-1.0范围内的数组(一个高度图),但是纹理返回黑色或红色,我尝试了内部和源格式的多种组合,但是似乎没有任何效果。我当前的代码仅给我红色的纹理是:

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, w, h, 0, GL_RED, GL_FLOAT, data);

[编辑]图像输出: enter image description here 任何想法有什么问题吗?

2 个答案:

答案 0 :(得分:2)

您必须设置纹理模糊度参数,以处理OpenGL并在查找纹理时从红色通道读取绿色和蓝色通道-请参见glTexParameteri

toggleClass

请参见OpenGL 4.6 API Compatibility Profile Specification; 16.1 Texture Environments and Texture Functions; page 595

  

它们是通过计算   如表16.1所示,从滤波后的纹理值Rt,Gt,Bt,At,Lt和It获得基色Cb和Ab,...

operation = 'toggleClass'
     

表16.1:过滤后的纹理成分与纹理基础成分的对应关系。

     

...之后,通过纹理参数glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED ); Texture Base Texture base color Internal Format Cb Ab ... RED (Rt, 0, 0) 1 RG (Rt, Gt, 0) 1 RGB (Rt, Gt, Bt) 1 RGBA (Rt, Gt, Bt) At TEXTURE_SWIZZLE_RTEXTURE_SWIZZLE_G的值控制,使Cb的成分变灰。如果TEXTURE_SWIZZLE_B的值由swizzler表示,则swizzling会根据

来计算Cs的第一部分
TEXTURE_SWIZZLE_A

如果您要使用着色器程序,则可以通过Swizzling在片段着色器中执行类似的操作:

TEXTURE_SWIZZLE_R

答案 1 :(得分:0)

在glTexImage2D函数的第7个论点中,您应该设置图像的格式。您将其设置为GL_RED。您应该将其设置为图片的格式,可能是GL_RGB或GL_RGBA。

请阅读the documentation

如果它能正确处理纹理的正确格式,则可能是其他问题。虽然无法分辨看不到其余的代码。

您确定数据加载正确吗? 您是否将适当的纹理坐标发送到片段着色器? 您还记得设置主动纹理吗? 您是否已在片段着色器中将Sampler2D设置为与活动着色器相同的值?