Notes for OpenGL - 4

今天开始在程序里面添加按键响应(Ketboard)以及灯光(light)。

先从灯光开始。灯光分为两种,一种叫环境光(这个我的翻译,原词是ambient light)。环境光顾名思义是说这并不是从特定的一个方向照射过来的光,在这种光下,我们的图形将没有阴影。(这里错了,其实环境光不是没有阴影,如果希望没有阴影的话,就不需要再“开灯”了。环境光是指所有的物体都将被这个光照射到)

而另一种光叫漫射光(diffuse light),这种就是正常的单方向的光,我们的图形将只有被照到的面会反射光亮,没有照射到的地方将会变暗。(这里也错了,并不是说只有被照到的菜会反光,只是直接照到的会更加亮一些,而没有直接照射到的将会比较暗淡)

glLightfv是我们所用的函数。函数原型是

void glLightfv(GLenum light, GLenum pname, const GLfloat *params)

第一个参数是指定一个灯,灯的数量是由执行情况而定的,但是至少能有8个。我们可以用GL_LIGHTx(0 <= x < GL_MAX_LIGHTS)来指定我们所要使用的灯。

第二个参数指定了单值的灯的光源参数,我们可以使用常量GL_AMBIENTGL_DIFFUSEGL_SPECULAR,GL_POSITIONGL_SPOT_DIRECTIONGL_SPOT_EXPONENTGL_SPOT_CUTOFF,GL_CONSTANT_ATTENUATIONGL_LINEAR_ATTENUATIONGL_QUADRATIC_ATTENUATION。

第三个参数是传入一个关于我们设置的光源参数数组的指针。

光源参数的四个参数其实跟颜色是一样的,前三个表示RGB,第四个是alpha值。如果参数是(1.0f, 0.0f, 0.0f, 1.0f)的话,说明照射过来的光是红色的。

然后还要注意的是我们的光是需要一个光源方向的,这个方向还是由glLightfv来确定,只需将第二个参数改成GL_POSITION即可。第三个参数也是参数数组。数组内的前三个参数跟glTranslatef的三个参数一样,是确定位置的。

我并不确定最后一个参数(这将在以后慢慢补充),现有的测试是,为1.0的时候光源似乎没有太过明显的阴影,而为0.0的时候,当我把光源远离物体的时候将会出现非常明显的阴影。而且这个参数的值越大,阴影越不明显。

 

注意,在使用光照之前,我们务必要先glEnable(GL_LIGHTx)来允许我们设置的灯可以使用,然后要用glEnable(GL_LIGHTING)来开始光照(一开始我并没有加入这句话,结果可想而知,大量时间浪费在找原因上面了...纠结...)。

 

最后是关于一些控制的问题了。其实这部分很简单,在没有做之前我一直以为会有些复杂,其实所有对于图形的控制,只是在更改glTranslatef 里的角度,当角度修改了以后,更新GL就可以完成我们所希望的改动。消息获取么,在QT中直接用mouseMoveEvent、mousePressEvent 还有keyPressEvent 就可以了。

 

 

接下来是关于混合(blending)的几个函数。混合在我现在的理解下(虽说是“理解”,但是其实我对混合并不是非常熟悉)仅仅是颜色、纹理的透明,alpha参数便是透明度。

打开混合需要glEnable(GL_BLEND)来启动,然后调用glBlendFunc(GL_SRC_ALPHA,GL_ONE) 来实现我们的透明效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值