我需要将一个OpenGL场景渲染到纹理,然后在着色器中操作该纹理。我已经通过使用Framebuffer Objects解决了这个问题,我认为我现在对它的了解相当不错。在我的效果管道中的许多点上,我需要渲染一个全屏四边形并使用动态渲染纹理对其进行纹理处理,这就是我的问题所在。
这就是我的场景: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是我渲染的纹理,然后传递给着色器。可能会发生什么?
答案 0 :(得分:2)
你的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??
答案 1 :(得分:1)
渲染四边形的代码看起来很好,因此会指出四边形的大小和视口的大小不匹配。
您是否可以在创建渲染纹理时交换宽度和高度?