【问题标题】:Regarding Multisampling of textures关于纹理的多重采样
【发布时间】:2013-01-02 19:26:07
【问题描述】:

我在非默认 FBO 中渲染具有绿色背景的白色立方体,并将创建的多重采样纹理附加到此 FBO。 当我使用上述纹理在默认 FBO 中渲染立方体时,它会破坏纹理。

这是我的代码:

viewport_width=32;
viewport_height=32;
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureId);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindTexture(*target, textureId);"));     

        glUniform1i(glGetUniformLocation(shader_data.psId,"tk_diffuseMap"), 0);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glUniform1i(glGetUniformLocation(shader_data.psId,\"basetexture\"), 0);"));

        glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4 ,GL_RGBA, viewport_width, viewport_height ,true);  
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4 ,GL_RGBA, 32, 32,true);"));       

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Fboid);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindFramebuffer(GL_FRAMEBUFFER, Fboid);"));

        glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureId,0);    
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,textureId,0);"));

        glEnable(GL_MULTISAMPLE);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glEnable(GL_MULTISAMPLE);"));

        draw_cube(viewport_width, viewport_height);

                glBindFramebuffer(GL_FRAMEBUFFER, 0);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindFramebuffer(GL_FRAMEBUFFER, Fboid);"));

        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureId);
        nResult |= GL_ERROR_CHECK((GL_NO_ERROR, "glBindTexture(*target, textureId);"));     

                glDrawElements ( GL_TRIANGLES, 36,GL_UNSIGNED_INT, indices );

片段着色器:

uniform sampler2DMS tk_diffuseMap;
in vec3 ps_texCoord;
out vec4 fragColor;

void main(void)
{

    vec2 iTmp = textureSize(tk_diffuseMap);
    vec2 tmp = iTmp * ps_texCoord.xy;

    vec4 color;
    for(int i = 0; i < 4; ++i)
    {
        color = color + texelFetch(tk_diffuseMap, ivec2(tmp), i);
    }

fragColor=vec4(color/4);
}

让我知道我哪里出错了。

【问题讨论】:

    标签: opengl textures fragment-shader multisampling


    【解决方案1】:

    用作 FBO 的渲染目标附件的纹理不得绑定为采样源,如果它附加到的 FBO 也被绑定为渲染目标。要么绑定纹理,要么绑定 FBO。

    很明显为什么会出现这种情况:如果您可以绑定一个同时也是渲染目标的纹理,您将创建一个循环依赖循环。

    【讨论】:

    • 我该如何解决这个问题?因为如果我想在上面的代码中使用不同的 FBO,那么我需要将它绑定到另一个纹理等等。有没有其他选择?
    • @Roshan:在循环排列中使用 2 个纹理。
    • 您能否给出一些步骤来解释要绑定哪个 FBO 以及要对哪个纹理进行采样?
    • @Roshan:我建议你在尝试实现反馈循环之前先了解常规的 FBO 渲染到纹理(这就是你想要做的)。我有一个最小的 FBO 示例托管在 github.com/datenwolf/codesamples/tree/master/samples/OpenGL/…
    • 看到你的代码,我想我在这里正确地使用了渲染到纹理的概念。我正在调用 glTexImage2DMultisample 而不是 glTexImage2D 因为我想在这里使用多重采样并假设纹理数据将来自非默认 FBO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多