OpenGL PingPong着色器不起作用。我不明白为什么

时间:2014-02-16 22:13:57

标签: opengl glsl shader

我的代码如下所示:

[... removed, look at new code further down ...]

课程的其余部分不相关(我认为)。着色器正在工作,但交换没​​有。我想切换源纹理并每帧渲染一次。 我想我在使用帧缓冲区时犯了一些错误,但我无法确定它。有什么想法吗?

更新:好的我现在对代码进行了一些更改,现在我得到了一个黑屏。 我正在渲染两个四边形,首先我在Start()和End()之间渲染,然后我调用BindTexture并渲染到屏幕。 (至少那是我正在尝试的)

void PingPongShader::Init(int width, int height, const char* vertexShaderName, const char* fragmentShaderName)
{
    glEnable(GL_TEXTURE_2D);
    began = false;
    GLuint frameBuffer;
    this->width = width;
    this->height = height;
    textures = new GLuint[2];
    textures[0] = GenerateTexture();
    textures[1] = GenerateTexture();
    current = 0;
    shader = LoadShader(vertexShaderName, fragmentShaderName);
    glDisable(GL_TEXTURE_2D);
}
void PingPongShader::Start()
{
    if(!began)
    {
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, textures[abs(current-1)]);
        //buffer
        glGenFramebuffers(1, &frameBuffer);
        GLenum drawBuffers[1] = {GL_COLOR_ATTACHMENT0};
        glDrawBuffers(1, drawBuffers);
        glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[current], 0);

        glUseProgram(shader);
        if(paramCallback != NULL)
            paramCallback(shader);
        began = true;
    }
    else
    {
        printf("Could not call Start(). Did you forget to call End() ?");
    }
}
void PingPongShader::End()
{
    if(began)
    {

        glUseProgram(0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glDisable(GL_TEXTURE_2D);
        current = abs(current-1);
        began = false;
    }
    else
    {
        printf("Could not call End(). Did you forget to call Start() ?");
    }
}
void PingPongShader::BindCurrentTexture()
{
    glBindTexture(GL_TEXTURE_2D, textures[current]);
}

1 个答案:

答案 0 :(得分:1)

看起来您可能会混淆纹理单位和纹理名称。纹理单位对应着色器代码中的采样器变量,范围从0到GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS减去1。您可以选择一个图像单元(例如0)并将该值设置为着色器统一变量。这也是您在使用纹理名称(代码中的glActiveTextureglBindTexture变量调用a之前传递给b的值)。