采用OpenGL的点、线、填充、字符函数,输出漂亮的图案,要求嵌入一张照片。请输出代码
时间: 2024-05-07 10:16:08 浏览: 141
由于没有具体的图案要求,下面提供一个简单的例子,展示如何在OpenGL中绘制点、线、填充和字符,并嵌入一张照片。
代码如下:
```
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
// 定义窗口大小
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
// 定义图片文件名
#define IMAGE_FILENAME "image.bmp"
// 定义图片宽度和高度
#define IMAGE_WIDTH 200
#define IMAGE_HEIGHT 200
// 定义图片像素数据缓存
unsigned char image[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
// 初始化函数
void init(void) {
// 打开深度测试
glEnable(GL_DEPTH_TEST);
// 打开光源
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// 设置光源位置
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// 设置材质颜色
GLfloat mat_diffuse[] = {0.7, 0.7, 0.7, 1.0};
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
// 读取图片数据
FILE *fp = fopen(IMAGE_FILENAME, "rb");
if (fp == NULL) {
printf("Failed to open image file %s\n", IMAGE_FILENAME);
exit(1);
}
fseek(fp, 54, SEEK_SET); // 跳过位图文件头
fread(image, sizeof(unsigned char), IMAGE_WIDTH * IMAGE_HEIGHT * 3, fp); // 读取像素数据
fclose(fp);
}
// 显示函数
void display(void) {
// 清空颜色缓存和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制点
glPointSize(5.0);
glBegin(GL_POINTS);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.5, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.5, 0.0);
glEnd();
// 绘制线
glLineWidth(3.0);
glBegin(GL_LINES);
glColor3f(1.0, 1.0, 0.0);
glVertex3f(-0.7, -0.7, 0.0);
glVertex3f(0.7, -0.7, 0.0);
glEnd();
// 绘制填充
glBegin(GL_QUADS);
glColor3f(0.0, 1.0, 1.0);
glVertex3f(-0.3, -0.3, 0.0);
glVertex3f(0.3, -0.3, 0.0);
glVertex3f(0.3, 0.3, 0.0);
glVertex3f(-0.3, 0.3, 0.0);
glEnd();
// 绘制字符
glRasterPos3f(-0.5, -0.5, 0.0);
glColor3f(1.0, 1.0, 1.0);
char text[] = "Hello, OpenGL!";
for (int i = 0; i < sizeof(text) - 1; ++i) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, text[i]);
}
// 绘制图片
glRasterPos3f(0.3, 0.3, 0.0);
glDrawPixels(IMAGE_WIDTH, IMAGE_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, image);
// 刷新缓存
glutSwapBuffers();
}
// 主函数
int main(int argc, char *argv[]) {
// 初始化GLUT库
glutInit(&argc, argv);
// 设置窗口大小和位置
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutInitWindowPosition(100, 100);
// 创建窗口
glutCreateWindow("OpenGL Demo");
// 初始化
init();
// 注册回调函数
glutDisplayFunc(display);
// 进入主循环
glutMainLoop();
return 0;
}
```
在代码中,我们首先定义了窗口大小和图片文件名等常量,并在初始化函数中打开了深度测试和光源,并读取了图片数据。
在显示函数中,我们分别使用OpenGL的点、线、填充和字符函数绘制了一些简单的图形,并使用glDrawPixels函数绘制了一张图片。
最后在主函数中,我们初始化了GLUT库并创建了窗口,并通过注册回调函数来响应窗口事件。在进入主循环后,程序会不断调用显示函数来更新窗口内容。
阅读全文