在openGL中看不到光照

时间:2016-09-02 06:57:13

标签: opengl

我是openGL的新手,我画了一个立方体,然后我把一个相机放在了立方体内。 我现在想要实现的是点亮立方体。 这就是我尝试的方式:

void draw(GLFWwindow* window)
{
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    // Create light components
    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
    GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
    GLfloat position[] = { -1.5f, 1.0f, -1.0f, 1.0f };

    // Assign created components to GL_LIGHT0
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
    glLightfv(GL_LIGHT0, GL_POSITION, position);

    int width, height;
    glfwGetFramebufferSize(window, &width, &height);

    glViewport(0, 0, width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glm::mat4 projection = glm::perspective(PI / 4, 1.f / 1.f, 1.0f, 10.0f);
    glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, -1.3f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
    glm::mat4 model = glm::rotate(glm::mat4(1.f), PI, glm::vec3(0.0f, 1.0f, 0.0f));
....
....
}

但我没有看到任何照明

1 个答案:

答案 0 :(得分:3)

  

但我没有看到任何照明

欢迎来到旧的固定功能管道的世界。你像20年前一样使用OpenGL。您正在使用的照明模式是仅在顶点位置进行光照计算,然后简单地将结果颜色混合在三角形(或四边形)上。显然,如果在一个三角形的跨度上发生很多光照变化,那么它将无法工作。

在您的情况下,光源非常接近您的立方体,因此无法正常工作。您应该通过抛弃固定功能管道(FFP)并使用着色器来解决此问题。严重的是,FFP已经过时了大约13年(2003年首批推出GLSL的GPU上市)。自那以后,FFP一直使用现场创建的着色器进行模拟。

另外(根据您绘制立方体的其他问题判断),您不能提供面部法线。法线对于进行光照计算至关重要,因此您也必须提供这些。