- 1、本文档共41页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
只需设置参数Phong着色模型
光源类型 点光源 不同点的光线方向不同 方向光源(平行光) 不同点的光线方向不同 光的物理性质 ?:称为入射角度 Ii:称为入射光强度 那么: Iicos ?为改点所接受到的光强。 显然: ?为90度的时候最大 ?为0度的时候最小 ?90度则在另一个表面,因此这一点的光强值为0。 着色模型 平面着色模型(Flat Shading) 对一个平面只选择第一个点进行着色,平面上其他点的着色均相同 特点:高效 缺点:表示过于粗糙 着色模型 Gouraud着色模型(Gouraud Shading) 反射光的计算作用于每个顶点上,每个顶点都有不同的法向量 其他点通过插值计算得到 效果比较 平面着色 Gouraud着色 着色模型 Phong着色模型 先根据各个顶点的法向量,插值计算出各个像素的法向量,再对每个像素计算光照值 效果好,但计算量更大 OpenGL中的光照设置 光照启动和禁止: glEnable( GL_LIGHTING); glDisable( GL_LIGHTING); glEnable( GL_LIGHT0); //0~7,至少提供8盏灯 glDisable( GL_LIGHT0); 着色模型,只有两种模型: glShadeModel( GL_FLAT); glShadeModel( GL_SMOOTH); 指定法向量: glNormal3f( x, y, z); glVertex3f( r*x, r*y, r*z); 举例 指定各个光成分 GLfloat ambient0[] = { 0.1f, 0.1f, 0.1f, 1.0f}; //Grey GLfloat diffuse0[] = { 1.0f, 1.0f, 1.0f, 1.0f}; //White GLfloat specular0[] = {1.0f, 1.0f, 1.0f, 1.0f }; //White //现实中,漫反射光和镜面反射光往往设置成相同的,而环境光一般漫反射的多少分之一(如1/10) glLightfv( GL_LIGHT0, GL_AMBIENT, ambient0); glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse0); glLightfv( GL_LIGHT0, GL_SPECULAR, specular0); //OpenGL还提供了全局环境光 默认开启,值为:(0.2f,0.2f,0.2f),需要修改使用: float globalAmbient[] = { r, g, b, 1.0f}; glLightModelfv( GL_LIGHT_MODEL_AMBIENT, globalAmbient ); 光源类型和位置 //点光源位置,默认在视点位置: GLfloat light_position[] = { 2.0f, 4.0f, 6.0f, 1.0f}; glLightfv( GL_LIGHT0, GL_POSITION, light_position); //方向光源 GLfloat light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f}; glLightfv( GL_LIGHT0, GL_POSITION, light_position); //默认情况下视点在无穷远,效果不够好,可以开启局部视点光照 glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); 若要双面计算光照,可以设置: glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); 网格细分程度 根据光照的计算过程,我们知道网格细分程度对光照效果影响明显: 衰减光源 对点光源来说,可以根据公式计算衰减: d为距离,a, b, c分别对应参数设置: glLightf( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.0f); glLightf( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5f); glLightf( GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0f); 默认情况下:a = 1, b = 0, c = 0 聚光灯 光照形状呈圆锥形 GLfloat light_direction[] = {0, 0, -1}; //方向 glLightfv(GL_LIGHT0, L_SPOT_DIRECTION,light_direction); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 20.0f);//锥体顶角为40度 glLightf( GL_LIGHT
文档评论(0)