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

OpenGL入门1——安装及编程环境配置

2014-10-15 21:29 471 查看
一、OpenGL的安装

我的PC环境:win7+VS2010

1、检查兼容性(可跳过)

OpenGL版本众多,而且各显卡厂商也有自己开发的扩展库。要想使用某个版本进行开发,既需要显卡本身支持所需的功能,又需要驱动程序能兼容这个版本。决定使用哪一个版本之前,先要用GPU
Caps Viewer检查一下支持的OpenGL和GLSL的最高版本和具体支持哪些扩展

2、准备文件

下载GLUT(OpenGL应用工具包);其中包含glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll

3、安装

二、OpenGL编程环境配置

1、设置像素格式

为view类添加成员函数:BOOL SetWindowPixelFormat(HDC hDC);//设置像素格式

和成员变量:int m_GLPixelIndex;//像素格式索引,并在view构造函数中添加:this->m_GLPixelIndex
= 0;

BOOL CXXXView::SetWindowPixelFormat(HDC hDC)
{//定义窗口的像素格式
PIXELFORMATDESCRIPTOR pixelDesc=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
this->m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);//选择最相近的像素格式
if(this->m_GLPixelIndex==0)
{//选择失败
this->m_GLPixelIndex = 1;//默认的像素格式
if(DescribePixelFormat(hDC,this->m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{//用默认的像素格式进行设置
return FALSE;
}
}
if(SetPixelFormat(hDC,this->m_GLPixelIndex,&pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}


2、创建绘图环境RC

为view类添加成员函数:BOOL CreateViewGLContext(HDC hDC);//创建绘制环境(RC)并使之成为当前绘制环境

和成员变量:HGLRC m_hGLContext;//绘制环境,并在view构造函数中添加:this->m_hGLContext = NULL;

BOOL CXXXView::CreateViewGLContext(HDC hDC)
{
this->m_hGLContext = wglCreateContext(hDC);//创建RC
if(this->m_hGLContext==NULL)
{     //创建失败
return FALSE;
}
if(wglMakeCurrent(hDC,this->m_hGLContext)==FALSE)
{//选为当前RC失败
return FALSE;
}
return TRUE;
}

3、定义初始化和绘制函数

为view类添加成员函数 BOOL InitGL(GLvoid);//初始化openGL和成员函数
int DrawGLScene(GLvoid);//绘图代码区

BOOL CXXXView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0,0.0,0.0,0.0); // 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
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective Calculations
return TRUE;      // Initialization Went OK
}


int CodemoView::DrawGLScene(GLvoid)
{
//在这里写绘图代码
}


4、修改view已有函数

(1)、PreCreateWindow

BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);//openGL必需的
return CView::PreCreateWindow(cs);
}


(2)、OnSize

void CXXXView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
GLsizei width,height;
GLdouble aspect;
width = cx;
height = cy;
if(cy==0)
{
aspect = (GLdouble)width;
}
else
{
aspect = (GLdouble)width/(GLdouble)height;
}
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0*aspect,0.0,500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
return ;
}

(3)、OnCreate

int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码
HWND hWnd = this->GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);

//设置像素格式
if(this->SetWindowPixelFormat(hDC)==FALSE)
{
return 0;
}

//创建RC并选为所用
if(this->CreateViewGLContext(hDC)==FALSE)
{
return 0;
}

//初始化openGL
if(!this->InitGL())
{
return 0;
}
return 0;
}


(4)、OnDestroy

void CXXXView::OnDestroy()
{
CView::OnDestroy();

// TODO: 在此处添加消息处理程序代码
if(wglGetCurrentContext()!=NULL)
{
wglMakeCurrent(NULL,NULL);
}
if(this->m_hGLContext!=NULL)
{
wglDeleteContext(this->m_hGLContext);
this->m_hGLContext = NULL;
}
}


注意:1、要在OnPaint函数中调用 DrawGLScene函数来绘制OpenGL场景;

2、在OnPaint函数末尾或DrawGLScene函数内部末尾添加“SwapBuffers( ::GetDC(m_hWnd) );”来将场景展现出来。

三、OpenGL 创建窗口(控制台程序)

1、头文件

windows.h 和glut.h

2、动作执行顺序

在main函数中:

(1)初始化GLUT:

glutInit(&argc, argv);

(2) 设置显示模式:

例如:glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

(3)设置窗口位置、大小、标题、创建窗口

例如:

glutInitWindowPosition(50, 100);

glutInitWindowSize(400, 300);

glutCreateWindow("An Example OpenGL Program");

(4)额外的初始化指定(自己实现)

例如:

void init(void)

{

glClearColor(1.0, 0.0, 0.0, 0.0);

glMatrexMode( GL_PROJECTION );

gluOrtho2D( 0.0, 200.0, 0.0, 150.0 );

}

(5)设置显示回调函数

例如:

自己实现显示回调函数(display callback function):

void lineSegment()

{

glClear( GL_COLOR_BUFFER_BIT );

glColor3f(1.0, 0.0, 0.0);

glBegin( GL_LINES );

glVertex2i(180, 15);

glVertex2i(10, 145);

glEnd();

glFlush();

}

将图形发送到屏幕窗口

glutDisplayFunc( lineSegment );

(6)设置消息循环

glutMainLoop();

补充:

可以为程序注册各种事件处理回调函数,就像使用glutDisplayFunc注册显示回调函数一样。

1*、注册窗口大小改变时的回调函数

glutReshapeFunc( void (*func)(int w, int h));

2*、注册键盘按键回调函数

glutKeyboardFunc( void (*func)(unsigned char key, int x, int y));

3*、注册鼠标按下(非鼠标移动)回调函数

glutMouseFunc( void (*func)( int button, int state, int x, int y));

4*、注册当按下鼠标按钮并移动鼠标时的回调函数

glutMotionFunc( void (*func)(int x, int y) );

5*、注册空闲处理回调函数

glutIdleFunc( void (*func)( void) );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: