我可以使用带有OpenGL glTexImage2D功能的灰度图像吗?

Nic*_*ton 15 c++ opengl textures

我的纹理只有一个通道,因为它是一个灰度图像.当我将像素传递给glTexImage2D时,它会变成红色(显然是因为通道1是红色; RGB).

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
Run Code Online (Sandbox Code Playgroud)

我是否更改了GL_RGBA?如果是这样,该怎么办?

ypn*_*nos 16

将其更改为GL_LUMINANCE.见http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html

  • 在OpenGL 4.0中不推荐使用.但是OpenGL 4.0没有固定的功能管道,你需要绑定自己的着色器,这就是LUMINANCE,ALPHA等没有用的原因.您需要使用GL_RED并相应地处理单个通道. (7认同)
  • 看来你的链接坏了.(它重定向到主页).[glTextImage2D](http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml)有效,但在任何地方都没有提到GL_LUMINANCE.它似乎已经过时了... (3认同)

Min*_*ing 7

在 FragmentShader 中,您可以编写:

uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
Run Code Online (Sandbox Code Playgroud)

在cpp文件中,你可以写:

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RED,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);
Run Code Online (Sandbox Code Playgroud)

  • 您能详细说明一下并解释一下代码片段的作用吗? (2认同)
  • 如果想用这个函数【glTexImage2D()】得到灰度,只能将颜色格式参数调整为GL_RED。但是效果是红色的,因为只取了红色通道。因此,我们可以在 Fragment Shader 中修改获取到的图像的颜色信息,使绿色通道和蓝色通道的值与红色通道的值相等,从而获得灰度图像的效果。 (2认同)