1

デフォルト以外の 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);
}

どこが間違っているのか教えてください。

4

1 に答える 1

3

FBO のレンダー ターゲット アタッチメントとして使用されるテクスチャは、それがアタッチされている FBO がレンダリング ターゲットとしてもバインドされている場合、サンプリング ソースとしてバインドしてはなりません。テクスチャがバインドされているか、FBO がバインドされています。

なぜそうなのかは明らかです。レンダー ターゲットでもあるテクスチャをバインドできるとしたら、依存関係の循環ループが作成されます。

于 2013-01-02T10:28:30.543 に答える