您的位置:首页 > 编程语言

VC中使用OpenGL编程的初步

2006-11-28 11:44 435 查看
首先将OpenGL的连接文件,库文件导入到相应文件夹,如:库文件GLAUX.LIB、GLU32.LIB、GLUT32.LIB等等。

下面用到的变量:CClientDC* m_pDC

1、先要初始化OpenGL场景
void COpenView::Init()
{
//初始化openGL场景
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
if(!bSetupPixeFormat())
return ;
n = ::GetPixelFormat(m_pDC->GetSafeHdc());
::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
hrc = wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);
//根据客户区的初始值定透视投影
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
}

BOOL COpenView::bSetupPixeFormat()
{
//设置像素格式
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
int pixelformat;
//选择像素格式
if((pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
{
MessageBox("ChoosePixelFormat Failed");
return FALSE;
}
//设置像素格式
if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
MessageBox("SetPixeLFormat failed");
return FALSE;
}

return TRUE;
}

2、在OnSize()中,确定视窗与窗口的匹配
void COpenView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

int w = cx;
int h = cy;
//避免除数为0
if(h==0)
h = 1;
//设置视口与窗口匹配
glViewport(0,0,w,h);
//重新设置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立透视投影
gluPerspective(30.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

3、按自己的想法画图(以下只是个例子)
void COpenView::DrawScene(void)
{
GLfloat position[] = {0.0,0.0,1.0,1.0};
GLfloat mat_torus[] = {0.75,0.5,0.0,1.0};
GLfloat mat_cylinder[] = {0.0,0.75,0.75,0.15};

glClearColor(0.0,0.0,0.0,0.0);
//清除颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glLightfv(GL_LIGHT0,GL_POSITION,position);
glPushMatrix();
if(eyePosition)
gluLookAt(0.0,0.0,9.0,0.0,0.0,0.0,0.0,1.0,0.0);
else
gluLookAt(0.0,0.0,-9.0,0.0,0.0,0.0,0.0,1.0,0.0);
glPushMatrix();
glTranslatef(0.0,0.0,1.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_torus);
auxSolidTorus(0.275,0.85);
glPopMatrix();
glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_cylinder);
glTranslatef(0.0,0.0,-1.0);
auxSolidCylinder(1.0,2.0);
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
glPopMatrix();
//刷新屏幕,绘制图形
glFinish();
::SwapBuffers(wglGetCurrentDC());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: