课程
686 字
约 2 分钟
大三下
1.2 OpenGL 简单图形绘制
计算机图形学labs/lab01-opengl-drawing·更新于 2026-09-15
1.2 OpenGL 简单图形绘制
1. 任务描述
根据下面要求,在右侧修改代码空间,绘制出预期输出的图片。平台会对你编写的代码进行测试。
本关任务
利用 OpenGL 作为开发平台设计程序,生成一个光栅图。
预期输出

具体要求
- 使用黑色作为背景,采用
glClearColor来实现。 - 绘制一个矩形,颜色为
(1.0f, 1.0f, 1.0f),位置为左下角(-0.5f, -0.5f)到右上角(0.5f, 0.5f)。 - 绘制一个三角形,三个顶点颜色分别为
(1.0f, 0.0f, 0.0f),(0.0f, 1.0f, 0.0f),(0.0f, 0.0f, 1.0f),对应的顶点坐标分别为(0.0f, 1.0f),(0.8f, -0.5f),(-0.8f, -0.5f)。 - 绘制三个直径为 3 的点,颜色为
(1.0f, 0.0f, 0.0f),(0.0f, 1.0f, 0.0f),(0.0f, 0.0f, 1.0f),对应的顶点坐标分别为(-0.4f, -0.4f),(0.0f, 0.0f),(0.4f, 0.4f)。
相关知识
freeglut 的使用参考上一关。
开始你的任务吧,祝评测通过!
2. 我的回答
文件 step2/test2.cpp:
#include <GL/freeglut.h>
#include <stdio.h>
// 评测代码所用头文件-开始
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// 评测代码所用头文件-结束
void myDisplay(void)
{
// 请在此添加你的代码
/**** Begin **/
// 设置黑色背景并清除颜色缓冲区
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 绘制白色矩形 (左下角(-0.5,-0.5), 右上角(0.5,0.5))
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glVertex2f(-0.5f, -0.5f);
glVertex2f( 0.5f, -0.5f);
glVertex2f( 0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
// 绘制三角形,顶点颜色分别为红、绿、蓝 (平滑着色)
glShadeModel(GL_SMOOTH);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex2f(0.8f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex2f(-0.8f, -0.5f);
glEnd();
// 绘制三个直径为3的点,颜色分别为红、绿、蓝
glPointSize(3.0f);
glBegin(GL_POINTS);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(-0.4f, -0.4f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(0.4f, 0.4f);
glEnd();
/** End **/
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("Hello Point!");
glutDisplayFunc(&myDisplay);
glutMainLoopEvent();
/***以下为评测代码,与本次实验内容无关,请勿修改****/
GLubyte* pPixelData = (GLubyte*)malloc(400 * 400 * 3); //分配内存
GLint viewport[4] = {0};
glReadBuffer(GL_FRONT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGetIntegerv(GL_VIEWPORT, viewport);
glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
cv::Mat img;
std::vector<cv::Mat> imgPlanes;
img.create(400, 400, CV_8UC3);
cv::split(img, imgPlanes);
for(int i = 0; i < 400; i ++) {
unsigned char* plane0Ptr = imgPlanes[0].ptr<unsigned char>(i);
unsigned char* plane1Ptr = imgPlanes[1].ptr<unsigned char>(i);
unsigned char* plane2Ptr = imgPlanes[2].ptr<unsigned char>(i);
for(int j = 0; j < 400; j ++) {
int k = 3 * (i * 400 + j);
plane2Ptr[j] = pPixelData[k];
plane1Ptr[j] = pPixelData[k+1];
plane0Ptr[j] = pPixelData[k+2];
}
}
cv::merge(imgPlanes, img);
cv::flip(img, img ,0);
cv::namedWindow("openglGrab");
cv::imshow("openglGrab", img);
//cv::waitKey();
cv::imwrite("../img_step2/test.jpg", img);
return 0;
}












