高效学习OpenGL之执行多个显示列表glListBase(),glCallLists()
来源:互联网 发布:plc编程自制功能块 编辑:程序博客网 时间:2024/05/17 22:47
#include <GL/glut.h>
002.
#include <stdlib.h>
003.
#include <string.h>
004.
005.
#define PT
1
006.
#define STROKE
2
007.
#define END
3
008.
009.
typedef struct charpoint {
010.
GLfloat x, y;
011.
int
type;
012.
} CP;
013.
014.
CP Adata[] = {
015.
{
0
,
0
, PT}, {
0
,
9
, PT}, {
1
,
10
, PT}, {
4
,
10
, PT},
016.
{
5
,
9
, PT}, {
5
,
0
, STROKE}, {
0
,
5
, PT}, {
5
,
5
, END}
017.
};
018.
019.
CP Edata[] = {
020.
{
5
,
0
, PT}, {
0
,
0
, PT}, {
0
,
10
, PT}, {
5
,
10
, STROKE},
021.
{
0
,
5
, PT}, {
4
,
5
, END}
022.
};
023.
024.
CP Pdata[] = {
025.
{
0
,
0
, PT}, {
0
,
10
, PT}, {
4
,
10
, PT}, {
5
,
9
, PT}, {
5
,
6
, PT},
026.
{
4
,
5
, PT}, {
0
,
5
, END}
027.
};
028.
029.
CP Rdata[] = {
030.
{
0
,
0
, PT}, {
0
,
10
, PT}, {
4
,
10
, PT}, {
5
,
9
, PT}, {
5
,
6
, PT},
031.
{
4
,
5
, PT}, {
0
,
5
, STROKE}, {
3
,
5
, PT}, {
5
,
0
, END}
032.
};
033.
034.
CP Sdata[] = {
035.
{
0
,
1
, PT}, {
1
,
0
, PT}, {
4
,
0
, PT}, {
5
,
1
, PT}, {
5
,
4
, PT},
036.
{
4
,
5
, PT}, {
1
,
5
, PT}, {
0
,
6
, PT}, {
0
,
9
, PT}, {
1
,
10
, PT},
037.
{
4
,
10
, PT}, {
5
,
9
, END}
038.
};
039.
040.
/* drawLetter() interprets the instructions from the array
041.
* for that letter and renders the letter with line segments.
042.
*/
043.
static
void
drawLetter(CP *l)
044.
{
045.
glBegin(GL_LINE_STRIP);
046.
while
(
1
) {
047.
switch
(l->type) {
048.
case
PT:
049.
glVertex2fv(&l->x);
050.
break
;
051.
case
STROKE:
052.
glVertex2fv(&l->x);
053.
glEnd();
054.
glBegin(GL_LINE_STRIP);
055.
break
;
056.
case
END:
057.
glVertex2fv(&l->x);
058.
glEnd();
059.
glTranslatef(
8.0
,
0.0
,
0.0
);
060.
return
;
061.
}
062.
l++;
063.
}
064.
}
065.
066.
/* Create a display list for each of 6 characters */
067.
static
void
init (
void
)
068.
{
069.
GLuint base;
070.
071.
glShadeModel (GL_FLAT);
072.
073.
base = glGenLists (
128
);
074.
glListBase(base);
//指定一个偏移量,它将与glCallListserv()函数中的
075.
//显示列表索引相加,以获取最终的显示列表索引
076.
glNewList(base+
'A'
, GL_COMPILE); drawLetter(Adata); glEndList();
077.
glNewList(base+
'E'
, GL_COMPILE); drawLetter(Edata); glEndList();
078.
glNewList(base+
'P'
, GL_COMPILE); drawLetter(Pdata); glEndList();
079.
glNewList(base+
'R'
, GL_COMPILE); drawLetter(Rdata); glEndList();
080.
glNewList(base+
'S'
, GL_COMPILE); drawLetter(Sdata); glEndList();
081.
glNewList(base+
' '
, GL_COMPILE); glTranslatef(
8.0
,
0.0
,
0.0
); glEndList();
082.
}
083.
084.
char
*test1 =
"A SPARE SERAPE APPEARS AS"
;
085.
char
*test2 =
"APES PREPARE RARE PEPPERS"
;
086.
087.
static
void
printStrokedString(
char
*s)
088.
{
089.
GLsizei len = strlen(s);
090.
glCallLists(len, GL_BYTE, (GLbyte *)s);
091.
//执行len个显示列表,被执行的显示列表的索引是通过把当前显示列表基址表示的偏移值(由glListBase()指定)
092.
//与s指向的数组中的有符号整型值相加得到的
093.
}
094.
095.
void
display(
void
)
096.
{
097.
glClear(GL_COLOR_BUFFER_BIT);
098.
glColor3f(
1.0
,
1.0
,
1.0
);
099.
glPushMatrix();
100.
glScalef(
2.0
,
2.0
,
2.0
);
101.
glTranslatef(
10.0
,
30.0
,
0.0
);
102.
printStrokedString(test1);
103.
glPopMatrix();
104.
glPushMatrix();
105.
glScalef(
2.0
,
2.0
,
2.0
);
106.
glTranslatef(
10.0
,
13.0
,
0.0
);
107.
printStrokedString(test2);
108.
glPopMatrix();
109.
glFlush();
110.
}
111.
112.
void
reshape(
int
w,
int
h)
113.
{
114.
glViewport(
0
,
0
, (GLsizei) w, (GLsizei) h);
115.
glMatrixMode (GL_PROJECTION);
116.
glLoadIdentity ();
117.
gluOrtho2D (
0.0
, (GLdouble) w,
0.0
, (GLdouble) h);
118.
}
119.
120.
void
keyboard(unsigned
char
key,
int
x,
int
y)
121.
{
122.
switch
(key) {
123.
case
' '
:
124.
glutPostRedisplay();
125.
break
;
126.
case
27
:
127.
exit(
0
);
128.
}
129.
}
130.
131.
/* Main Loop
132.
* Open window with initial window size, title bar,
133.
* RGBA display mode, and handle input events.
134.
*/
135.
int
main(
int
argc,
char
** argv)
136.
{
137.
glutInit(&argc, argv);
138.
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
139.
glutInitWindowSize (
440
,
120
);
140.
glutCreateWindow (
"stroke"
);
141.
init ();
142.
glutReshapeFunc(reshape);
143.
glutKeyboardFunc(keyboard);
144.
glutDisplayFunc(display);
145.
glutMainLoop();
146.
return
0
;
147.
}
0 0
- 《高效学习OpenGL》 之 执行多个显示列表 glListBase(), glCallLists()
- 高效学习OpenGL之执行多个显示列表glListBase(),glCallLists()
- 《高效学习OpenGL》 之 显示列表实例 glCallList(),glGenLists(),glNewList(),glEndList()
- 《高效学习OpenGL》 之 无法再显示列表中存储的函数
- 《高效学习OpenGL》 之 管理显示列表索引 glIsList(),glDeleteLists(),glGetIntegerv()
- 高效学习OpenGL之显示列表实例glCallList(),glGenLists(),glNewList(),glEndList()
- OpenGL 学习 显示列表
- OpenGL之显示列表
- OpenGL学习笔记:显示列表
- OpenGL学习笔记 显示列表
- OpenGL学习十二:显示列表
- 《高效学习OpenGL》 之 过滤
- OpenGL入门学习之八——使用显示列表
- 《高效学习OpenGL》之 openGL工作流程
- 《高效学习OpenGL》之 openGL绘图流程
- 《高效学习OpenGL》之 openGL句法
- 《高效学习OpenGL》之 openGL状态变量
- 《高效学习OpenGL》之 openGL变换
- git学习笔记2
- react native ES6语法规则记录
- java.lang.Math
- excel打开csv 出现乱码怎么解决
- java导出excel大量数据出现错误时解决办法
- 高效学习OpenGL之执行多个显示列表glListBase(),glCallLists()
- android学习笔记之基本事件的响应
- java.lang.IllegalStateException
- 十进制浮点数的二进制转换及存储
- 设计模式六原则
- MalformedJsonException
- caffe interface --- matlab
- 网络编程之URL和URLConnection
- window.close()在火狐中不起作用