2014-02-16 3 views
-1

Мой код выглядит следующим образом:Шиндер 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]); 
} 
+0

Кстати, вы используете шейдеры ... 'glEnable (GL_TEXTURE_2D)' ничего не делает в программируемом конвейере. То же самое относится к отключению этого состояния. Если вы не используете обработку фрагментов с фиксированной функцией, это бессмысленно. –

ответ

1

Похоже, что вы могли бы быть запутанной текстуре единиц и текстуры имен. Текстурные единицы соответствуют переменным сэмплера в вашем шейдерном коде и варьируются от 0 до GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS минус один. Вы можете выбрать единицу изображения (скажем 0) и установить это значение для равномерной переменной шейдера. Это также значение, которое вы передали бы glActiveTexture, прежде чем звонить glBindTexture с текстурой имя (a и b переменных в вашем коде).

+0

Да, я это понял. Я внес несколько изменений в код, но он все еще не работает. – pixartist

Смежные вопросы