Can I use a grayscale image with the OpenGL glTexImage2D function?

前端 未结 3 1814
清酒与你
清酒与你 2020-12-06 10:14

I have a texture which has only 1 channel as it\'s a grayscale image. When I pass the pixels in to glTexImage2D, it comes out red (obviously because channel 1 is red; RGB).<

相关标签:
3条回答
  • 2020-12-06 10:50

    It appears that I should use GL_LUMINANCE instead of GL_RGBA for the 3rd argument.

    Edit (in reply to comments):

    When I set the 7th argument to GL_LUMINANCE (as well as the 3rd), the picture goes completely distorted. With the DICOM pixel format, it appears that the 7th argument must be GL_RGBA for some reason.

    The strange behavior is because I'm using the DICOM standard. The particular DICOM reader I am using outputs integer pixel values (as pixel values may exceed the normal maximum of 255). For some strange reason the combination of telling OpenGL that I am using an RGBA format, but passing in integer values rendered a perfect image.

    Because I was truncating the DICOM > 255 pixel values anyway, it seemed logical to copy the values in to a GLbyte array. However, after doing so, a SIGSEGV (segmentation fault) occurred when calling glTexImage2D. Changing the 7th parameter to GL_LUMINANCE (as is normally required) returned the functionality to normal.

    Weird eh?

    So, a note to all developers using the DICOM image format: You need to convert the integer array to a char array before passing it to glTexImage2D, or just set the 7th argument to GL_RGBA (the later is probably not recommended).

    0 讨论(0)
  • 2020-12-06 10:54

    Change it to GL_LUMINANCE. See http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html

    0 讨论(0)
  • 2020-12-06 11:10

    in the FragmentShader, you can write:

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

    in the cpp file,you can write:

    glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RED,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);
    
    0 讨论(0)
提交回复
热议问题