PART ONE
code.cpp
#include <stdio.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#define width 222
#define height 207
struct Color { int r; int g; int b; int a;
}color{255,0,0,255};
GLubyte point[height][width][4];
void initPoint(int pixel_x,int pixel_y, int size)
{
float x_start = pixel_x - (float)size / 2;
float y_start = pixel_y - (float)size / 2;
for (int y = y_start; y < y_start + size; y++) {
for (int x = x_start; x < x_start + size; x++) {
point[y][x][0] = color.r;
point[y][x][1] = color.g;
point[y][x][2] = color.b;
point[y][x][3] = color.a;
}
}
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, point);
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(width, height);
glutInitWindowPosition(200, 100);
int id = glutCreateWindow("Point");
GLenum err = glewInit();
if (err != GLEW_OK) {
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(err));
return 1;
}
initPoint(width/2, height/2, 4);
glutDisplayFunc(render);
glutMainLoop();
return 0;
}
部分二
代码分析
1、通过初始化color获得像素颜色信息,初始化为{255, 0, 0, 0}为红色,像素以红色点亮。在main()函数中通过initPoint(width/2, height/2, 4)设置绘制点的像素坐标和点的大小。
2、通过GLubyte point[height][width][4]开辟一个和窗口一样大小的三维像素类型数组。在initPoint( , , )函数中,根据传入的参数和for循环对point[width][height][4]中对应屏幕中心坐标左右、上下两个像素的位置写入白色数据。
3、render():通过glDrawPixels( , , , , point)将像素数组point中的数据渲染到屏幕后缓冲区,交换前后缓冲区后,将像素数组point中的像素数据进行显示。