19

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

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

我要更改 GL_RGBA 吗?如果是这样,该怎么办?

4

4 回答 4

20

将其更改为 GL_LUMINANCE。见https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

于 2009-03-25T03:32:06.167 回答
8

在 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);
于 2018-01-08T09:33:20.833 回答
1

看来我应该使用GL_LUMINANCE而不是GL_RGBA第三个参数。

编辑(回复评论):

当我将第 7 个参数设置为GL_LUMINANCE(以及第 3 个)时,图片完全扭曲了。对于 DICOM 像素格式,第 7 个参数似乎GL_RGBA出于某种原因。

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

因为无论如何我都在截断 DICOM > 255 像素值,所以将这些值复制到 GLbyte 数组中似乎是合乎逻辑的。但是,这样做之后,调用glTexImage2D. 将第 7 个参数更改为GL_LUMINANCE(通常需要)使功能恢复正常。

奇怪吧?

因此,给所有使用 DICOM 图像格式的开发人员的注意事项:您需要将整数数组转换为 char 数组,然后再将其传递给glTexImage2D,或者只需将第 7 个参数设置为GL_RGBA(可能不推荐使用后者)。

于 2009-03-25T03:32:03.077 回答
0

您将GL_LUMINANCE在旧版本的 openGL 中使用格式,但现在在现代 3.0+ OpenGL 版本GL_LUMINANCE中已弃用,因此新的做法是使用GL_RED格式,但这会导致红色纹理,所以要解决这个问题,您应该创建一个costum shader 如上面的答案所示,在该着色器中,您抓取纹理的红色分量,因为它是唯一具有您提供的数据并将绿色/蓝色通道设置为红色通道值的着色器,它将转换为灰度,因为灰度纹理使所有 3 个 RGB 通道相同,并将 Alpha/透明度通道设置为 1。

于 2021-09-09T06:22:21.507 回答