在我上一篇文章後,當有人推薦我使用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要麼
我也試過glCopyTexSubImage2D(),也沒有任何反應。謝謝。 – filipehd
爲什麼四邊形的Z座標是0.5f,而不是通常用於Ortho2D投影的0? – Luca
盧卡,我試過不同的值:0,1,-1,它根本沒有任何區別。這只是紋理在最後的四邊形應該在 – filipehd