Невозможно получить текстуру RGB для отображения в OpenGL ES2 - PullRequest
2 голосов
/ 09 января 2020

Я могу получить 1 канал текстуры для отображения с этим кодом:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image_width, image_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, image_grayscale);
    point bbox[4] = {
        { -0.5, 0.5, 0, 0 },
        { 0.5, 0.5, 1, 0 },
        { -0.5, -0.5, 0, 1 },
        { 0.5, -0.5, 1, 1 },
    };
    glBufferData(GL_ARRAY_BUFFER, sizeof bbox, bbox, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glVertexAttribPointer(uniform_color, 4, GL_FLOAT, GL_FALSE, 0, bbox);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Но когда я изменяю на

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, button_image_width, button_image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_rgb);

, я получаю цвет solid вместо image

Ниже представлен фрагментный шейдер

    GLbyte fShaderStr[] =  
       "varying vec2 texpos;                                                \n"
       "uniform sampler2D tex;                                              \n"
       "uniform vec4 color;                                                 \n"
       "void main()                                                         \n"
       "{                                                                   \n"
       "   gl_FragColor = vec4(1, 1, 1, texture2D(tex, texpos).a) * color;  \n"
       "}         

Как нарисовать RGB-текстуру?

1 Ответ

1 голос
/ 09 января 2020

Когда вы делаете

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image_width, image_height,
            0, GL_ALPHA, GL_UNSIGNED_BYTE, image_grayscale);

, результатом является изображение текстуры, только с альфа-каналом. texture2D вернуть 0 для красного, зеленого и синего канала. Альфа-канал возвращает соответствующее значение координате текстуры.
Из-за этого в фрагментном шейдере альфа-канал сэмплера читается следующим образом:
(см. Swizzling )

texture2D(tex, texpos).a

Но когда вы делаете

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, button_image_width, button_image_height,
            0, >GL_RGB, GL_UNSIGNED_BYTE, image_rgb)

Тогда текстурное изображение имеет 3 цветовых канала, но альфа-канал равен 1 для всех текселей.

Вы должны адаптировать фрагментный шейдер для 2-го случая:

gl_FragColor = vec4(texture2D(tex, texpos).rgb, 1.0);

или

gl_FragColor = texture2D(tex, texpos);
...