我其实有两个问题。
我正在学习 OpenGL,我在互联网上遇到了许多示例,通过视图矩阵、投影矩阵和模型矩阵或它们的组合传递给着色器。我想知道为什么?因为您已经从 gl_modelview、gl_modelviewporjection 等中获得了它们……那么再次将它们作为统一传递给着色器有什么用?
所以无论如何我想构建一个阴影贴图,但我不知道要传递给着色器以将坐标转换为阴影贴图。我更喜欢使用标准 gl_* 矩阵,因为我已经根据它们编写了我的程序。这是我现在拥有的代码。
void FirstPass()
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, shadow_fbo);
glViewport(0,0,shadow_Width,shadow_Height);
glClear(GL_DEPTH_BUFFER_BIT);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
}
void SecondPass()
{
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D,shadow_texmap);
}
void display(void)
{
glUseProgramObjectARB(0);
float myarray[16];
FirstPass();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(light_positionFix[0], light_positionFix[1], light_positionFix[2], 0, 0, 0, 0, 1, 0);
DrawObjects();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
SecondPass();
if (!LightFollowCamera)
glLightfv(GL_LIGHT0, GL_POSITION, light_positionFix);
gluLookAt(eye[0], eye[1], eye[2], lookat[0], lookat[1], lookat[2], 0, 1, 0);
if (LightFollowCamera)
{
light_positionFix[0]=eye[0];
light_positionFix[1]=eye[1];
light_positionFix[2]=eye[2];
}
DrawObjects();
glutSwapBuffers ();
}