在上一节C# SharpGL-Light光源讲了我们身边的几个实际场景与OpenGL一些参数对应关系,其中讲到了反射光的颜色:
4、反射的光颜色:我们之所以能够看到不发光的物体,是因为这些不发光的物体能够反射照射在该物体上的光,反射出来的光的颜色=照射在物体上的光的颜色+物体本身的颜色。太阳光是白色,照射在一个红色的物体上,我们人眼看到的物体就是红色的。若光源颜色改为绿色,照射在红色物体上,我们人眼看到的物体颜色是黄色的。注意:物体本身的颜色对应到OpenGL中就是材质参数。
在此,详细说明一下OpenGL中的材质应用。
实际生活中,不同的材质物体,呈现的颜色不一样,OpenGL中材质的定义其实就是该物体的颜色。实际呈现出来的物体颜色,应该是光源颜色和物体颜色的叠加。
材质函数:Material(uint face, uint pname, float[] parameters)
其中:
face:指定材质属性将应用于物体的那个面。
GL_FRONT 正面
GL_BACK 背面
GL_FRONT_AND_BACK 双面
pname:指定设置材质那个属性,与光源设定LightParameter相似:
parameters:对应属性设定的值。
重点说明一下镜面指数属性:
GL_SHININESS:该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。
上程序,看下实际效果,仿照网上的范例和Light光源的例子,做一个地球绕太阳旋转的模型出来。
1、设定太阳光
float[] sun_light_position = {
0f, 0f, 0f, 1f };//光源位置,位置性点光源
float[] sun_light_ambient = {
0f, 0f, 0f, 1f };//环境光
float[] sun_light_diffuse = {
1f, 1f, 1f, 1f };//漫反射光
float[] sun_light_speular = {
1f, 1f, 1f, 1f };//镜面光
private void setLight(SharpGL.OpenGL gl)
<