Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以将灰度图像与OpenGL glTexImage2D函数一起使用吗?_C++_Opengl_Textures - Fatal编程技术网

C++ 我可以将灰度图像与OpenGL glTexImage2D函数一起使用吗?

C++ 我可以将灰度图像与OpenGL glTexImage2D函数一起使用吗?,c++,opengl,textures,C++,Opengl,Textures,我有一个纹理只有一个通道,因为它是灰度图像。当我将像素传递到GLTEXAGE2D时,它显示为红色(显然是因为通道1为红色;RGB) 我要换GL_RGBA吗?如果是,怎么办?对于第三个参数,我似乎应该使用GL\u亮度而不是GL\u RGBA 编辑(回复评论): 当我将第7个参数设置为GL\u LUMINANCE(以及第3个)时,图片完全失真。对于DICOM像素格式,出于某种原因,第7个参数似乎必须是GL_RGBA 奇怪的行为是因为我使用的是标准。我使用的特定DICOM读卡器输出整数像素值(因为像素

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


我要换GL_RGBA吗?如果是,怎么办?

对于第三个参数,我似乎应该使用
GL\u亮度
而不是
GL\u RGBA

编辑(回复评论): 当我将第7个参数设置为
GL\u LUMINANCE
(以及第3个)时,图片完全失真。对于DICOM像素格式,出于某种原因,第7个参数似乎必须是
GL_RGBA

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

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

奇怪吧


因此,所有使用DICOM图像格式的开发人员都需要注意:在将整数数组传递给
glTexImage2D
之前,您需要将其转换为字符数组,或者只需将第7个参数设置为
GL\u RGBA
(可能不建议使用后者)。

将其更改为GL\u LUMINANCE。请参见FragmentShader中的

,您可以编写:

uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RED,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);
在cpp文件中,您可以写入:

uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RED,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);

这里最重要的是论点7!嗯,当零钱7时,它会变成红色。。。但是#3达到了预期的效果。你能解释一下吗?正如ypnos所说,论点7和论点8是你感兴趣的。它们告诉OpenGL指针指向的数据格式。我记得,前面的参数表示纹理的类型。尼克,参数#3表示内部存储,#7表示输入格式。总账将从#7转换为#3。你受到的影响可能有几个原因,我无法从这里看出。然而,在几乎所有情况下,你都希望两者都是一样的。看起来你的链接断了。(它会重定向到主页)。工作,但它没有提到任何地方的亮度。似乎他们已经淘汰了它…在OpenGL4.0中被弃用了。但是OpenGL 4.0没有固定的函数管道,您需要绑定自己的着色器,这就是为什么不再使用亮度、ALPHA等。您需要使用GL_RED并相应地处理单通道。您能否再详细说明一下,并解释一下代码段所做的工作?如果您想使用此函数【glTexImage2D()】获得灰度,您只能将color format参数调整为GL_RED。但是效果是红色的,因为只使用红色通道。因此,我们可以在片段着色器中修改获得的图像的颜色信息,使绿色通道和蓝色通道的值等于红色通道的值,从而获得灰色图像的效果。您应该提到,
GL_亮度
已经过时,这就是为什么应该使用
GL_红色