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

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

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

 

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

 

083e3f1038cfd50464082dc43e4c413e9e3413ad

 

警告:这是一种可以轻率地复制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,应该看到像这样的结果:

3f731190c1a36ec4c96cb1e0fa97960541715557

 

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

97ba256d09d20fcc8925702ec1c89011252e8fe1

 

a069d44115eb83676d0d6170e2507abb0500511c

 

c1deeaea65dab08fd8726d69450f7757d0730ec8

 

d6d9d6b9b20f2f33ac3826f9b12f89d1f57f7ae3

 

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


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

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

 

 

 

 

 

 

目录
相关文章
|
存储 传感器 编解码
Android OpenGL 渲染图像读取哪家强
glReadPixels 是 OpenGL ES 的 API ,OpenGL ES 2.0 和 3.0 均支持。 使用非常方便,下面一行代码即可搞定,但是效率也是最低的。
1133 0
Android OpenGL 渲染图像读取哪家强
|
3月前
|
JavaScript C++
从OpenGL渲染的角度排查 creator native 局部换肤的问题
从OpenGL渲染的角度排查 creator native 局部换肤的问题
22 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
218 0
|
并行计算 C++
Opengl ES之YUV数据渲染
Opengl ES连载系列
130 0
|
缓存 算法 Java
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
1003 0
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
OpenGL学习笔记(二):OpenGL语法、渲染管线以及具体实现过程详解
|
存储 缓存 Serverless
六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合
OpenGL 渲染技巧:深度测试、多边形偏移、 混合
258 0
六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合
|
算法 开发者
五、OpenGL 渲染技巧:正背面剔除
OpenGL 渲染技巧:正背面剔除
355 0
五、OpenGL 渲染技巧:正背面剔除
|
API iOS开发 异构计算
三、OpenGL 渲染架构分析
OpenGL 渲染架构分析
317 0
三、OpenGL 渲染架构分析
|
异构计算 索引
OpenGL ES 内建变量以及多重纹理渲染计算
我们用GLSL来编写着色器代码时, 要了解他们的一些内建变量参数的含义. 本文就是对内建变量做一些介绍.
218 0