计算机图形学——MFC和OpenGL两种方法实现光照模型

版权声明:本文为小黄鸭原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29721419/article/details/72047196

计算机图形学——MFC和OpenGL两种方法实现光照模型

1、OpenGL实现Phong光照:

见上一个实验

实现效果:


2、C++实现Phong光照:

            实现效果:

         实现原理:使用Phong光照模型各分量计算公式(参见上一个实验)使用MFC对设置球体的每个像素颜色。
设置光照系数:
int x,y,deltax,deltay,d,i,j,m,x0,y0,r,n;
	int degree[5]={1,5,10,20,40};//某行的镜面反射的会聚指数
	float kdr0[6]={1.0,0.8,0.6,0.4,0.2,0.0};//某列红色环境反射分量系数
	float kdg0[6]={1.0,0.6,0.8,0.4,0.4,0.0};//某列绿色环境反射分量系数
    float kdb0[6]={1.0,0.4,1.0,0.4,0.6,0.0};//某列蓝色环境反射分量系数
	float ks0[6]={0.0,0.2,0.4,0.6,0.8,1.0};//某列镜面反射反射分量系数
使用光照参数描绘球体每个像素:
for (y=-r;y<=r;y++){	
		for (i=-r;i<=r;i++)
			if((y*y+i*i)<=(r*r)){mColor=phong(x0,y0,r,i+x0,y+y0,ks,kdr,kdb,kdg,n);
				dc.SetPixel(i+x0,y+y0,mColor);}		
		}
设置光照各分量关键代码如下:
DWORD CPhongView::phong(int x0, int y0, int r, int x, int y, float ks,float kdr,
						float kdg,float kdb, int n)
{
	typedef struct fXL{
		float fx;float fy;float fz;}XL;
		XL N,L,H,V;
		float Ia,Id,Ip,z,hh,alpha,theta,Iar,Iab,Iag;
		int red,green,blue;
		Ia=55;//环境反射分量
		Id=100;//慢反射分量
		Ip=125;//镜面反射分量
		float temp = r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0);
		z=sqrt(temp);
		N.fx=(x-x0)*1.0/r;N.fy=(y-y0)*1.0/r;N.fz=z*1.0/r;
		L.fx=-0.5;L.fy=-0.5;L.fz=sqrt(1-L.fx*L.fx-L.fy*L.fy);//点光源的单位向量
		V.fx=0;V.fy=0;V.fz=1.0;
		theta=N.fx*L.fx+N.fy*L.fy+N.fz*L.fz;
		if(theta<0)theta=0;
		H.fx=L.fx+V.fx;H.fy=L.fy+V.fy;H.fz=L.fz+V.fz;
		hh=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz);
		H.fx=(H.fx/hh);H.fy=(H.fy/hh);H.fz=(H.fz/hh);
		alpha=H.fx*N.fx+H.fy*N.fy+H.fz*N.fz;if(alpha<0)alpha=0;
		Iar=Ia+Id*kdr*theta+Ip*ks*pow(alpha,n);
		Iag=Ia+Id*kdb*theta+Ip*ks*pow(alpha,n);
		Iab=Ia+Id*kdg*theta+Ip*ks*pow(alpha,n);
		red=(int)Iar;green=(int)Iag;blue=(int)Iab;
		return(RGB(red,green,blue));
}
源码下载附件

阅读更多

没有更多推荐了,返回首页