opengl--重新开始--05 颜色和光照

四 颜色


片断:一个具有相关颜色值、z值和纹理坐标值的栅格方块
指定着色模式:
void glShaderModel(GLenum mode)
mode:GL_SMOOTH--平滑着色模型下,每个顶点都是单独进行处理的。将是多个顶点的颜色的均匀差值
     GL_FLAT:单调着色模型


在颜色索引模式下,相邻的像素可以引用颜色索引中的不同位置,因此他们的颜色可能并不相似,会显得光怪陆离
为了避免这个问题,必须创建一个颜色索引表,其中相邻的索引值颜色应该是平滑的 


五 光照
神奇的开始---光照 开始3D的视角
1)为每个物理的每个顶点定义法线向量


2)创建定位和启用光源
光源属性:颜色 位置和方向
void glLight{if}(GLenum light,GLenum pname,Type param);
void glLight{if}v(GLenum light,GLenum pname,Type *param)
light:GL_LIGHT0.。。。GL_LIGHT7,
pname: 
   GL_AMBIENT 光的环境强度 (0.0,0.0,0.0,1.0)
   GL_DIFFUSE 光的散射强度(light0的默认值为白色,其他为黑色) (1.0,1.0,1.0,1.0)或(0.0,0.0,0.0,1.0)
   GL_SPECULAR 光的镜面强度(light0的默认值为白色,其他为黑色) (1.0,1.0,1.0,1.0)或(0.0,0.0,0.0,1.0)
   GL_POSITION 光源的位置 (0.0,0.0,1.0,0.0)
   GL_SPOT_DIRECTION 聚光灯方向 (0.0,0.0,-1.0)
   GL_SPOT_EXPONENT 聚光指数 0.0
   GL_SPOT_CUTOFF 聚光灯的切角 180.0
   GL_CONSTANT_ATTENUATION 常量衰减因子 1.0
   GL_LINEAR_ATTENUATION 线性衰减因子 0.0
   GL_QUADRATIC_ATTENUATION 二次衰减因子 0.0
颜色 opengl允许把与颜色相关的3个不同参数(GL_AMBIENT/GL_DIFFUSE/GL_SPECULAR)与任何特定的光源相关联
   GL_AMBIENT参数表示一个特定的光源在场景中所添加的环境光的RGBA强度 默认情况下是不存在环境光的
位置和衰减: 位置postion 如果W的值=0 就是方向性光源 如果是1就是位置性光源
   衰减因子 = 1/(kc+kld+kqd*d) kc:GL_CONSTANT_ATTENUATION  kl:GL_LINEAR_ATTENUATION  kq:GL_QUADRATIC_ATTENUATION  d:光源与顶点的距离
计算决定可能会影响性能
多光源: 至少可以在场景中指定8个光源表示8个光源的常量是GL_LIGHT0 GL_LIGHT1...

3)选择光照模型
  ·全局环境光强度
  ·观察点的位置是位于场景还是位于无限远处:影响镜面反射所产生的两点的计算
  ·物体的正面和背面是否应该执行不同的光照计算
  ·镜面颜色是否应该从环境和散射颜色中分离出来并在纹理操作之后再应用

void glLightMode{if}(GLenum pname, TYPE param)
void glLightMode{if}v(GLenum pname, TYPE *param)
设置光照模型的属性,被设置的关照模型的特征有param定义
为场景的物体定义材料属性
GL_LIGHT_MODEL_AMBIENT (0.2,0.2,0.2,1.0) 整个场景的环境光的RGBA强度
GL_LIGHT_MODEL_LOCAL_VIEWER 0.0或GL_FALSE 镜面反射角度是如何计算的
GL_LIGHT_MODEL_TWO_SIDE 0.0或GL_FALSE 指定了是单面还是双面光照
GL_LIGHT_MODEL_COLOR_CONTROL GL_SINGLE_COLOR 镜面颜色的计算是否从环境和散射颜色中分离出来


启动光照
glEnable(GL_LIGETING)
还需要显示地启用每个光源: glEnable(GL_LIGHT0)


定义材料属性
 void glMaterial{if}(GLenum face, GLenum pname, TYPE param)
 void glMaterial{if}v(GLenum face, GLenum pname, const TYPE *param)
指定一种用于光照计算的当前材料属性
  face:GL_FRONT GL_BACK GL_FRONT_AND_BACK:表示物体的哪些面应该接受光照
  pname:表示设置的特定材料属性
  GL_AMBIENT  (0.2,0.2,0.2,1.0) 材料的环境颜色
  GL_DIFFUSE   (0.8,0.8,0.8,1.0)材料的散射颜色
  GL_AMBIENT_AND_DIFFUSE          材料的环境和散射颜色  通常情况下散射和环境颜色是相同的
  GL_SPECULAR   (0.0,0.0,0.0,1.0) 材料的镜面颜色
  GL_SHININESS 0.0                镜面指数
  GL_EMISSION    (0.0,0.0,0.0,1.0)材料的发射颜色:物体自身发光:模拟台灯或其他光源用这个特性
  GL_COLOR_INDEXES (0,1,1)        环境、散射和镜面颜色索引


更改材料属性 
 需要一定开销 所以提供另外一种方法
void glColorMaterial(GLenum face ,GLenum mode)
  使表面face的材料属性总是使用当前颜色
要先调用 glEnable(GL_COLOR_MATERIAL)


glColorMaterial(GL_FRONT, GL_DIFFUSE)
glColor3f(0.2,0.5,0.8) -- glcolor修改 diffuse的值
对于场景中的大多数顶点,如果想要更改单个材料参数的值 可以使用glColorMaterial 
如果想修改多个材料参数的值,可以使用glMateral*()
****不使用时,确保记得禁用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值