我实际上有两个问题。
我正在学习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 ();
}
答案 0 :(得分:0)
许多这些着色器变量仍然有效,但自OpenGL 3以来已弃用。有关现有内置变量的最新列表,请查看this monstrous pdf的第7页。过时的变量甚至都没有被提及。 pdf是最新版本的OpenGL,你不应该以初学者为目标,因为你不需要所有的尖端功能。 OpenGL 3.2(核心配置文件)在与4.x的兼容性方面完全没有问题,图形供应商提供支持,您将找到初学者所需的所有功能。看看quick reference card。旧的内置变量仍然在3.2中提到,但被标记为已弃用。经常使用的术语现代OpenGL 与OpenGL 3.x核心简介或更高版本有关。