opengl显示列表代码实现
时间: 2023-10-02 11:10:34 浏览: 42
以下是一个简单的OpenGL显示列表的示例代码:
// 创建一个显示列表
GLuint myList = glGenLists(1);
glNewList(myList, GL_COMPILE);
// 绘制图形
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
// 结束显示列表
glEndList();
// 调用显示列表
glCallList(myList);
// 删除显示列表
glDeleteLists(myList, 1);
在这个示例中,我们首先使用glGenLists函数创建一个新的显示列表,并使用glNewList函数开始定义它。在这个显示列表中,我们使用glBegin和glEnd函数定义一个简单的三角形。然后,我们使用glEndList函数结束显示列表的定义。
在我们需要调用显示列表的地方,我们使用glCallList函数来绘制我们之前定义的三角形。最后,我们使用glDeleteLists函数删除我们创建的显示列表。
请注意,这只是一个简单的示例,您可以使用更复杂的OpenGL命令来定义更复杂的显示列表。
相关问题
sierpinski地毯的opengl实现代码
以下是一个简单的OpenGL实现Sierpinski地毯的代码,使用C++编写:
```
#include <GL/glut.h>
void drawCarpet(int x, int y, int size) {
if (size <= 1) {
glBegin(GL_QUADS);
glVertex2i(x, y);
glVertex2i(x + size, y);
glVertex2i(x + size, y + size);
glVertex2i(x, y + size);
glEnd();
} else {
size /= 3;
drawCarpet(x, y, size);
drawCarpet(x + size, y, size);
drawCarpet(x + 2 * size, y, size);
drawCarpet(x, y + size, size);
drawCarpet(x + 2 * size, y + size, size);
drawCarpet(x, y + 2 * size, size);
drawCarpet(x + size, y + 2 * size, size);
drawCarpet(x + 2 * size, y + 2 * size, size);
}
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
drawCarpet(0, 0, 729);
glFlush();
}
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 729.0, 0.0, 729.0);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(729, 729);
glutInitWindowPosition(100, 100);
glutCreateWindow("Sierpinski Carpet");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
这个代码使用了递归来绘制Sierpinski地毯,绘制的过程是将一个正方形分成9个小正方形,中间的正方形不绘制,然后递归绘制剩下的8个小正方形,直到大小为1。在OpenGL中,我们使用`glBegin`和`glEnd`来指定一个图形的顶点,并使用`glColor`来设置颜色。在这个例子中,我们使用了`glOrtho`来设置正交投影矩阵,将图形显示在窗口中央。
koch岛的分形用OpenGL代码实现
Koch岛是一个分形图形,可以通过迭代地替换每个线段来生成。下面是一个使用OpenGL实现Koch岛的代码示例:
```c++
#include <GL/glut.h>
// 定义三角形三个顶点的坐标
GLfloat vertices[3][2]={{-0.5, -0.5}, {0.5, -0.5}, {0.0, 0.5}};
// 进行迭代替换的函数
void divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int m)
{
GLfloat v1[2], v2[2], v3[2];
int j;
if(m>0)
{
for(j=0; j<2; ++j) v1[j]=(a[j]+b[j])/2;
for(j=0; j<2; ++j) v2[j]=(a[j]+c[j])/2;
for(j=0; j<2; ++j) v3[j]=(b[j]+c[j])/2;
divide_triangle(a, v1, v2, m-1);
divide_triangle(c, v2, v3, m-1);
divide_triangle(b, v3, v1, m-1);
}
else triangle(a, b, c);
}
// 渲染三角形
void triangle(GLfloat *a, GLfloat *b, GLfloat *c)
{
glBegin(GL_TRIANGLES);
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
glEnd();
}
// OpenGL的显示回调函数
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
divide_triangle(vertices[0], vertices[1], vertices[2], 4);
glFlush();
}
// OpenGL的初始化函数
void init()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("Koch Island");
glutDisplayFunc(display);
init();
glutMainLoop();
return 0;
}
```
在该代码中,`divide_triangle` 函数对三角形进行迭代替换,并递归地调用自己。`triangle` 函数则用于渲染三角形。在 `display` 函数中,我们调用 `divide_triangle` 函数生成Koch岛,并调用 `glFlush` 函数刷新屏幕。
在 `init` 函数中,我们设置背景色、颜色、投影矩阵和模型视图矩阵。
在 `main` 函数中,我们初始化OpenGL和窗口,并注册回调函数。最后,我们进入主循环并等待窗口关闭。
需要注意的是,这个程序只是一个简单的例子,可能无法生成高质量的Koch岛。如果需要生成更加精细的分形图形,可能需要使用更加复杂的算法。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)