19,469
社区成员
发帖
与我相关
我的任务
分享
class OpenGLLight
{
public:
//光照
float ambbientLight[4];
float diffuseLight[4];
float spotlightPosition[4];
float spotlightDirection[3];
//材质
float matAmbient[4];
float matDiff[4];
float matSpecualr[4];
public:
void Initialize();
};
void OpenGLLight::Initialize()
{
ambbientLight[0]=0.5f;
ambbientLight[1]=0.5f;
ambbientLight[2]=0.5f;
ambbientLight[3]=1.0f; //环境光
diffuseLight[0]=0.5f;
diffuseLight[1]=0.5f;
diffuseLight[2]=0.5f;
diffuseLight[4]=1.0f; //散射光
spotlightPosition[0]=6.0f;
spotlightPosition[1]=0.5f;
spotlightPosition[2]=0.5f;
spotlightPosition[3]=1.0f; //聚光灯位置
spotlightDirection[0]=-1.0f;
spotlightDirection[1]=0.0f;
spotlightDirection[2]=-1.0f; //聚光灯方向
matAmbient[0]=1.0f;
matAmbient[1]=1.0f;
matAmbient[2]=1.0f;
matAmbient[3]=1.0f; //环境光材质属性
matDiff[0]=1.0f;
matDiff[1]=1.0f;
matDiff[2]=1.0f;
matDiff[3]=1.0f; //散射光材质属性
matSpecualr[0]=1.0f;
matSpecualr[1]=1.0f;
matSpecualr[2]=1.0f;
matSpecualr[3]=1.0f; //镜面反射光材质属性
glClearColor(0.0f,0.0f,0.0f,0.0f); //清理为黑色
glShadeModel(GL_SMOOTH); //使用平滑明暗处理
glEnable(GL_DEPTH_TEST); //启用深度检测
glEnable(GL_CULL_FACE); //不计算多边形背面
glFrontFace(GL_CCW); //多边形逆时针为正面
glEnable(GL_LIGHTING); //启用光照
//设置环境光分量
glLightfv(GL_LIGHT0,GL_AMBIENT,ambbientLight);
//设置散射光分量
glLightfv(GL_LIGHT0,GL_DIFFUSE,ambbientLight);
//设置光源位置
glLightfv(GL_LIGHT0,GL_POSITION,spotlightPosition);
//聚光灯属性
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,40.0f); //聚光灯80度 张角
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,30.0f);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotlightDirection);
//启用光源
glEnable(GL_LIGHT0);
//使用glColor()函式来为环境光和散射光跟踪颜色设置
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
//材质具有最小反射率
glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecualr);
glMaterialf(GL_FRONT,GL_SHININESS,10.0f);
}
while (!done)
{
PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE);
if(msg.message==WM_QUIT) //检测是否收到退出消息
{
done=true;
}
else
{
Light.Initialize();
OpenGLIn.Render();
SwapBuffers(g_HDC); //交换前后缓存
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void OpenGLInit::Render()
{
glClearColor(0.0f,0.0f,0.0f,0.0f); //设置清理颜色为黑色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清理颜色/深度缓存
glLoadIdentity();
glColor3f(0.0f,0.5f,0.5f);
//绘制
auxSolidSphere(9.0);
glFlush();
}