📜  gldrawpixels 示例 (1)

📅  最后修改于: 2023-12-03 15:30:58.779000             🧑  作者: Mango

GLDrawPixels 示例

GLDrawPixels是OpenGL提供的一个函数,用于将一块CPU内存中的图像数据绘制到屏幕上,可以用来快速显示简单的2D图形或者实时视频帧。

函数原型
void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data);

参数解释:

  • width:绘制区域的宽度
  • height:绘制区域的高度
  • format:像素数据的格式,如GL_RGB、GL_RGBA等
  • type:像素数据的类型,如GL_INT、GL_FLOAT等
  • data:指向像素数据的指针
示例代码

下面是一个简单的GLDrawPixels示例代码,它从一个位图文件中读取像素数据,并调用glDrawPixels函数将图像绘制到屏幕上:

#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BMP_HEADER_SIZE 54

int width, height;
unsigned char *imageData;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glRasterPos2i(0, 0);
    glDrawPixels(width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, imageData);

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(640, 480);
    glutCreateWindow("GLDrawPixels Example");

    glClearColor(0.5, 0.5, 0.5, 1.0);

    FILE *fp = fopen("test.bmp", "rb");
    if (fp == NULL) {
        fprintf(stderr, "Failed to load image.\n");
        exit(EXIT_FAILURE);
    }

    unsigned char header[BMP_HEADER_SIZE];
    if (fread(header, 1, BMP_HEADER_SIZE, fp) != BMP_HEADER_SIZE) {
        fprintf(stderr, "Invalid BMP file.\n");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    width = *(int*)&header[18];
    height = *(int*)&header[22];

    int imageSize = width * height * 3; // 3 bytes per pixel
    imageData = (unsigned char*)malloc(imageSize);
    fseek(fp, BMP_HEADER_SIZE, SEEK_SET);
    fread(imageData, 1, imageSize, fp);
    fclose(fp);

    glutDisplayFunc(display);
    glutMainLoop();

    free(imageData);

    return 0;
}

在该示例代码中,我们使用了glClear函数来清空屏幕,使用glRasterPos2i函数来指定绘制起点,使用glDrawPixels函数来绘制图像。注意,本示例使用的是BMP位图文件,需要在头文件中定义BMP_HEADER_SIZE,以读取文件头。