发信人: wend.bbs@bbs.cst.sh.cn (问道), 信区: cnprogram
标 题: OPENGL基础篇(1)
发信站: 生命玄机站 (Sat Feb 28 23:35:00 1998)
转信站: Lilac!ustcnews!cstshnews!lifebbs
[编程入门]
这里我将给出一个小例子让大家熟悉用辅助库的编程结构:
// 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]
--
※ 来源:·“生命玄机”站 bbs.cst.sh.cn·[FROM: Wend.bbs@bbs.net.tsi]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:13.672毫秒