对OpenGL进行所有的设置。我们将设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading(阴影平滑)等等。这个例程直到OpenGL窗口创建之后才会被调用。
void COpenglbaseView::myInit()
{
//置黑背景
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glEnable(GL_DEPTH_TEST); // 启用深度测试
glClearDepth(1.0f); // 设置深度缓存
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正
glShadeModel(GL_SMOOTH);//选择扁平或者光滑的阴影,此处选择了光滑的阴影
//glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//用当前设置的清除色清除指定的缓冲区 (颜色缓冲区与深度缓冲区)
glEnable(GL_NORMALIZE);//转换后法向矢量与单位长度成比例
glMatrixMode(GL_MODELVIEW);
glLoadIdentity ();//设置当前矩阵的单位矩阵
}
设置光照
void COpenglbaseView::SetLight()
{
// Lights properties
float ambientProperties[] = {0.7f, 0.7f, 0.7f, 1.0f};
float diffuseProperties[] = {0.8f, 0.8f, 0.8f, 1.0f};
float specularProperties[] = {1.0f, 1.0f, 1.0f, 1.0f};
// GLfloat position[] = {1.0f, 3.0f, 1.0f, 0.0f};//光在水平坐标系中的位置
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientProperties);
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseProperties);
glLightfv( GL_LIGHT0, GL_SPECULAR, specularProperties);
// glLightfv( GL_LIGHT0, GL_POSITION, position);//设置光源参数,v表示参数用矢量形式position被设定
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0);
// back material
float MatAmbientBack[] = {0.0f, 0.0f, 0.0f, 0.0f};
glMaterialfv(GL_BACK,GL_AMBIENT,MatAmbientBack);
// SetMaterial(m_glMat[0],false);
float ambient[] = {0.0f,0.0f,0.0f,1.0f};
float diffuse[] = {0.0f,0.0f,0.0f,1.0f};
float specular[] = {0.0f,0.0f,0.0f,1.0f};
float emission[] = {0.3f,0.3f,0.3f,1.0f};
float shininess[] = {0.0f};
// Change
// if(string == "Silver")
{
// Ambient
ambient[0] = 0.19225f;
ambient[1] = 0.19225f;
ambient[2] = 0.19225f;
ambient[3] = 1.0f;
// Diffuse
diffuse[0] = 0.50754f;
diffuse[1] = 0.50754f;
diffuse[2] = 0.50754f;
diffuse[3] = 1.0f;
// Specular
specular[0] = 0.508273f;
specular[1] = 0.508273f;
specular[2] = 0.508273f;
specular[3] = 1.0f;
// Shininess
shininess[0] = 51.2f;
}
// apply
glMaterialfv( GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv( GL_FRONT, GL_SPECULAR, specular);
glMaterialfv( GL_FRONT, GL_SHININESS, shininess);
glMaterialfv( GL_FRONT, GL_EMISSION, emission);
}
这两个环境设置的函数都在初始化OpenGL时调用
BOOL COpenglbaseView::InitializeOpenGL(CDC *pDC)
{
m_pDC=pDC;
if(!SetupPixelFormat())
return FALSE;
m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());//产生一个新的opengl绘图描述表使之适合在参数hdc给出的设备上画图
::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);
SetLight();//设置光照环境
myInit();//设置绘图环境
return TRUE;
}
初始化函数InitializeOpenGL在OnCreate中调用
int COpenglbaseView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//////////////////////////////////////////////////////////////////////////
//初始化OpenGL和定时器函数
m_pDC=new CClientDC(this);
if(!InitializeOpenGL(m_pDC))
return 0;
//////////////////////////////////////////////////////////////////////////
return 0;
}