Загадки о glteximage2d с использованием gl_luminance

#opengl-es #opengl-es-2.0 #glteximage2d

#opengl-es #opengl-es-2.0 #glteximage2d

Вопрос:

Я столкнулся с некоторой проблемой при использовании gl_luminance для определения FBO. Вот код, который я использовал,

  generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);
  

связанный код выглядит следующим образом,

 TextureBuffer _maskTexture;

class TextureBuffer {
public:
GLuint texture;
GLuint frameBuffer;
GLenum internalformat;
GLenum format;
GLenum type;
int    w,h;

TextureBuffer() : texture(0), frameBuffer(0) {}
void release() 
{
    if(texture)
    {
        glDeleteTextures(1, amp;texture);
        texture = 0;
    }
    if(frameBuffer)
    {
        glDeleteFramebuffers(1, amp;frameBuffer);
        frameBuffer = 0;
    }

}
};

void generateRenderToTexture(GLint internalformat, GLenum format, GLenum type,
                                     TextureBuffer amp;tb, int w, int h, bool linearInterp)
{
    glGenTextures(1, amp;tb.texture);
    glBindTexture(GL_TEXTURE_2D, tb.texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, NULL);

    glGenFramebuffers(1, amp;tb.frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, tb.frameBuffer);
    glClear(_glClearBits);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.texture, 0);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status != GL_FRAMEBUFFER_COMPLETE)
        printf("Framebuffer status: %x", (int)status);

    tb.internalformat = internalformat;
    tb.format = format;
    tb.type = type;
    tb.w = w;
    tb.h = h;
}
  

Вопрос в том, когда я использую,

 generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);
  

Код прошел хорошо. Но если вместо этого использовать gl_luminance,

 generateRenderToTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE,  _maskTexture,  _imageWidthOriginal, 
  

Я не знаю, почему я не мог использовать GL_LUMINANCE для определения FBO. У кого-нибудь есть полезные предложения по решению этой проблемы?

Комментарии:

1. Ваша самая большая проблема здесь в том, что GL_LUMINANCE это не формат, отображаемый цветом. Да, он устарел в GL 3, но если у вас нет основного профиля, это не будет иметь значения. Вы все еще можете выполнять перенос пикселей в этом формате (например glReadPixels (...) ) и использовать его для внутреннего хранения текстур, но то, что вы не можете сделать даже в профиле совместимости, — это использовать его как вложение FBO.

2. Большое спасибо за вашу помощь. Я использую OpenGL ES2.0, а не OpenGL 3. почему это все еще происходит?

3. Это также недопустимо в ES 2.0.

4. Спасибо. Но если я настаиваю на использовании GL_LUMINANCE, есть ли какое-то решение для OpenGL ES2.0?

5. Нет, нет. Вам нужна текстура, чтобы выполнить то, что GL_LUMINANCE раньше. Так что, если вы не используете шейдер и подобный формат GL_R8 , вам не повезло.

Ответ №1:

Единственными форматами, которые гарантированно будут работать как цветные вложения FBO в ES 2.0, являются, согласно таблице 4.5 в документе спецификации:

  • GL_RGBA4
  • GL_RGB5_A1
  • GL_RGB565

Поддержка рендеринга в GL_RGBA, которая работает для вас, не требуется стандартом. Однако многие реализации поддерживают это. Расширение OES_rgb8_rgba8 добавляет поддержку GL_RGB8 и GL_RGBA8 форматирование в качестве целей рендеринга.

GL_LUMINANCE стандарт не поддерживается как формат с возможностью цветопередачи, и я также не могу найти для него расширение. Вполне возможно, что некоторые реализации могли бы поддерживать это, но вы, конечно, не можете на это рассчитывать.

ES 3.0 выводит список GL_R8 в виде цветопередаваемого формата. В ES 3.0 RED / R formats заменяет LUMINANCE / ALPHA formats из ES 2.0. Так что, если вы можете перейти на ES 3.0, у вас есть поддержка рендеринга в 1-компонентные форматы текстур.

Комментарии:

1. спасибо за ваш подробный ответ. Я все еще не могу ее решить, так как мне приходится использовать OpenGL ES2.0.

Ответ №2:

Вы используете функции FBO без расширения, которые были введены только с OpenGL-3. Таким образом, в отличие от функций расширения FBO (заканчивающихся на ARB ), эти функции доступны только в контексте OpenGL-3. В OpenGL-3 внутренние форматы текстур GL_LUMINANCE и GL_ALPHA устарели, недоступны в профиле core. Они были заменены форматом текстуры GL_RED. Вы можете использовать соответствующим образом написанные параметры шейдера или текстуры, чтобы заставить текстуру GL_RED работать так же, как GL_LUMINANCE (swizzle dst.rgb = texture.r ) или GL_ALPHA (swizzle dst.a = texture.r ).

Комментарии:

1. Обратите внимание на тег opengl-es-2.0 . ES 2.0 поддерживает FBO и не имеет GL_RED форматов или текстур swizzle.

2. @RetoKoradi: Спасибо. Я совершенно упустил это из виду.

Ответ №3:

Вместо этого я решил использовать GL_RG_EXT или GL_RED_EXT.