发信人: yxy (田丝丝#冬眠的小肥鹰), 信区: GAME_Designer 
标  题: OPENGL(2) 
发信站: BBS 水木清华站 (Thu Jan  8 18:28:19 1998) 
 
[编程入门] 
这里我将给出一个小例子让大家熟悉用辅助库的编程结构: 
 
// GLOS.H 
////////////////////////////////////////////////////////// 
// This is an OS specific header file 
//判别操作系统的基本头文件 
 
#include <windows.h> 
 
// disable data conversion warnings 
 
#pragma warning(disable : 4244)     // MIPS 
#pragma warning(disable : 4136)     // X86 
#pragma warning(disable : 4051)     // ALPHA 
////////////////////////////////////////////////////////// 
//opengl.cpp 
//主程序 
#include "glos.h" 
#include <GL/gl.h> 
#include <GL/glaux.h> 
#include "windows.h" 
 
void main(void) 

        /*初始化:*/ 
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        //窗口显示单缓存和RGB(彩色)模式 
        auxInitPosition(0,0,500,500); 
        //大小x=500 y=500 (0,0)是屏幕左上点 
        auxInitWindow("sample1"); 
        //窗口初始化,参数是标题 
        glClearColor(0.0,0.0,0.0,0.0); 
    //将窗口清为黑色 
        glClear(GL_COLOR_BUFFER_BIT); 
    //将颜色缓存清为glClearColor命令所设置的颜色 
        //即背景色 
 
        /*绘图*/ 
        glColor3f(1.0,0.0,0.0); 
        //选颜色(R,G,B),参数0<x<1,这里就是红色 
        glRectf(-0.5,-0.5,0.5,0.5); 
        //画个方块 
 
        glFlush(); 
        //强制绘图,不驻留缓存 
        _sleep(1000); 
        //windows函数,显示1秒(单位是毫秒) 

//end of sample 
根据注释,应该看出程序功能:显示红色方块(2D)一秒钟。 
主程序结构不外乎: 
 初始化 + 绘图 + 其它功能调用 
现在不用过分追究函数细节,知道是干什么的就可以乐,好吗? 
我想结束本节前让大家实现第一个3D的例子,很简单而且好看的, 
但是我们必须被迫不得不多学些东东: 
 
1.OPENGL函数、变量命名准则 
 
变量: 
前缀      类型                    对应C变量 
b         8-bit int               signed char 
s         16-bit int              short 
i         32-bit int              long 
f         32-bit float            float 
d         64-bit float            double 
ub        8-bit unsigned int      unsigned char 
us        16-bit unsigned int     unsigned short 
ui        32-bit unsigned int     unsigned long 
例如1.0f实际就是1.0,一般写成1.0f看上去好辨认一些。 
 
函数: 
函数参数类型作为函数后缀 
例如:glVertex2i(2,4)表明是opengl基本函数(gl-) 
                         是绘点的函数(-Vertex-) 
                         是两个整型参数(-2i) 
将来对一个函数掐头去尾就知道它是干什么的乐。 
 
2.CALLBACK函数 
是一些用来让系统调用的函数,系统要调用它们,例如显示、接受键盘输入... 
你就好比擂积木一样把它们列在主程序初始化后(顺序一般无关紧要), 
系统会自动执行它们,例如: 
void CALLBACK display(void)中你写好乐想画什么东东,然后主程序中使用 
auxMainLoop(display);就可以让这个东东一直显示乐,很类似VC中的OnPaint() 
 
3.OPENGL基本库的绘图方法 
 
glBegin(类型); 
 glColor3f(...); 
 glVertex(...) 
 glColor3f(...); 
 glVertex(...); 
 ... 
glEnd(); 
 
先由“类型”指定画什么平面: 
GL_POINTS 单个顶点集 
GL_LINES 多组线,2个点一条线 
GL_GL_POLYGON 单个简单填充凸多边形 
GL_TRAINGLES 多组三角型,3个点一个三角 
...用到在说吧(自己可以在VC HELP INDEX中查找) 
////////////////////////////////////////////////////// 
//sample.cpp 
 
#include "glos.h" 
#include <GL/gl.h> 
#include <GL/glaux.h> 
#include "windows.h" 
 
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
//这里不用管reshape(),只是一个用于窗口改变大小时的处理 
//与绘图无关,后面会讲到 
//这里的重点是display(),请注意绘图的方法 
void myinit(void) 

        /*初始化:*/ 
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        //窗口显示单缓存和RGB(彩色)模式 
        auxInitPosition(0,0,500,500); 
        //大小x=500 y=500 (0,0)是屏幕左上点 
        auxInitWindow("sample1"); 
        //窗口初始化,参数是标题 
        glClearColor(0.0,0.0,0.0,0.0); 
    //将窗口清为黑色 
        glClear(GL_COLOR_BUFFER_BIT); 
    //将颜色缓存清为glClearColor命令所设置的颜色 
        //即背景色 

 
void CALLBACK reshape(GLsizei w,GLsizei h) 

glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
if(w<=h) 
 glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 
         20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); 
else 
  glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 
         20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

 
void CALLBACK display(void) 

glBegin(GL_TRIANGLE_STRIP);//画连续填充的多个三角 
glColor3f(1.0,0.0,0.0); 
glVertex3f(15.0,0.0,0.0); 
glColor3f(0.0,1.0,0.0); 
glVertex3f(-15.0,0.0,0.0); 
glColor3f(0.0,0.0,1.0); 
glVertex3f(0.0,15.0,15.0); 
//第一个三角 
 
glColor3f(0.0,1.0,1.0); 
glVertex3f(10.0,15.0,-15.0); 
//第二个三角 
 
glColor3f(1.0,1.0,0.0); 
glVertex3f(15.0,0.0,0.0); 
//第三个三角 
 
glEnd(); 
glFlush(); 

 
void main(void) 

 
    myinit(); 
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 

//end of sample 
所谓连续填充就是1、2、3点组成三角1 
                2、3、4点组成三角2... 
这里一共画乐3个向连接的彩色三角,组成乐一个由三个彩色平面 
围成的空心三角椎...enjoy it 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.74.90]