OpenGL4.0 GLSL 实现逐片元光照模型 提高场景真实性
2014-02-12 10:48
316 查看
当计算光照模型(如ADS模型)的时候,通常是在vertex shader中计算每个顶点的颜色值,然后通过这些顶点插值 传入fragment shader中,这些被称为Gouraud shading.
Gouraud shading.模型有一些不尽人意的地方,例如,高光(bright specular highlight)可能在一个polygon的中间,这样通过这种模型计算就会影响高光显示效果。
为了提高渲染结果的准确性,我们可以把计算光照模型的计算 放到fragment shader 中进行,我们通过插值物体表面的顶点和发向 而不是每个顶点的颜色,传递到fragment shader 中进行光照模型计算,这项技术程为:Phong shader 或者是 Phong interpolation 。这样通过phong shader 光照模型可以大大提高场景的真实性,但也会有一些小的瑕疵。
如图:Gouraud and Phong shading 对比
左边是Gouraud (per-vertex) shading,右边是Phong(per-fragment)shading。 在途中可以看出 右边的效果要比左边的效果更真实些。
顶点shader
片元shader
Gouraud shading.模型有一些不尽人意的地方,例如,高光(bright specular highlight)可能在一个polygon的中间,这样通过这种模型计算就会影响高光显示效果。
为了提高渲染结果的准确性,我们可以把计算光照模型的计算 放到fragment shader 中进行,我们通过插值物体表面的顶点和发向 而不是每个顶点的颜色,传递到fragment shader 中进行光照模型计算,这项技术程为:Phong shader 或者是 Phong interpolation 。这样通过phong shader 光照模型可以大大提高场景的真实性,但也会有一些小的瑕疵。
如图:Gouraud and Phong shading 对比
左边是Gouraud (per-vertex) shading,右边是Phong(per-fragment)shading。 在途中可以看出 右边的效果要比左边的效果更真实些。
顶点shader
#version 430 layout (location = 0) in vec3 VertexPosition; layout (location = 1) in vec3 VertexNormal; out vec3 Position; out vec3 Normal; uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 ProjectionMatrix; uniform mat4 MVP; void main() { Normal = normalize( NormalMatrix * VertexNormal); Position = vec3( ModelViewMatrix * vec4(VertexPosition,1.0) ); gl_Position = MVP * vec4(VertexPosition,1.0); }
片元shader
#version 430 in vec3 Position; in vec3 Normal; uniform vec4 LightPosition; uniform vec3 LightIntensity; uniform vec3 Kd; // Diffuse reflectivity uniform vec3 Ka; // Ambient reflectivity uniform vec3 Ks; // Specular reflectivity uniform float Shininess; // Specular shininess factor layout( location = 0 ) out vec4 FragColor; vec3 ads( ) { vec3 s = normalize( vec3(LightPosition) - Position ); vec3 v = normalize(vec3(-Position)); vec3 r = reflect( -s, Normal ); return LightIntensity * ( Ka + Kd * max( dot(s, Normal), 0.0 ) + Ks * pow( max( dot(r,v), 0.0 ), Shininess ) ); } void main() { FragColor = vec4(ads(), 1.0); }
相关文章推荐
- OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型
- 3D图形学编程基础-基于Direct3D11-学习记录(二)光照模型的实现
- Shader自学笔记 2.1.1 逐顶点漫反射光照模型实现
- UnityShader初级篇——实现逐顶点高光反射光照模型
- 使用GLSL实现更多数量的局部光照
- 基于CPU的Bank BRDF经验模型,实现各向异性光照效果!(强烈推荐呀!各向异性的光照效果!!!)
- 基于CPU的Bank BRDF经验模型,实现各向异性光照效果!
- 探究OpenGL光照模型的着色器实现
- OpenGL 4.0 GLSL 采用平行光照模型
- glsl实现像素光照的方法
- 苹果机器学习博客姗姗来迟:使用改进的生成对抗模型,提高图像真实性,降低图像的标记成本
- HLSL实现镜面反射光照模型
- 使用GLSL实现对光照的模拟(一)
- Shader自学笔记 2.1.2 逐像素漫反射光照模型实现
- HLSL实现环境光光照模型
- 实现 逐顶点的 ambient, diffuse, and specular (ADS) shading phong 光照模型
- Shader自学笔记 2.1.3 半兰伯特光照模型实现
- 基本光照模型实现-漫反射
- 基于GPU实现的经典光照模型算法:漫反射模型(使用cg语言实现)
- HLSL实现漫反射光照模型