2012-05-29 259 views
0

在我上一篇文章後,當有人推薦我使用pBuffers時,我在Google上進行了一些挖掘,並發現了一些使用pbuffers進行離屏渲染的很酷的示例。例如,在nVidia的網站上提供的一個簡單的離屏渲染,它只在pbuffer上下文中渲染,將像素讀入數組,然後將opengl函數調用到DrawPixels。OpenGL - PBuffer渲染到紋理

我改變了這個例子,爲了從像素讀取紋理 - 將它渲染到屏幕外,讀取像素到數組,然後用這個彩色位數組初始化紋理。但是這對我來說看起來非常冗餘 - 我們渲染圖像,我們將它從圖形卡內存複製到我們的內存(數組)中,以便稍後將其複製回圖形卡以便在屏幕上顯示它,但只是在不同的屏幕上渲染上下文。它看起來有點愚蠢的副本,我只是爲了顯示渲染的紋理,所以我嘗試了不同的方法使用glCopyTexImage2D(),但不幸的是不工作。我將顯示代碼和解釋:

mypbuffer.Initialize(256, 256, false, false); 

- 虛假值用於共享上下文和共享對象。他們是虛假的原因這個奇妙的圖形卡不支持它。

然後我執行通常的初始化,以啓用混合和GL_TEXTURE_2D。

CreateTexture(); 
    mypbuffer.Activate(); 

     int viewport[4]; 
     glGetIntegerv(GL_VIEWPORT,(int*)viewport); 
     glViewport(0,0,xSize,ySize); 


     DrawScene(hDC); 

     //save data to texture using glCopyTexImage2D 
     glBindTexture(GL_TEXTURE_2D,texture); 

     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
         0,0, xSize, ySize, 0); 
     glClearColor(.0f, 0.5f, 0.5f, 1.0f);    // Set The Clear Color To Medium Blue 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glViewport(viewport[0],viewport[1],viewport[2],viewport[3]); 
     // glBindTexture(GL_TEXTURE_2D,texture); 
     first = false; 
     mypbuffer.Deactivate(); 

- 的drawScene函數功能很簡單,它只是使三角形和矩形,其suposed待屏幕外呈現(希望)。 CreateTexture()創建一個空的紋理。該功能應該可以工作,因爲它是按照我之前描述的方式進行測試的,並且工作正常。

在此之後,在主迴路中,我只是做到以下幾點:

  glClear(GL_COLOR_BUFFER_BIT); 
      glBindTexture(GL_TEXTURE_2D,texture); 

      glRotatef(theta, 0.0f, 0.0f, 0.01f); 
      glBegin(GL_QUADS); 
      //Front Face 
      glTexCoord2f(0.0f, 0.0f); 
      glVertex3f(-0.5, -0.5f, 0.5f); 
      glTexCoord2f(1.0f, 0.0f); 
      glVertex3f(0.5f, -0.5f, 0.5f); 
      glTexCoord2f(1.0f, 1.0f); 
      glVertex3f(0.5f, 0.5f, 0.5f); 
      glTexCoord2f(0.0f, 1.0f); 
      glVertex3f(-0.5f, 0.5f, 0.5f); 
      glEnd(); 
      SwapBuffers(hDC); 

      theta = 0.10f; 
      Sleep (1); 

最終的結果僅僅是一個藍色背景的窗口,沒有得到實際呈現。任何想法爲什麼發生這種情況?我的圖形卡不支持擴展wgl_ARB_render_texture,但調用glCopyTexImage2D()時,這不應該是個問題嗎?

我的卡不支持FBO要麼

+0

我也試過glCopyTexSubImage2D(),也沒有任何反應。謝謝。 – filipehd

+0

爲什麼四邊形的Z座標是0.5f,而不是通常用於Ortho2D投影的0? – Luca

+0

盧卡,我試過不同的值:0,1,-1,它根本沒有任何區別。這只是紋理在最後的四邊形應該在 – filipehd

回答

2

你必須做的是,「連接」你的兩個OpenGL上下文,以便你的PBuffer上下文的紋理也顯示在主渲染上下文中。您需要查找的術語是「顯示列表共享」。在Windows中,您使用wglShareLists追溯地連接上下文,在X11和MacOS X上,您必須提供上下文創建時共享上下文的句柄。

一個完全不同的可能性,並且工作也是在PBuffer上重複使用相同的上下文。這是一個鮮爲人知的事實,您可以使用OpenGL渲染上下文不僅在第一個創建的drawable上,而且在任何可繪製的兼容設置上。因此,如果您的PBuffer與主窗口的像素格式相匹配,您可以從主窗口分離渲染上下文並將其附加到PBuffer。當然,你需要低級訪問主窗口的設備上下文/可繪製,通常隱藏在框架後面。

+0

你好。我會用wglShareLists嘗試你的第一個建議。一旦我做到了,我會在這裏發佈結果。不幸的是,我仍然沒有聲望來升級您的解決方案。 – filipehd

+0

太棒了。它真的與wglShareLists合作!有人請提出他的答案。 – filipehd

0

您應該檢查你的OpenGL實現是否支持幀緩衝區對象:這些對象能夠被渲染目標,他們可以附加紋理顏色緩衝區,確實呈現直接轉換成紋理。

這應該是要走的路,否則你的方法是另一種選擇。

+0

我已經檢查過。它不支持FBO,這就是爲什麼我用pBuffers替代方法。我的方法是替代方法,但不幸的是我無法使其工作。你有什麼想法如何解決它? – filipehd