• OpenGL学习笔记(12)基本光照


    比较这两个球

    image

    在现实生活中,比如一个表面是白色的球体,假设背景是黑色,然后没有任何灯光的照射那么就如右侧的圆一般,但这在有点不可能.现实中我们看到的都是左侧这样带有光照的球体,所以右侧的形状只能是几何体,无法模拟真实世界的球体.

    下面我们来看一下一些基本的概念

    首先定一个白色的球体

    如下图

    image

    注意这是一个球体,但背面也是白色的,你看不到.

    启用光照功能

    依然是glEnable函数,参数是GL_LIGHTING

    现在的效果

    image

    到这一步不行,还要为球体增加光源

    创建光源

    要使用光源必须先启用光源,使用glEnable函数启用GL_LIGHT0-7的光源,所以一共可以启用8个光源.

    glLight方法用于创建光源,其可以设置与光相关的一些参数,如下

    image

    如设置光源位置

    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    现在效果如下

    image

    感觉好多了

    创建多光源

    即设置多个光源,真实世界中往往会有很多的光源.即启用了多个光源

    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
     GLfloat light1_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     GLfloat light1_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat light1_specular[] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat light1_position[] = { -2.0, 2.0, 1.0, 1.0 };
     GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
     glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
     glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
     glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
     glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5);
     glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5);
     glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2);
     glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
     glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
     glEnable(GL_LIGHT1);

    如上启用了GL_LIGHT0和GL_LIGHT1,其两个默认值并不相同

    材质(glMaterial)

    阳光照到一块木板上和照到一个金属上的反应是不一样的,金属表面则会出现光泽,所以说不同材质的物体,产生光照的效果则会不同,以下是定义了材质以后效果,出现了一些光泽

    image

    face can be GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK to indicate to which faces of the object the material should be applied
    可以定义材质(正反面)以下的一些特性

    image

    光照模型(glLightModel)

    4个点

    • The global ambient light intensity
    • Whether the viewpoint position is local to the scene or should be considered to be an infinite distance away
    • Whether lighting calculations should be performed differently for both the front and back faces of objects
    • Whether the specular color should be separated from ambient and diffuse colors and applied after the texturing operation

    只能先基本有个概念了,先看得懂api在干嘛

  • 相关阅读:
    android studio 模拟器控制台发送短信和定位
    android获取超级权限
    android拦截获取别人发送过来的短信
    stackflow看到的获取手机联系人 contact 的代码
    surfaceview绘制矩形 drawRect
    Dialog自定义setView按钮点击没反应
    腾讯移动端性能测试利器PerfDog使用
    Mac下第一个Python程序:HelloWorld
    Mac 系统下安装 PyCharm 的实践
    如何用Chrome浏览器打开Axure原型的start.html文件
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1861928.html
Copyright © 2020-2023  润新知