2014-06-22 7 views
1

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

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, &texture); 
     texture = 0; 
    } 
    if(frameBuffer) 
    { 
     glDeleteFramebuffers(1, &frameBuffer); 
     frameBuffer = 0; 
    } 

} 
}; 

void generateRenderToTexture(GLint internalformat, GLenum format, GLenum type, 
            TextureBuffer &tb, int w, int h, bool linearInterp) 
{ 
    glGenTextures(1, &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, &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. У кого-нибудь есть какие-то полезные предложения для решения этой проблемы?

+0

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

+0

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

+0

Не действует и в ES 2.0. –

ответ

4

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

  • GL_RGBA4
  • GL_RGB5_A1
  • GL_RGB565

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

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

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

+0

thx для вашего детального ответа. Я все еще не могу его решить, так как я должен использовать OpenGL ES2.0. – user3500496

1

Вы используете функции FBO без расширения, которые были введены только с OpenGL-3. Таким образом, в отличие от функций расширения FBO (заканчивающихся ARB) эти функции доступны только с контекстом OpenGL-3. В OpenGL-3 внутренние текстуры GL_LUMINANCE и GL_ALPHA устарели, недоступны в основном профиле. Они были заменены форматом текстуры 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. –

+0

@RetoKoradi: Спасибо. Я полностью забыл об этом. – datenwolf

0

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