OpenGL进阶(十三)-GLSL光照(Lighting)-创新互联

提要

    在上一篇文章中,我们介绍了简单的Shading,同时提出了一个光照模型,模拟了一个点光源,但是,关于光的故事还没有结束...

专注于为中小企业提供网站设计制作、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业上海免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

    今天要学习的是方向光源(Directional Light),聚光灯,per pixel shading,halfway vector。

   关于光源的原理及数学描述,请参考:光线追踪(RayTracing)算法理论与实践(三)光照

方向光源

   方向光源就两个参数,方向和强度。

   还是简单的 ambient + diffuse + spec 光照模型。先看shader的代码。

basic.vert

#version 400 layout (location = 0) in vec3 VertexPosition;   layout (location = 1) in vec3 VertexNormal;    out vec3 LightIntensity;  struct LightInfo{ 	vec4 Direction; 	vec3 Intensity; };  struct MaterialInfo{ 	vec3 Ka; 	vec3 Kd; 	vec3 Ks; 	float Shininess; };  uniform LightInfo Light; uniform	MaterialInfo Material;  uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 ProjectionMatrix; uniform mat4 MVP;   void getEyeSpace(out vec3 norm, out vec4 position) { 	norm =  normalize(NormalMatrix * VertexNormal); 	position = ModelViewMatrix * vec4(VertexPosition, 1.0); }    vec3 ads(vec4 position, vec3 norm) { 	vec3 s; 	if(Light.Direction.w == 0.0) 		s = normalize(vec3(Light.Direction)); 	else 		s = normalize(vec3(Light.Direction - position)); 	vec3 v = normalize(vec3(-position)); 	vec3 r = reflect(-s, norm);  	return Light.Intensity * (Material.Ka + Material.Kd*max(dot(s,norm), 0.0) +  	       Material.Ks * pow(max(dot(r,v),0.0), Material.Shininess)); }  void main() { 	vec3 eyeNorm; 	vec4 eyePosition; 	getEyeSpace(eyeNorm, eyePosition); 	LightIntensity = ads(eyePosition, eyeNorm); 	 	gl_Position = MVP * vec4( VertexPosition, 1.0); }

在ads函数中,首先通过nomal矩阵将顶点法向量变换到视口坐标下,(nomal矩阵其实就是model-view矩阵的左上3x3的矩阵)然后通过model-view矩阵将顶点坐标转化为视口坐标系(eye coordinates)下。

接下来的ads用来计算光照模型下顶点的颜色,分别计算三个分量,然后相加。

basic.frag

#version 400  in vec3 LightIntensity;  void main(void) { 	gl_FragColor = vec4(LightIntensity, 1.0); 	//gl_FragColor = vec4(1.0,1.0,0.1, 1.0); }
这个就是将根据顶点shader传来的颜色对片段进行赋值。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:OpenGL进阶(十三)-GLSL光照(Lighting)-创新互联
标题路径:http://hbruida.cn/article/eogpj.html