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在进行,因此在学习和移植过程中也走了一些弯路,颇为不易,现在记录为一个笔记,写到何处就是作者学习到何处。一方面是总结,免得将来忘记;另一方面是为了给新学的人一些借鉴。为了简洁,本文将讲述最重要的部分,即如何编码实现功能。
――――――――――――――――――――――――――――――――――
OpenGLSGI(快破产了)的一个开放三维图形软件包,它独立于窗口系统操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。由于它与OS无关,故而在某个OS上使用的话,OS必须提供像素格式管理(PixelFormat)渲染环境管理(RenderContext)
OpenGL图形库有多个函数:
l         核心函数有115个,它们是最基本的函数,其前缀是gl
l         OpenGL实用库(OpenGL utility libraryGLU)的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为glu
l         OpenGL辅助库(OpenGL auxiliarylibraryGLAUX)的函数是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux
 
此外,还有六个WGL函数非常重要,专门用于OpenGLOS窗口系统的联接,其前缀为wgl,主要用于创建和选择图形设备上下文(renderingcontexts RC)以及在窗口内任一位置显示字符位图。这些功能是OSOpenGL的唯一补充。
另外,还有五个Win32函数用来处理像素格式(pixel formats)和双缓存。由于它们是对Win32系统的扩展,因此不能应用在其它OpenGL平台上。
 
在不同的OS上运行OpenGL,其关键在于如何将OpenGL与不同的操作系统下的窗口系统联系起来(废话一句,不过却是很重要的一点,只有在联系了OS的窗口系统后,我们才能在这个窗口上进行图形绘制)。如果调用OpenGL辅助库窗口管理函数,则不用考虑这些问题。
下面简要介绍在WindowsNTOpenGL的程序设计关键。
 
首先我们给出一个使用OpenGLAPI直接写的MFC Console程序,使用的是辅助库函数,因此比较简单,我们只介绍下代码,以后的写法不会使用这种控制台程序的方式,而是使用MFCSDI
首先需要在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 Tags : 计算机图形学  OpenGL  
Comments
2007-11-20 11:08:44

你好 ~
我昨天按照你说的做了,但出来的结果只是一个黑色的窗口,没有OPENGL绘图内容,请问是为什么? 那个设置像素格式函数和设置逻辑调色板函数每个人的都不一样么,该如何设置?
还有我发现你的一个小小的笔误 m_hRC::wglCreateContext(m_pDC->GetSafeHdc());应该是 m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());
他吧 加了个等号~~~

Posted by 刘立明 Gravatar Icon

2007-11-25 13:24:09

我的位图文件为什么打不开File=fopen(Filename,"r");
我自己裁剪的16*16的一个图片 格式是bmp的
怎么不说话呢 ~你不上你的博客的么~

Posted by 刘立明 Gravatar Icon

2008-1-13 10:06:10

你说“如果调用OpenGL辅助库窗口管理函数,则不用考虑如何将OpenGL与不同的操作系统下的窗口系统联系起来”可是我现在在c#下来用OpenGL,可是我总是调用不了辅助库函数,想请问你该怎么调用?你了解这块吗?希望您给点指点!

Posted by 朝阳 Gravatar Icon

2008-1-13 12:54:53

很久没摸过OpenGL了,而且开发也是在VC里做的,对C#调用不太了解。

Posted by 蒋波涛 Gravatar Icon

2008-3-7 18:29:33

建议版主学习C++不要看书,呵呵,尤其别看翻译过来的中文版的内幕之类的东东。建议你看看Bjarne Stroustrup的文章就够了,他早期的文献有关于C++的教程,非常简单。不要告诉我你不知道他是谁啊!

Posted by LuckySam Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档