BOOL CTerraintestView::PreCreateWindow(CREATESTRUCT& cs) { //设置窗口类型 cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS; return CView::PreCreateWindow(cs); } void CTerraintestView::OnDraw(CDC* pDC) { //渲染场景 RenderScene(); } BOOL CTerraintestView::InitializeOpenGL(CDC *pDC) { //进行opengl的初始化工作 m_pDC=pDC; //首先把DC的象素格式调整为指定的格式,以便后面对DC的使用 SetupPixelFormat(); //根据DC来创建RC m_hRC=::wglCreateContext(m_pDC->GetSafeHdc()); //设置当前的RC,以后的画图操作都画在m_pDC指向的DC上 ::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC); //下面可以进行画图操作了 return TRUE; } int CTerraintestView::OnCreate(LPCREATESTRUCT lpCreateStruct) { //获取客户区的设备描述表 m_pDC=new CClientDC(this); //初始化OpenGL InitializeOpenGL(m_pDC); //初始化OpenGL的一些状态参数并对地形数据进行初始化 InitGL(); return 0; } BOOL CTerraintestView::SetupPixelFormat() { //初始化象素格式以及选取合适的格式来创建RC PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 PFD_SUPPORT_OPENGL | // 支持 OpenGL PFD_DOUBLEBUFFER, // 双缓存模式 PFD_TYPE_RGBA, // RGBA 颜色模式 24, // 24 位颜色深度 ,color depth 0, 0, 0, 0, 0, 0, // 忽略颜色位 0, // 没有非透明度缓存 0, // 忽略移位位 0, // 无累加缓存 0, 0, 0, 0, // 忽略累加位 32, // 32 位深度缓存 0, // 无模板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主层 0, // 保留 0, 0, 0 // 忽略层,可见性和损毁掩模 }; //在DC中选择合适的象素格式并返回索引号 int pixelformat; pixelformat=::ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd); if (pixelformat==0) { AfxMessageBox("no matched pixelformat!"); return FALSE; } //设置指定象素格式 if (::SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE) { AfxMessageBox("can't set specified pixelformat!"); return FALSE; } return TRUE; } BOOL CTerraintestView::InitGL() { //初始化整个场景和OpenGL的状态变量 //初始化地形数据以便于绘制 InitTerrainData(); // OpenGL场景初始化(光照、雾化等〕 glShadeModel(GL_SMOOTH); // Enable Smooth Shading glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST); // Enables Depth Testing glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do return TRUE; // Initialization Went OK } void CTerraintestView::InitTerrainData() { //随机初始化地形数据,此处与程序框架无关,故省略,可以参加本文对应的源代码 } BOOL CTerraintestView::RenderScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0,7,0,4,4,4,0,1,0); //视图变换 DrawTerrain(); //绘制地形 ::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区 return TRUE; } BOOL CTerraintestView::DrawTerrain() { //根据地形数据绘制出地形 float h1,h2,h3,h4; float color1,color2,color3,color4; int x,z; for(x=1;x<29;x++) { for(z=1;z<29;z++) { //获取相邻的四个顶点的高程数据 h1=m_land[x][z]; h2=m_land[x][z+1]; h3=m_land[x+1][z]; h4=m_land[x+1][z+1]; //计算各个顶点的颜色数据 color1=h1*256/(m_Max-m_Min); color2=h2*256/(m_Max-m_Min); color3=h3*256/(m_Max-m_Min); color4=h4*256/(m_Max-m_Min); //地形由四边形构成 glBegin(GL_QUADS); glColor3f(color1,0,color1); glVertex3d((float)x,h1,(float)z); glColor3f(color2,color2,color2); glVertex3d((float)x,h2,(float)(z+1)); glColor3f(color3,color3,color3); glVertex3d((float)(x+1),h3,(float)z); glColor3f(color4,color4,color4); glVertex3d((float)(x+1),h4,(float)(z+1)); glEnd(); } } return TRUE; } void CTerraintestView::OnDestroy() { CView::OnDestroy(); //删除当前的RC ::wglMakeCurrent(NULL,NULL); //删除RC ::wglDeleteContext(m_hRC); //删除DC if (m_pDC) delete m_pDC; } void CTerraintestView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); //添加窗口缩放时的图形变换函数,即视口变换 glViewport(0,0,cx,cy); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } |