OpenGL是如何运转的:在500行代码中的软件渲染器

简介: 本文作者通过简单的范例来介绍OpenGL是如何运作的。

在这一系列的文章中,我想向大家展示OpenGL通过编写其克隆来运作的方式(一种简化了很多的方式)。令人吃惊的是,我经常遇见一些在学习OpenGL/ DirectX的过程中连基础障碍都无法克服的人。因此,我已经准备了一系列较短的演讲,演讲结束后,我的学生会展示一些非常好的渲染器。

 

所以,任务被制定为以下:使用非第三方的函数库(尤其是图表类的),获得像这张图表一样的东西。

 


 

警告:这是一种可以轻率地复制OpenGL函数库结构的培训材料。它将成为一种软件渲染器。我不想说如何应用OpenGL,只想介绍一下OpenGL是如何运作的。我深信:不了解这个是无法用3D函数库写出有效申请的。

 

我将试着做出500行的最终代码。我的学生需要进行长达10到20个编程的时间才能开始制作这样一个渲染器。在输入的时候,我放进一个带有三维形体加纹理图像的实验文件。输出的时候,就会得到一个渲染器模型。不用绘画,这个程序就简单地创造出一张图画。

 

因为目标是使外部相关性达到最小,我只给我的学生上了一节允许使用TGA文件的课。它是那些支持图像处于RGB/RGBA/黑色和白色中最简单的模版之一。所以,作为一个起点,我们将得到一个和图片打交道的简单方法。在最开始的时候,你需要发现唯一的可行功能(除了加载和收集图片)就是为像素设置颜色的能力。

 

因为它没有画线段和三角形的功能,所以我们不得不人工做这些。我提供我的那些我与学生们同时写的源代码,但是我不建议大家用,因为没有意义。完整的代码在github可以得到,并且在那儿,你可以找到我提供给学生们的源代码。

 

#include "tgaimage.h"

const TGAColor white = TGAColor(255, 255, 255, 255);

const TGAColor red   = TGAColor(255, 0,   0,   255);

int main(int argc, char** argv) {

        TGAImage image(100, 100, TGAImage::RGB);

        image.set(52, 41, red);

        image.flip_vertically(); // i want to have the origin at the left bottom corner of the image

        image.write_tga_file("output.tga");`

        return 0;

}

 

输出tga,应该看到像这样的结果:


 

预告:一些用渲染器制作的例子。


 


 


 


 

我确实希望收到反馈的邮件(dmitry.sokolov@univ-lorraine.fr);如果你有任何问题,请与我联系。如果你是一名教师,希望采用这种材料来教你的学生,从而使得你的课程很受欢迎,那么无需我主动授权,只要发邮件告诉我即可。这会帮助我改进教程。


编译自:https://github.com/ssloy/tinyrenderer/wiki

作者: Dmitry V. Sokolov  译者:Daisy  校对:Wendy

 

 

 

 

 

 

目录
相关文章
|
7月前
|
存储 编解码 监控
C++与OpenGL结合实现的屏幕监控软件:高性能屏幕录制解决方案
使用C++和OpenGL结合,本文展示了如何创建高性能屏幕录制软件。通过OpenGL的`glReadPixels`获取屏幕图像,存储为视频文件,再利用C++的网络编程(如libcurl)将监控数据提交到网站。示例代码包括了屏幕捕获和数据上传的简单实现。
292 2
|
存储 传感器 编解码
Android OpenGL 渲染图像读取哪家强
glReadPixels 是 OpenGL ES 的 API ,OpenGL ES 2.0 和 3.0 均支持。 使用非常方便,下面一行代码即可搞定,但是效率也是最低的。
1297 0
Android OpenGL 渲染图像读取哪家强
|
7月前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
207 0
|
7月前
|
JavaScript C++
从OpenGL渲染的角度排查 creator native 局部换肤的问题
从OpenGL渲染的角度排查 creator native 局部换肤的问题
96 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
325 0
|
并行计算 C++
Opengl ES之YUV数据渲染
Opengl ES连载系列
182 0
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
|
缓存 算法 Java
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
1185 0
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
|
存储 缓存 Serverless
六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合
OpenGL 渲染技巧:深度测试、多边形偏移、 混合
343 0
六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合
|
算法 开发者
五、OpenGL 渲染技巧:正背面剔除
OpenGL 渲染技巧:正背面剔除
403 0
五、OpenGL 渲染技巧:正背面剔除