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

时间:2009-03-25 03:29:40

标签: c++ opengl textures

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

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);

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

3 个答案:

答案 0 :(得分:16)

答案 1 :(得分:0)

似乎我应该使用GL_LUMINANCE代替GL_RGBA作为第三个参数。

编辑(回复评论):

当我将第7个参数设置为GL_LUMINANCE(以及第3个)时,图像完全失真。使用DICOM像素格式时,由于某种原因,第7个参数似乎必须为GL_RGBA

奇怪的行为是因为我使用DICOM标准。我使用的特定DICOM阅读器输出整数像素值(因为像素值可能超过正常的最大值255)。由于一些奇怪的原因,告诉OpenGL我正在使用RGBA格式,但传递整数值的组合呈现出完美的图像。

因为我正在截断DICOM>无论如何,255像素值,将值复制到GLbyte数组似乎是合乎逻辑的。但是,执行此操作后,调用glTexImage2D时会发生SIGSEGV(分段错误)。将第7个参数更改为GL_LUMINANCE(通常需要)将功能恢复为正常。

很奇怪呃?

所以,给所有使用DICOM图像格式的开发人员一个注释:你需要将整数数组转换为char数组,然后再传递给glTexImage2D,或者只将第7个参数设置为GL_RGBA(可能不建议使用后者。)

答案 2 :(得分:0)

在FragmentShader中,你可以写:

uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);

在cpp文件中,您可以写:

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);