在我上一篇文章之后,当有人建议我使用pBuffers时,我在谷歌上挖掘了一些,我发现了一些使用pbuffers进行Offscreen Rendering的很酷的例子。在nVidia网站上提供的一些示例可以进行简单的屏幕外渲染,只需在pbuffer上下文中渲染,将像素读入数组,然后将opengl函数调用为DrawPixels。
我改变了这个例子,为了从读取的像素创建纹理 - 在屏幕外渲染它,将像素读取到数组,然后用这个colorbit数组初始化纹理。但这对我来说看起来非常多余 - 我们渲染图像,我们将它从图形卡存储器复制到我们的存储器(阵列)中,然后将其复制回图形卡以便在屏幕上显示,但只是在不同的渲染上下文。它看起来有点愚蠢我正在制作的副本只是为了显示渲染的纹理,所以我尝试了使用glCopyTexImage2D()的不同方法,遗憾的是它不起作用。我将展示代码和解释:
mypbuffer.Initialize(256, 256, false, false);
- 错误值适用于共享上下文和共享对象。它们是错误的,因为这个梦幻般的图形卡不支持它。
然后我执行常规初始化,启用Blending和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函数非常简单,它只是渲染一个三角形和一个矩形,它可以在屏幕外渲染(I HOPE)。 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 :(得分:2)
你必须做的是,将你的两个OpenGL上下文“连接”起来,这样你的PBuffer上下文的纹理也会显示在主渲染上下文中。您需要查找的术语是“显示列表共享”。在Windows中,使用wglShareLists
追溯连接上下文,在X11和MacOS X上,您必须提供要在创建上下文时共享的上下文句柄。
一种完全不同的可能性,同样也可以在PBuffer上重复使用相同的上下文。这是一个鲜为人知的事实,你可以使用OpenGL渲染上下文,不仅可以使用它首先创建的drawable,还可以使用兼容设置的任何drawable。因此,如果您的PBuffer与主窗口的像素格式匹配,您可以从主窗口中分离渲染上下文并将其附加到PBuffer。当然,您需要对主窗口的设备上下文/ drawable进行低级访问,这通常隐藏在框架后面。
答案 1 :(得分:0)
您应该检查您的OpenGL实现是否支持帧缓冲对象:这些对象可以是渲染目标,并且它们可以将附加纹理作为颜色缓冲区,实际上直接渲染到纹理中。
这应该是要走的路,否则你的方法就是另类。