我的代码如下所示:
[... 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]);
}
答案 0 :(得分:1)
看起来您可能会混淆纹理单位和纹理名称。纹理单位对应着色器代码中的采样器变量,范围从0到GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
减去1。您可以选择一个图像单元(例如0)并将该值设置为着色器统一变量。这也是您在使用纹理名称(代码中的glActiveTexture
和glBindTexture
变量调用a
之前传递给b
的值)。