计算机图形学——OpenGL光照模型
2017-04-19 22:32
1971 查看
计算机图形学——OpenGL光照模型
1、Phong光照模型
镜面高光是由R、V决定,ks为材质的镜面反射系数, ns 是高光指数,V 表示从顶点到视点的观察方
向, R 代表反射光方向。ns越大,反射光越集中;ns越小,表示物体越粗糙,反射光分散。
实现实例:
(源码在后面)
2、高洛德着色
真实感图象颜色过渡均匀,图形显得非常光滑但是镜面反射效果不太理想。实现实例:
(源码在这里)
3、二者的区别
从图中可以看出,在光照强度相同时,Phong光照模型明暗交界处处理的很平滑。Phong模型源码:
// 包含着色器加载库 #include "shader.h" #include <GL/glut.h> GLfloat lightPosition[3] = { 30.0,30.0,-15.0 }; GLfloat ambient[4] = { 0.0 , 0.0 , 0.0 , 1.0 }; GLfloat lightcolor[4] = { 1.0 , 1.0 , 1.0 , 1.0 }; GLfloat eyeposition[3] = { 0.0 , 10.0 , 30.0 }; GLfloat Ns = 30; GLfloat attenuation = 0.01; GLuint programHandle; void mydisplay(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色和深度缓冲 glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH);//着色模型 programHandle = loadShaders("F:\\大三下课程\\Computer Graphic\\Shader\\gouraud.vert", "F:\\大三下课程\\Computer Graphic\\Shader\\gouraud.frag"); glUseProgram(programHandle); glUniform3f(glGetUniformLocation(programHandle, "lightposition"), lightPosition[0], lightPosition[1], lightPosition[2]); glUniform3f(glGetUniformLocation(programHandle, "eyeposition"), eyeposition[0], eyeposition[1], eyeposition[2]); glUniform4f(glGetUniformLocation(programHandle, "ambient"), ambient[0], ambient[1], ambient[2], ambient[3]); glUniform4f(glGetUniformLocation(programHandle, "lightcolor"), lightcolor[0], lightcolor[1], lightcolor[2], lightcolor[3]); glUniform1f(glGetUniformLocation(programHandle, "Ns"), Ns); glUniform1f(glGetUniformLocation(programHandle, "attenuation"), attenuation); glutSolidTeapot(0.5); glFlush(); } int main(int argc, char *argv[]) { glewInit(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(600, 600); glutCreateWindow("ShaderLight"); glewInit(); glutDisplayFunc(&mydisplay); glutMainLoop(); return 0; }顶点着色器:
uniform vec3 lightposition;//光源位置 uniform vec3 eyeposition;//相机位置 uniform vec4 ambient;//环境光颜色 uniform vec4 lightcolor;//光源颜色 uniform float Ns;//高光系数 uniform float attenuation;//光线的衰减系数 varying vec4 color;//向片段着色其传递的参数 void main() { vec3 ECPosition = vec3(gl_ModelViewMatrix * gl_Vertex); vec3 N = normalize(gl_NormalMatrix * gl_Normal); vec3 L = normalize(lightposition - ECPosition); vec3 V = normalize(eyeposition - ECPosition); vec3 H = normalize(V + L); vec4 diffuse = lightcolor * max(dot(N , L) , 0); vec4 specular = lightcolor * pow(max(dot(N , H) , 0) , Ns) * attenuation; color = vec4(clamp((diffuse + specular) , 0.0 , 1.0)); color = color + ambient; gl_Position = ftransform(); }片段着色器:
varying vec4 color; void main() { gl_FragColor = color; }
相关文章推荐
- 计算机图形学——MFC和OpenGL两种方法实现光照模型
- 计算机图形学-光照纹理模型
- 计算机图形学 学习笔记(十二):颜色模型,简单 / 增量 光照模型
- 计算机图形学作业 - 运用Python-OpenGL设计一个带键盘控制的三维模型
- 计算机图形学 学习笔记(完):局部 / 整体 光照模型,光透射模型,纹理映射和阴影处理
- 计算机图形学-光照模型
- 计算机图形学——OpenGL之光照
- 计算机图形学——基于3D游戏开发技术——第一章游戏模型
- 计算机图形学中的常用模型
- OpenGL光照的计算模型
- 计算机图形学(一)坐标变换和第一个OpenGL
- 计算机图形学 OPENGL学习
- RenderMonkey 练习 第二天 【opengl 光照模型】
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线
- 计算机图形学和OpenGL(一)OpenGL初步
- 【计算机图形学】OpenGL入门1——第一个OpenGL程序
- OpenGL光照的计算模型
- OpenGL-光照模型
- 图形学理论 光照模型
- OpenGL 4.0 GLSL 用多个光照模型