2000行代码实现软渲染引擎

代码地址:https://github.com/sdlwlxf1/tinyEngine
终于实现了自己的软渲染器,图形学的学习暂时告一段落。代码参考知乎上的韦易笑大神的回答,自己加入了很多功能包括:
  • 将原来的Gouraud着色改为phong着色
  • 加入一个平行光和4个点光源,物体材质
  • 背面剔除
  • 利用libpng读取外部纹理
  • 实现双线性纹理滤波和mipmap
  • 完整实现3D裁剪算法
  • 简单的投影
  • 利用sdl2实现了mac、ios、windows多平台支持
  • 3D漫游和object简单封装
知乎我的回答链接
工程目录:
  • external:依赖库文件
  • project:多平台项目工程以及跟平台相关代码
  • resources:核心代码和资源
依赖库:

跨平台的多媒体开发函数库,非常好用,cocos2dx也使用到了它哦

版本是SDL2-2.0.5,我已经交叉编译成了静态库,可以直接使用

跨平台的png格式读取处理库,如果静态库有问题,可以下载源代码下载地址,自行编译

多平台支持:

目前支持mac、ios、windows三个平台,android就暂时不弄了,过程太繁琐。

(windows的release好像有问题)

下面是重点!!

想要通过该工程学习光栅化渲染的同学,请务必备好以下两本书籍:

  • 《3D数学基础:图形与游戏开发》(建议认真看完)
  • 《3D游戏编程大师技巧》上下册

还有其他一些其他资料可以辅助理解

《[计算机图形学].(美国)Peter.Shirley》

learnopengl-cn一个学习opengl的网站,讲解光影部分挺好

代码简介
tiny3D.h

核心的数学算法和光栅化渲染实现,掌握了它可以说你就彻底弄明白了光栅化渲染

数学部分,全部是重点,特别是矩阵操作等,透视矩阵和旋转矩阵,是重中之重。

光栅化部分,为了实现phong光照加入了重心坐标计算,可能还有更好的实现方法,有能力的同学可以重构之。

main.c

非核心代码,包括sdl和纹理处理,有能力的同学可以自己实现并移植到任何平台

关于学习方法

因为我也是通过参考大神韦易笑的代码来学习图形学的。这里我可以提供一些我的学习经验

首先要端正自己的学习态度,不要认为软渲染有多难,看整个实现也不过1000行左右代码,当然也不要被这微小的代码量所迷惑,量少就意味每一行代码每一个函数都潜藏着巨大的知识量。如果有不明白的,一定要查阅上面提到的两本书,比如透视和旋转的算法公式,最好都要弄明白推导过程。然后自己实现一遍代码,通过实践加深对原理的理解。

数学部分在于理解,光栅化部分在于实现

请认真实现自己的光栅化部分,每个人的实现方法都不同,也许你的实现会更高效

个人认为软渲染是学习图形学的一个关键点。

等你也实现了自己的软渲染引擎,再看unity3D和shader,就会有一种醍醐灌顶的感觉,甚至可以自行脑补其实现方法呢

下面是截图:

转载于:https://www.cnblogs.com/sdlwlxf/p/6540452.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到 (2)设置适当的标志位,作为对记录进操作的 (3)写同名文件将覆盖原来文件的 2.增加学生记录 (1) 可在已有记录后面追加新的记录 (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 (1) 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次” 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录(3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进排序 (1) 可以按”学号”进升序和降序排列 (2) 可以按”姓名”进升序和降序排列 (3) 可以按”名次”进升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值