在我上一篇文章之后,当有人推荐我使用 pBuffers 时,我在 Google 上进行了一些挖掘,发现了一些很酷的示例来使用 pbuffers 进行离屏渲染。nVidia 网站上提供的一些示例进行了简单的离屏渲染,它仅在 pbuffer 上下文中渲染,将像素读取到数组中,然后将 opengl 函数调用到 DrawPixels。
我更改了此示例,以便从读取的像素创建纹理 - 将其渲染到屏幕外,将像素读取到数组,然后使用此颜色位数组初始化纹理。但这对我来说看起来很多余 - 我们渲染图像,我们将它从图形卡内存复制到我们的内存(数组),然后将它复制回图形卡以便在屏幕上显示它,但只是在不同的渲染上下文。我为显示渲染纹理而制作的副本看起来有点愚蠢,所以我尝试了使用 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 函数很简单,它只是渲染一个三角形和一个矩形,应该是离屏渲染的(我希望)。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