如何在渲染全屏四边形时获取片段着色器中的“查看方向”

时间:2015-10-05 16:11:46

标签: c++ opengl glsl shader fragment-shader

我必须分两步渲染一个场景。首先,我渲染到帧缓冲对象中,然后重复使用FBO的纹理进行下一步。我用这样的全屏四边形渲染纹理,并附上着色器:

glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
   gluLookAt(0.0,0.0,0.0, 0.0,0.0,-10.0, 0.0,1.0,0.0);

   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);

   glBegin(GL_QUADS);
        glTexCoord2f(0.0,0.0);
        glVertex3f(-1.0,-1.0,0.0);
        glTexCoord2f(1.0,0.0);
        glVertex3f(1.0,-1.0,0.0);
        glTexCoord2f(1.0,1.0);
        glVertex3f(1.0,1.0,0.0);
        glTexCoord2f(0.0,1.0);
        glVertex3f(-1.0,1.0,0.0);
   glEnd();

   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();

在附加的片段着色器中,我需要在Eye Space Coords中查看旧场景的实际片段。我的第一个想法是这样的:

vec2 uv = gl_TexCoord[0].st;
vec3 viewDirEye = normalize(vec3(uv.x*2.0-1.0, (uv.y)*2.0-1.0, -1.0));

但似乎没有用,我也不知道为什么。如果有人可以帮助我,那就太好了。

1 个答案:

答案 0 :(得分:1)

您的公式会根据规范化设备坐标中的纹理坐标设置方向矢量,但不会在眼睛空间中设置。

您必须考虑投影矩阵(这将定义视角的水平和垂直视野)。 您可以使用投影矩阵转换为眼睛空间。