您的位置:首页 > 理论基础

计算机图形学——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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息