OpenGL学习1
Posted by
蒋波涛
11 August,2006 Views
(5)Comment
工作后第一个任务就是学习OpenGL进行技术储备,以备在目前正在进行的一个项目中使用OpenGL做一些三维的开发和管理工作。此事对我而言,难度颇大,一是我从来没有接触过OpenGL的开发,其二开发工具由我比较熟悉的.NET IDE换为VC++6.0,尽管我对MFC并不是一无所知,但最近的接触,却是两年以前。尽管买了一本《Internal MFC》,却一直作为摆设,看了不到两章。
尽管如此,还是得硬着头皮上,啃下这两块硬骨头,对于MFC,由于还是回忆起一些部分,上手后用了两个星期事件就可以基本无障碍进行编码开发;至于OpenGL,选用的是《OpenGL三维图形系统开发与实用技术》和网上流行的NEHE教程。
由于这两个教程都是使用C语言编写的OpenGL Demo,而我个人是使用单文档的SDI在进行,因此在学习和移植过程中也走了一些弯路,颇为不易,现在记录为一个笔记,写到何处就是作者学习到何处。一方面是总结,免得将来忘记;另一方面是为了给新学的人一些借鉴。为了简洁,本文将讲述最重要的部分,即如何编码实现功能。
――――――――――――――――――――――――――――――――――
OpenGL是SGI(快破产了)的一个开放三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。由于它与OS无关,故而在某个OS上使用的话,OS必须提供像素格式管理(PixelFormat)和渲染环境管理(RenderContext)。
OpenGL图形库有多个函数:
l 核心函数有115个,它们是最基本的函数,其前缀是gl;
l OpenGL实用库(OpenGL utility library,GLU)的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为glu;
l OpenGL辅助库(OpenGL auxiliarylibrary,GLAUX)的函数是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。
此外,还有六个WGL函数非常重要,专门用于OpenGL和OS窗口系统的联接,其前缀为wgl,主要用于创建和选择图形设备上下文(renderingcontexts RC)以及在窗口内任一位置显示字符位图。这些功能是OS对OpenGL的唯一补充。
另外,还有五个Win32函数用来处理像素格式(pixel formats)和双缓存。由于它们是对Win32系统的扩展,因此不能应用在其它OpenGL平台上。
在不同的OS上运行OpenGL,其关键在于如何将OpenGL与不同的操作系统下的窗口系统联系起来(废话一句,不过却是很重要的一点,只有在联系了OS的窗口系统后,我们才能在这个窗口上进行图形绘制)。如果调用OpenGL辅助库窗口管理函数,则不用考虑这些问题。
下面简要介绍在WindowsNT下OpenGL的程序设计关键。
首先我们给出一个使用OpenGL的API直接写的MFC Console程序,使用的是辅助库函数,因此比较简单,我们只介绍下代码,以后的写法不会使用这种控制台程序的方式,而是使用MFC的SDI:
首先需要在Settings/Project Settings/Link/[Object/Library Module]中键入:opengl32.lib glu32.lib glaux.lib,以引入OpenGL的函数库:
// CConGL.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#pragma warning(disable : 4305)
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
void myInit(void);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK myDisplay(void);
void myInit()
{
//清除背景颜色
glClearColor(0.0,0.0,0.0,0.0);
//图形绘制模式
glShadeModel(GL_FLAT);
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
//窗口改变时视口变化
glViewport(0,0,w,h);
}
void CALLBACK myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
//图形绘制颜色
glColor4f(0.2,0.6,1.0,1.0);
//设置旋转
glRotatef(60.0,1.0,1.0,1.0);
//绘制图形
auxWireSphere(1.0);
//绘制完成
glFlush();
}
int main(int argc, char* argv[])
{
//初始化显示模式
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,400,400);
auxInitWindow("first application");
myInit();
auxReshapeFunc(myReshape);
auxMainLoop(myDisplay);
return 0;
}
Related Items
Categories :
OpenGL
Comments
我的位图文件为什么打不开File=fopen(Filename,"r");
我自己裁剪的16*16的一个图片 格式是bmp的
怎么不说话呢 ~你不上你的博客的么~
你说“如果调用OpenGL辅助库窗口管理函数,则不用考虑如何将OpenGL与不同的操作系统下的窗口系统联系起来”可是我现在在c#下来用OpenGL,可是我总是调用不了辅助库函数,想请问你该怎么调用?你了解这块吗?希望您给点指点!
很久没摸过OpenGL了,而且开发也是在VC里做的,对C#调用不太了解。
建议版主学习C++不要看书,呵呵,尤其别看翻译过来的中文版的内幕之类的东东。建议你看看Bjarne Stroustrup的文章就够了,他早期的文献有关于C++的教程,非常简单。不要告诉我你不知道他是谁啊!
Leave a comment
Or, take a look at Archives and Categories
你好 ~
我昨天按照你说的做了,但出来的结果只是一个黑色的窗口,没有OPENGL绘图内容,请问是为什么? 那个设置像素格式函数和设置逻辑调色板函数每个人的都不一样么,该如何设置?
还有我发现你的一个小小的笔误 m_hRC::wglCreateContext(m_pDC->GetSafeHdc());应该是 m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());
他吧 加了个等号~~~