课程实验指导6-光照
void Init() {
float mo; Vector eye; mLight.Ir = 0; mLight.Ig = 175; mLight.Ib = 0; KaIa=100; Kd = 0.7; n = 20;
light.fx=0.50;light.fy=0.50; light.fz = sqrt(1-(light.fx*light.fx)-(light.fy*light.fy)); eye.fx=0;eye.fy=0;eye.fz=1; H.fx=light.fx+eye.fx; H.fy=light.fy+eye.fy; H.fz=light.fz+eye.fz; mo=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz); H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo); H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);
课程实验指导六
实验 6 简单光照明模型实现 1.实验目的: 了解简单光照明模型的基本原理,利用 VC+OpenGL 实现物体的 真实感图形。 2.实验内容:
(1) 结合示范代码了解简单光照明模型的基本原理与实 现;
(2) 调试、编译、修改示范程序,给出不同光照系数,观 察验证显示效果。
(3) 尝试实现三角形的光照效果。 3.实验原理: Phong 光照明模型是由物体表面上一点 P 反射到视点的光强 I 为 环境光的反射光强 Ie、理想漫反射光强 Id、和镜面反射光 Is 的总和,即
L V
只需计算一次 H 的值,节省了计算时间。结合 RGB 颜色模型,Phong
光照明模型最终有如下的形式:
I I
r g
I ar K ar I K pr dr (L I ag K ag I pg K dg (L
N ) I pr K sr (H N )n N ) I pg K sg (H N )n
#define NO_LIGHT 1 #define LIGHT 2 bool bLight = false;
struct Vector {
float fx, fy, fz; };
struct Color {
float Ir, Ig, Ib; };
float KaIa; float Kd, n; Vector H,light; Color mLight, mColor;
theta=0; alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz; if(alpha<0)
alpha=0; mColor.Ir=KaIa+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n );
mColor.Ig=KaIa+mLight.Ig*Kd*theta+mLight.Ig*Ks*pow(alpha, n);
的空间分布,表面越光滑,n 越大。
在用 Phong 模型进行真实感图形计算时,对物体表面上的每个
点 P,均需计算光线的反射方向 R,再由 V 计算 (R V ) 。为减少计算量,
我们可以作如下假设:a)光源在无穷远处,即光线方向 L 为常数;b)视点
在无穷远处,即视线方向 V 为常数;c)用 (H V ) 近似 (R V ) 。这里 H 为 L 和 V 的角平分向量, H L V 。在这种简化下,由于对所有的点总共
I b
I ab K ab
I pb Kdb (L N )
I pb K sb (H
N)n
本次实验中,光源在无穷远处,光线方向为单位向量 L(0.5, 0.5,
0.707),视点标右键操作,相关知识见后面所附 GLUT 菜
单知识。
glColor3f (0.0f, 1.0f, 0.0f); glBegin(GL_POINTS);
glVertex2i (x+x0,y+y0); glVertex2i (-x+x0,y+y0); glVertex2i (-x+x0,-y+y0);
I Iaka I pKd (L N) I pKs (R V )n
(8-10) 其中 R,V,N 为单位矢量;Ip 为点光源发出的入射光强;Ia 为环境 光的漫反射光强;Ka 环境光的漫反射系数;Kd 漫反射系数( 0 Kd 1)取 决于表面的材料;Ks 镜面反射系数( 0 Ks 1);n 幂次,用以模拟反射光
glClearColor(1.0, 1.0, 1.0, 0.0); glShadeModel(GL_SMOOTH); }
Color Phong(int x0, int y0, int r, int x, int y) {
Vector N; float z,alpha,theta,Ks; Ks=1.0-Kd; z=sqrt((float)(r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0))); N.fx=(x-x0)*1.0/r; N.fy=(y-y0)*1.0/r; N.fz = z*1.0/r; theta = N.fx * light.fx + N.fy * light.fy + N.fz * light.fz; if(theta<0)
4.实验代码: // Light.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h>
mColor.Ib=KaIa+mLight.Ib*Kd*theta+mLight.Ib*Ks*pow(alpha, n);
return mColor; }
void MidCircle(int x0, int y0, int r) {
int x,y,deltax,deltay,d; x = 0; y = r; deltax = 3; deltay = 5-r-r; d = 1-r;