计算机图形学——OpenGL光照模型

计算机图形学——OpenGL光照模型

1、Phong光照模型

计算机图形学——OpenGL光照模型_第1张图片
        镜面高光是由R、V决定, ks为材质的镜面反射系数, ns 是高光指数,V 表示从顶点到视点的观察方
向, R 代表反射光方向。ns越大,反射光越集中;ns越小,表示物体越粗糙,反射光分散。
       实现实例
计算机图形学——OpenGL光照模型_第2张图片
(源码在后面)

2、高洛德着色

真实感图象颜色过渡均匀,图形显得非常光滑但是 镜面反射效果不太理想。
实现实例
计算机图形学——OpenGL光照模型_第3张图片
(源码在这里)

3、二者的区别

         从图中可以看出,在光照强度相同时,Phong光照模型明暗交界处处理的很平滑。
计算机图形学——OpenGL光照模型_第4张图片
Phong模型源码:
// 包含着色器加载库
#include "shader.h"
#include 
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;
}

你可能感兴趣的:(计算机图形学)