不装X的情况下如何通过opengl调用显卡在屏幕上直接画东西?

15 views
Skip to first unread message

Kermit.Mei

unread,
Aug 13, 2013, 10:32:11 AM8/13/13
to szlug
Dear all,

突发奇想,忍不住想了解一下,望各位给推荐点资料。

如题,我们一般调用opengl,都是借助一些中层库初始化一个
GL控件,然后在这些控件上进行绘制。
我想了解一下,在不装X的情况下,怎么直接通过OpenGL的API
直接调用显卡在屏幕上画东西,比如画个圈圈或者正方形之类的。

我Google了一下,但不知道用什么关键字来搜索这个问题,搜到
的结果都不是回答我这个问题的。因此像大家求助,给几个关键字也行,
多谢!

B.R
Kermit

ZHANG, Le

unread,
Aug 13, 2013, 1:08:37 PM8/13/13
to 深圳 Linux Unix 用户组
directfb


2013/8/13 Kermit.Mei <kermi...@gmail.com>
Kermit

--
您收到此邮件是因为您订阅了 Google 网上论坛的“Shenzhen (深圳) Linux Unix User Group”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 szlug+un...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out



--
ZHANG, Le
http://zhangle.co

Rico Wang

unread,
Aug 13, 2013, 8:33:12 PM8/13/13
to sz...@googlegroups.com
opengles 也可以
Sent from my BlackBerry

From: "ZHANG, Le" <robert....@gmail.com>
Date: Tue, 13 Aug 2013 10:08:37 -0700
To: 深圳 Linux Unix 用户组<sz...@googlegroups.com>
Subject: Re: [szlug] 不装X的情况下如何通过opengl调用显卡在屏幕上直接画东西?

Anders

unread,
Aug 13, 2013, 8:44:32 PM8/13/13
to sz...@googlegroups.com, 深圳 Linux Unix 用户组
+1

chiachen .L

unread,
Jul 4, 2025, 9:54:38 AMJul 4
to sz...@googlegroups.com
要通过 OpenGL 的 API 直接调用显卡在屏幕上绘制图形(如圆圈、正方形),需要结合窗口管理和 OpenGL 渲染流程。以下是基于 **C++** 和 **FreeGLUT**(简化窗口创建)的完整示例,步骤清晰且包含核心绘制逻辑: ### **一、准备工作** 1. **安装开发环境**: - Windows:安装 [MinGW](https://www.mingw-w64.org/) 或 [Visual Studio](https://visualstudio.microsoft.com/) - 安装 **FreeGLUT**(窗口管理库): - 下载地址:[FreeGLUT 官网](https://freeglut.sourceforge.net/) - 配置:将 `glut.h` 放入编译器 `include` 目录,`libfreeglut.a`(或 `.lib`)放入 `lib` 目录,运行时库(`freeglut.dll`)放入程序目录或系统 `PATH`。 ### **二、核心步骤与代码示例** OpenGL 绘制流程分为 **初始化**、**绘制函数**、**事件循环** 三部分,以下是绘制正方形和圆形的完整代码: ```cpp #include <GL/freeglut.h> #include <cmath> // 用于圆形绘制的三角函数 // 初始化函数:设置背景色、视口等 void init() { glClearColor(0.0, 0.0, 0.0, 1.0); // 黑色背景(RGBA) glMatrixMode(GL_PROJECTION); // 设置投影矩阵 gluOrtho2D(-10, 10, -10, 10); // 2D 正交投影(x: -10~10, y: -10~10) } // 绘制函数:所有图形绘制逻辑在此实现 void display() { glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲区 // 1. 绘制正方形(使用 GL_QUADS) glColor3f(1.0, 0.0, 0.0); // 红色(RGB) glBegin(GL_QUADS); // 开始绘制四边形 glVertex2f(-5.0, 5.0); // 左上角 glVertex2f(5.0, 5.0); // 右上角 glVertex2f(5.0, -5.0); // 右下角 glVertex2f(-5.0, -5.0); // 左下角 glEnd(); // 结束绘制 // 2. 绘制圆形(通过绘制多个三角形逼近) glColor3f(0.0, 1.0, 0.0); // 绿色(RGB) glBegin(GL_TRIANGLE_FAN); // 三角形扇绘制圆形 glVertex2f(0.0, 0.0); // 圆心 int num_segments = 100; // 细分段数(越大越平滑) for (int i = 0; i <= num_segments; i++) { float theta = 2.0f * 3.1415926f * float(i) / float(num_segments); float x = 3.0f * cosf(theta); // 半径 3.0 float y = 3.0f * sinf(theta); glVertex2f(x, y); } glEnd(); glFlush(); // 强制执行所有 OpenGL 命令 } // 主函数:初始化窗口并启动事件循环 int main(int argc, char**argv) { glutInit(&argc, argv); // 初始化 GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 单缓冲 + RGB 颜色模式 glutInitWindowSize(800, 800); // 窗口大小 800x800 glutInitWindowPosition(100, 100); // 窗口位置(屏幕左上角偏移) glutCreateWindow("OpenGL 绘制示例"); // 创建窗口并设置标题 init(); // 调用初始化函数 glutDisplayFunc(display); // 注册绘制回调函数 glutMainLoop(); // 启动事件循环(无限循环) return 0; } ``` ### **三、代码解析** 1.** 窗口初始化 **: - `glutInit`:初始化 GLUT 库。 - `glutCreateWindow`:创建窗口,参数为窗口标题。 - `gluOrtho2D`:设置 2D 正交投影,定义坐标系范围(此处 x 和 y 均为 -10~10)。 2.** 图形绘制 **: -** 正方形 **:使用 `GL_QUADS` 模式,通过 4 个顶点定义矩形。 -** 圆形 **:通过 `GL_TRIANGLE_FAN` 模式,用多个三角形逼近圆形(细分段数 `num_segments` 决定平滑度)。 - `glColor3f`:设置当前绘制颜色(RGB 范围 0.0~1.0)。 3.** 事件循环 **: - `glutDisplayFunc(display)`:注册绘制回调函数,每次窗口刷新时自动调用 `display`。 - `glutMainLoop`:启动无限循环,处理窗口事件(如刷新、关闭)。 ###** 四、编译与运行(Windows 环境)**1.** 使用 MinGW 编译 **: 将代码保存为 `opengl_demo.cpp`,在命令行执行: ```bash g++ opengl_demo.cpp -o opengl_demo.exe -lfreeglut -lopengl32 -lgdi32 ``` (需确保 MinGW 的 `bin` 目录和 FreeGLUT 的库目录已加入系统 `PATH`) 2.** 运行程序 **: 双击生成的 `opengl_demo.exe`,将显示一个黑色窗口,中央有红色正方形和绿色圆形。 ###** 五、扩展:交互与动画 **-** 动态更新 **:添加 `glutPostRedisplay()` 触发重绘,结合 `glutTimerFunc` 实现动画。 -** 鼠标/键盘交互 **:注册 `glutMouseFunc` 或 `glutKeyboardFunc` 回调函数,处理输入事件。 -** 3D 图形 **:切换到 3D 投影(`gluPerspective`),使用 `GL_TRIANGLES` 等绘制 3D 模型。 ###** 六、常见问题解决 **1.** 编译错误:找不到 freeglut.h **- 确保 FreeGLUT 的 `include` 目录已添加到编译器的头文件搜索路径。 2.** 运行时缺少 DLL **- 将 `freeglut.dll` 复制到程序目录或 `C:\Windows\System32` 目录。 3.** 图形不显示 **- 检查 `glBegin` 和 `glEnd` 是否配对,以及顶点坐标是否在投影范围内。 通过以上步骤,你可以直接使用 OpenGL API 调用显卡绘制图形。OpenGL 底层直接与显卡驱动交互,适合高性能图形渲染,后续可进一步学习纹理、光照等高级特性。
Reply all
Reply to author
Forward
0 new messages