Opengl 阴影贴图和标准gl矩阵变量?

Opengl 阴影贴图和标准gl矩阵变量?,opengl,glsl,shader,Opengl,Glsl,Shader,我实际上有两个问题 我正在学习OpenGL,我在互联网上遇到了许多示例,它们将视图矩阵、投影矩阵和模型矩阵或它们的组合传递给着色器。我想知道为什么?因为您已经从gl_模型视图、gl_模型视图投影等中获得了它们。。。那么,将它们作为统一的对象再次传递给着色器有什么用呢 所以不管怎样,我想建立一个阴影贴图,但我不知道该传递给着色器什么来将坐标转换成阴影贴图。我更喜欢使用标准的gl_*矩阵,因为我已经基于它们编写了我的程序。 这是我现在的代码 void FirstPass() { glBind

我实际上有两个问题

我正在学习OpenGL,我在互联网上遇到了许多示例,它们将视图矩阵、投影矩阵和模型矩阵或它们的组合传递给着色器。我想知道为什么?因为您已经从gl_模型视图、gl_模型视图投影等中获得了它们。。。那么,将它们作为统一的对象再次传递给着色器有什么用呢

所以不管怎样,我想建立一个阴影贴图,但我不知道该传递给着色器什么来将坐标转换成阴影贴图。我更喜欢使用标准的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 ();
}

许多着色器变量仍然可以工作,但自从OpenGL3以来就被弃用了。有关现有内置变量的最新列表,请参阅monstrous pdf的第7页。这里甚至不再提到过时的变量。pdf是最新版本的OpenGL,你不应该把它作为初学者,因为你不需要所有的尖端功能。OpenGL 3.2(核心配置文件)在与4.x的兼容性方面非常好,图形供应商提供了支持,作为初学者,您将找到所有需要的功能。请看下面的图片。旧的内置变量仍在3.2中提到,但被标记为已弃用。常用术语现代OpenGL与OpenGL 3.x core profile或更高版本相关。

无关:您使用ARB GLSL扩展和EXT FBO扩展有什么特别的原因吗?这两个扩展都已过时,您应该在OpenGL 2.0+中使用核心GLSL,在OpenGL 3.0+中使用核心FBO。否。你是说glUseProgramObjectARB吗?我认为glUseProgramObjectARB和glUseProgramObject是一样的。那么正确的做法是什么呢?正确的做法是使用
glUseProgram(…)
。当GLSL在OpenGL 2.0中成为核心时,他们重命名了一些函数,并做了许多其他不值得一提的小事情——简单的回答是假装ARB扩展从未存在,并遵循OpenGL 2.0参考页。