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

原创 2017年05月14日 18:51:19

计算机图形学——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));
}
源码下载附件

版权声明:本文为博主原创文章,未经博主允许不得转载。

真实感图形之光照模型

光线跟踪是一种非常成功的生成真实感图像的算法。要研究光线跟踪算法,首先要研究各种照明模型。 这里要记住一点,物体本身是没有颜色的,你看到的一个物体的颜色是物体与入射到它表面的光线作用后射到你的眼睛里的...
  • lixingxian11
  • lixingxian11
  • 2015年02月15日 18:48
  • 1372

OpenGL编程指南12:光照_渲染真实球体

1.场景中添加光照的步骤 1.定义每个物体的每个顶点的法线向量。这个法向量决定了物体相对于光源的方向。 2.创建和选择一个或多个光照,并设置他们的位置。 3.创建和选择一种光照模型,它定义了...
  • shenziheng1
  • shenziheng1
  • 2017年03月30日 10:52
  • 577

VC++ 球体 Phong光照模型

  • 2009年11月15日 10:11
  • 1.81MB
  • 下载

MFC 单文档 实现opengl 三维旋转 缩放 光照

  • 2014年01月16日 13:01
  • 2.65MB
  • 下载

OpenGL中的光照与材料

OpenGL中的光照与材料      在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射,这3种不同类型的光分别是:环境光(ambient)、散射光(diffu...
  • Haohan_Meng
  • Haohan_Meng
  • 2014年11月23日 10:29
  • 2249

openGL的光照与材料(一)

真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。一般说来,用计算机在图形设备上生成真实感图形必须...
  • chenxiao88957478
  • chenxiao88957478
  • 2016年02月29日 10:35
  • 1136

OpenGL(七) 光照模型及设置

OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。 光源就是光的来源,是“光”这种物质的提供者; 材质是指被光源照射的物体的表面的反射、漫反射(OpenGL不考虑...
  • dcrmg
  • dcrmg
  • 2016年11月10日 23:42
  • 7681

探究OpenGL光照模型的着色器实现

OpenGL的着色器是新的显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013年09月27日 23:08
  • 3424

OpenGL光照模型--四种光照效果

OpenGL光照模型           为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光...
  • langzi007008
  • langzi007008
  • 2016年04月16日 20:37
  • 2638

Opengl 4种光照模型

1. 环境光: Iambdiff = Kd*Ia 其中Ia 表示环境光强度,Kd(0 方向光: Ildiff = Kd * Il * Cos(θ) 其中...
  • ym19860303
  • ym19860303
  • 2014年05月11日 14:59
  • 5867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机图形学——MFC和OpenGL两种方法实现光照模型
举报原因:
原因补充:

(最多只允许输入30个字)