2014-02-18 7 views
-1

Я рисую много точек на экране, и я пытаюсь заставить их визуализировать текстуру для последующей обработки, а затем вернуть текстуру обратно на экран. В настоящее время я пытаюсь просто пройти и получить рендеринг текстуры, но, похоже, ничего не делает.OpenGL Render To Texture (To screen) blank

Мой фрагмент шейдерных работ (без рендеринга в текстуру - используется ниже в mEllipseTextureProgram) и единственное изменение, которое я сделал, чтобы включить

out vec3 color; 

воздавать самой текстуры (и, очевидно, изменится цвет = а чем gl_FragColor =). Вторая программа, упоминаемая ниже (mScreenProgram) выглядит следующим образом:

Vertex Shader:

#version 330 compatibility 
    in vec2 vUV; 

    out vec2 UV; 

    void main() 
    { 
     gl_Position = gl_Vertex; 
     UV = vUV; 
    } 

Фрагмент Shader:

#version 330 core 

    in vec2 UV; 

    out vec3 color; 

    uniform sampler2D renderedTexture; 

    void main(){ 
     color = texture(renderedTexture, UV).xyz; 
    } 

Я настроил мои отрисовки в текстуру вещи как это:

glGenFramebuffers(1, &mGaussianFrameBuffer); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mGaussianFrameBuffer); 
    glGenTextures(1, &mGaussianRenderTexture); 
    glBindTexture(GL_TEXTURE_2D, mGaussianRenderTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
         1024, 
         768, 
         0, GL_RGBA, GL_UNSIGNED_BYTE, 
         NULL); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mGaussianRenderTexture, 0); 
    glGenTextures(1, &mGaussianDepthBuffer); 
    glBindTexture(GL_TEXTURE_2D, mGaussianDepthBuffer); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 
         1024, 
         768, 
         0, GL_DEPTH_COMPONENT, GL_FLOAT, 
         NULL); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mGaussianDepthBuffer, 0); 

, который возвращает успех l GL_FRAMEBUFFER_COMPLETE.

Вот три относительно рендеринга функции:

void Draw() 
    { 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     //gluPerspective(45, 1024.0/768.0, 3.0, 20000); 
     perspectiveGL(45, 1024.0/768.0, 1.0, 20000); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glPushMatrix(); 
     gluLookAt(cameraData[0],cameraData[1], cameraData[2], 
        cameraData[3],cameraData[4], cameraData[5], 
        0,1,0); 

     glEnable(GL_DEPTH_TEST); 
     glClearColor(0.2f, 0.2f, 0.9f, 0.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     // OTHER STUFF POTENTIALLY DRAW HERE IN DIFFERENT WAYS 

     glUseProgram(mEllipseTextureProgram); 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mGaussianFrameBuffer); 
     GLuint attachments[1] = {GL_COLOR_ATTACHMENT0}; 
     glDrawBuffers(1, attachments); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     DrawEllipseToTexture(); 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
     glUseProgram(mScreenProgram); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     DrawTextureToScreen(); 
    } 

    void DrawEllipseToTexture() 
    { 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glBindBuffer(GL_ARRAY_BUFFER, mVBO); 
     glVertexPointer(3, GL_FLOAT, 0, 0); 

     glEnable(GL_PROGRAM_POINT_SIZE); 

     glEnable(GL_POINT_SPRITE); 

     glEnable(GL_TEXTURE_2D); 
     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, mBMP); 
     glProgramUniform1i(mEllipseTextureProgram, mTextureLocation, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, mUV); 
     glEnableVertexAttribArray(mTexCoordLocation); 
     glVertexAttribPointer(mTexCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, mSpacial); 
     glEnableVertexAttribArray(mSpacialLocation); 
     glVertexAttribPointer(mSpacialLocation, 1, GL_FLOAT, GL_FALSE, 0, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, mNormals); 
     glEnableVertexAttribArray(mNormalLocation); 
     glVertexAttribPointer(mNormalLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, mVerticalSpat); 
     glEnableVertexAttribArray(mMajorLocation); 
     glVertexAttribPointer(mMajorLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 

     glBindBuffer(GL_ARRAY_BUFFER, mHorizontalSpat); 
     glEnableVertexAttribArray(mMinorLocation); 
     glVertexAttribPointer(mMinorLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 

     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     glEnable(GL_BLEND); 

     glDrawArrays(GL_POINTS, 0, mNumberPoints); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     glDisable(GL_TEXTURE_2D); 
     glDisableVertexAttribArray(mSpacialLocation); 
     glDisable(GL_POINT_SPRITE); 
     glDisable(GL_POINT_SMOOTH); 
     glDisable(GL_PROGRAM_POINT_SIZE); 
     glDisableClientState(GL_VERTEX_ARRAY); 
    } 

    void DrawTextureToScreen() 
    { 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glEnable(GL_TEXTURE_2D); 
     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, mGaussianRenderTexture); 
     glProgramUniform1i(mScreenProgram, mGaussianTextureLocation, 0); 

     GLfloat vertices[] = { -1, -1, 2, 
           1, -1, 2, 
           1, 1, 2, 
           -1, 1, 2 }; 
     GLfloat uv[] = { 0, 0, 
         1, 0, 
         1, 1, 
         0, 1,}; 

     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glEnableVertexAttribArray(mGaussianUV); 
     glVertexAttribPointer(mGaussianUV, 2, GL_FLOAT, GL_FALSE, 0, uv); 

     glDrawArrays(GL_TRIANGLES, 0, 4); 

     glDisable (GL_TEXTURE_2D); 
     glDisableClientState(GL_VERTEX_ARRAY); 
    } 

ответ

-1

Я до сих пор не знаю, что случилось с моим решением выше (к которому я пробовал много вариаций) - но после этого урока получил его работу : Tutorial

0

Обычно я использую `out vec4 color ', я не уверен, будет ли он работать после того, как вы настроите свой тип текстуры GL_RGBA, а затем верните vec3 для каждого фрагмента.

И я не видел, чтобы вы установили glViewport() в свой код, что означает, что нет никакого аффинного преобразования для сопоставления позиции экрана (x, y) с NDC на пространство экрана. Если у вас нет окна просмотра во время рендеринга fbo, это определенно ничего не дает.

Я такой же, как и вы, в подобной ситуации. Прочитайте функции, которые вы не знаете из документации GL, а не в блоге, - это намного лучший способ правильно понять вещи ... :)

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