zoukankan      html  css  js  c++  java
  • 向场景中加入光照

    向场景中加入光照的4个步骤:

    1)为每一个物体的每一个顶点计算法向量,法线确定了物体相对于光源的指向

    法线的计算:设向量a(x1,y1,z1)。向量b(x2,y2,z2)

    a×b=(x2·y3-x3·y2,x3·y1-x1·y3,x1·y2-x2·y1)

    2)创建、选择并定位全部的光源

    光源的创建:

    glLight*()函数能够定义光的一些属性——颜色、位置、方向

    定义光时。此族函数最长用的一种形式是:

    void glLightfv(Glenum light,Glenum pname,TYPE* param)

    此函数中三个參数:所要为其指定属性的光、所要指定的属性、此属性的值

    參数light的值能够是GL_LIGHT0~GL_LIGHT7。指定了要对那个光进行设置

    參数所定义的属性或特性例如以下表所看到的:

    param是一个浮点型数组,比如:

    float ambientLight[]={ 1.0f, 1.0f, 1.0f, 1.0f };

    glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);

    此处定义了一个具有亮白的环境光分量的光源

    注意:在指定一个环境光属性时。同一时候也指定了此光在此场景中所加入的环境光RGBA的强度,

    默认条件下是没有环境光的。其默认值为(0.0f,0.0f,0.0f,1.0f);


    光源的定位:

    光源的位置是以GL_POSITION和一个四个值的矢量(x,y,z,w)来定义的。

    假设w的值为0.0,那么(x,y,z)的值就定义了一个矢量。其指定了光线照过来的方向,

    且全部的光线都是平行的,就好像光源处于无穷远处。

    假设w的值为非零。所定义的就是一个定点光源

    比如:float lightPosition[]={0.0f,0.0f.0.0f,1.0f};

        glLghtfv(GL_LIGHT0,GL_POSITION,lightPosition);

    定义了一个位于世界坐标原点的定点光源。

    而对于光的衰减、光柱的张角、聚光灯的焦点的设置。我们经常使用glLightf()函数

    glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,4.0)//光的衰减

    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,15.0f);//30°光柱张角

    glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10.0F);//指定聚光灯的焦点


    3)创建并选择一种光照模型。

    光照模型定义了环境光,并设置用于光照计算的视点的位置

    OpenGL的光照模型同意设置四个影响场景的因素

    • 场景的环境光强度
    • 视点是否处于无穷远(影响镜面发射光反射角的计算)
    • 单面光照还是双面光照
    • 镜面反射的颜色是否与环境光颜色和反射光颜色分离

    能够使用glLightModel*()函数来定义光照模型

    void glLightModel[if](GLenum pname,TYPE param);

    void glLightModel[if]v(GLenum pname,TYPE param);

    比如:将全局环境光设置为中等亮度的白光

    float ambienLighttModel[]={0.5f,0.5f,0.5f,1.0f};

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLightModel);

    4)为场景中的物体定义材质属性

    实质上与创建光源相似,仅仅是使用的函数不同

    void glMaterialf(GLenum face,GLenum pname,TYPE param);

    void glMaterialfv(GLenum face,GLenum pname,TYPE* param);

    face 的值能够是GL_FRONT,GL_BACK,GL_FRONT_AND_BACK

    pname通知OPENGL要设置材质的哪一属性,下表列出了可能值

    比如:给多边形正、背面材质的环境光颜色设置为红色

    float red[]={1.0f,0.0f,0.0f,1.0f};

    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,red);


    分享一下旋转灯光的小程序:     下载

    程序执行环境:vs2013+OpenGL


    在结束之前。送大家一句话(和大家共勉):

    ——表面繁荣未必是好事,抛开表象看实质才是人生真谛


  • 相关阅读:
    【情人节礼物】纯js脚本打造精美3D玫瑰
    程序员成长系列(一):手里必须有一套自己的框架
    从灌篮高手谈项目团队组成
    【java下午茶】12306的双人票
    从怀孕编程谈公司管理
    程序员的灵光一闪
    【java下午茶系列】java三重奏之封装
    程序员的每周工作40小时之路
    程序员真适合自由的环境吗
    程序员真的需要升职吗?
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7112922.html
Copyright © 2011-2022 走看看