【问题标题】:OpenGL: What happens if I specify a light as both specular and diffuse?OpenGL:如果我将光指定为镜面反射和漫反射,会发生什么?
【发布时间】:2010-12-02 00:43:57
【问题描述】:

在红皮书的球体照明示例中,我读到了以下内容:

GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

然后它说:

在本例中,前三个调用 到 glLightfv() 是多余的,因为 它们被用来指定 GL_AMBIENT 的默认值, GL_DIFFUSE 和 GL_SPECULAR 参数

据我所知,每个光源都有其环境、漫反射和镜面反射参数的默认值,这三个数组指定了这些默认值,是吗? 是否每个光源默认是漫反射、镜面反射和环境光?

【问题讨论】:

  • BTW- 红皮书有点老了,你可以根据理论来源使用它,但最好不要将它用作 OpenGL 教程。如今,处理照明(除其他外)最好和最简单的方法是使用着色器,这是您应该尽快深入研究的方法。

标签: opengl lighting


【解决方案1】:

在 OpenGL 光照模型中,为一个对象计算了 4 个单独的光照方程:环境光、漫反射、镜面反射和自发光。 Ambient 不考虑法线,Diffuse 和 Specular 考虑,Emission 根本不考虑光。

将所有这些不同的光照值相加得出对象的最终颜色。

【讨论】:

    【解决方案2】:

    是的,这些是 Light0 的默认值:http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml

    【讨论】:

    • +1。另请注意,最好不要依赖默认值。
    • @kos:非常正确 - 如果您想要重现结果,您应该始终明确指定这些内容。
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多