2014-02-18 126 views
-1

我正在繪製很多點到屏幕,我試圖讓它們渲染到紋理進行後處理,然後將紋理渲染回屏幕。目前我試圖通過並獲得紋理渲染,但它似乎沒有渲染。OpenGL渲染到紋理(到屏幕)空白

我的片段着色器作品(無紋理渲染 - 在mEllipseTextureProgram波紋管使用)和我所做的唯一的變化是包括

out vec3 color; 

渲染到紋理本身(而明顯改變顏色=相當比gl_FragColor =)。下面(mScreenProgram)引用的第二個程序如下:

頂點着色器:

#version 330 compatibility 
    in vec2 vUV; 

    out vec2 UV; 

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

片段着色器:

#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文檔而不是博客閱讀您不知道的功能是正確理解事情的更好方法... :)