Мой код выглядит следующим образом:Шиндер PingPong OpenGL не работает. Я не могу понять, почему
[... removed, look at new code further down ...]
Остальная часть класса не имеет отношения (я думаю). Шейдер работает, но замена не делает. Я хочу переключить исходную текстуру и rendertarget каждый кадр. Я предполагаю, что ошибаюсь в буфере кадров, но я не могу его точно определить. Есть идеи?
Обновление: Хорошо, я внесла некоторые изменения в код сейчас, и теперь я получаю черный экран. Я рендеринга два квадроцикла, сначала я визуализую между 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]);
}
Кстати, вы используете шейдеры ... 'glEnable (GL_TEXTURE_2D)' ничего не делает в программируемом конвейере. То же самое относится к отключению этого состояния. Если вы не используете обработку фрагментов с фиксированной функцией, это бессмысленно. –