0

我其实有两个问题。

我正在学习 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 ();
}
4

1 回答 1

0

许多这些着色器变量仍然有效,但自 OpenGL 3 以来已被弃用。有关现有内置变量的最新列表,请查看这个可怕的 pdf 的第 7 页。那里甚至不再提到过时的变量。该 pdf 适用于最新版本的 OpenGL,您不应该将其作为初学者的目标,因为您不需要所有尖端功能。OpenGL 3.2(核心配置文件)在与 4.x 的兼容性、图形供应商的支持方面非常出色,您会发现作为初学者所需的所有功能。看看快速参考卡。旧的内置变量在 3.2 中仍然被提及,但被标记为已弃用。经常使用的术语现代 OpenGL与 OpenGL 3.x 核心配置文件或更高版本有关。

于 2013-10-30T23:32:30.880 回答