荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: OPENGL(2)
发信站: BBS 荔园晨风站 (Thu Jan 21 23:16:29 1999), 转信


[编程入门]
这里我将给出一个小例子让大家熟悉用辅助库的编程结构:

// 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.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店