渲染到纹理,然后在OpenGL中将结果渲染到屏幕

Render to a texture, then render result to screen in OpenGL

本文关键字:屏幕 结果 然后 纹理 OpenGL      更新时间:2023-10-16

我需要将OpenGL场景渲染为纹理,然后在着色器中操纵该纹理。我已经通过使用Framebuffer对象解决了这个问题,我想我现在已经很清楚了。在我的效果管道中的许多点上,我需要渲染一个全屏四边形,并用动态渲染的纹理对其进行纹理处理,这就是我的问题所在

这就是我的场景:https://www.mathematik.uni-marburg.de/~thomak/planet.jpg

我将其渲染为纹理,并将该纹理映射到全屏四边形。但是,生成的图像会以这种方式失真:https://www.mathematik.uni-marburg.de/~thomak/planettexture.jpg

以下是渲染四边形并设置纹理坐标的代码:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2i(0, 0);
glVertex3i(-1, -1, -1);    
glTexCoord2i(0, 1);
glVertex3i( 1, -1, -1); 
glTexCoord2i(1, 1);   
glVertex3i( 1,  1, -1); 
glTexCoord2i(1, 0);   
glVertex3i(-1,  1, -1);
glEnd();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();

着色器代码在这里:

sampler2D BlitSamp = sampler_state
{
  MinFilter = LINEAR;
  MagFilter = LINEAR;
  MipFilter = LINEAR;
  AddressU = Clamp;
  AddressV = Clamp;
};
float4 AlphaClearPS(float2 texcoords : TEXCOORD0) : COLOR
{
  return float4(tex2D(BlitSamp, texcoords).rgb, 1.0f);
}

其中BlitSamp是我渲染到然后传递到着色器的纹理。这里可能发生了什么?

您的tex coords可能已关闭。您的代码,我的评论:

glTexCoord2i(0, 0);     //Bottom-Left
glVertex3i(-1, -1, -1); //Bottom-Left    
glTexCoord2i(0, 1);     //Top-Left
glVertex3i( 1, -1, -1); //Bottom-Right??? 
glTexCoord2i(1, 1);     //Top-Right
glVertex3i( 1,  1, -1); //Top-Right
glTexCoord2i(1, 0);     //Bottom-Right
glVertex3i(-1,  1, -1); //Bottom-Left??

渲染四边形的代码看起来很好,这可能会导致四边形的大小和视口的大小不匹配。

在创建渲染纹理时,是否可能交换了宽度和高度?