首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于glteximage2d使用gl_luminance的困惑

关于glteximage2d使用gl_luminance的困惑
EN

Stack Overflow用户
提问于 2014-06-22 04:37:21
回答 3查看 3.2K关注 0票数 2

我在使用gl_luminance定义FBO时遇到了一些问题。这是我用的代码,

代码语言:javascript
复制
 generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

相关代码如下,

代码语言:javascript
复制
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;
}

问题是当我用,

代码语言:javascript
复制
generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

密码执行得很好。但如果改用gl_luminance,

代码语言:javascript
复制
generateRenderToTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE,  _maskTexture,  _imageWidthOriginal, 

我不知道为什么我不能使用GL_LUMINANCE来定义FBO。有人有什么有用的建议来解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-22 13:58:00

在ES 2.0中保证作为彩色FBO附件工作的唯一格式是,根据规范文档中的表4.5:

  • GL_RGBA4
  • GL_RGB5_A1
  • GL_RGB565

标准不要求对GL_RGBA的呈现提供支持,这对您是有效的。不过,许多实现都支持它。rgba8扩展将对GL_RGB8GL_RGBA8格式的支持添加为呈现目标。

标准不支持GL_LUMINANCE作为一种颜色可渲染格式,我也找不到它的扩展。可能有些实现可以支持它,但是您肯定不能指望它。

ES3.0将GL_R8作为一种可着色的格式列出.在ES3.0中,RED/R格式取代了ES2.0中的LUMINANCE/ALPHA格式。因此,如果您可以移动到ES 3.0,您可以支持呈现为1组件的纹理格式。

票数 5
EN

Stack Overflow用户

发布于 2014-06-22 11:10:46

您使用的是非扩展的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
EN

Stack Overflow用户

发布于 2014-06-24 07:07:47

我已经通过使用GL_RG_EXT或GL_RED_EXT来解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24348170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档