[从零构建光栅渲染器] 0.引言

23 中望CAD二次开发(ZRX C++)-自定义实体(二) 本文详细介绍了自定义图形实体,如何实现几何变换、捕捉、节点编辑,并介绍了CAD代理的概念。 阅读详情

[从零构建光栅渲染器] 0.引言

常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:https://github.com/ssloy/tinyrenderer。Sokolov的教程为英文,我翻译了其文章。

在学习过程中,有些内容可能您可能云里雾里,这时就需要查阅《计算机图形学》的书籍了,这里面的算法和公式可以帮助您理解代码。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

介绍

这是一个微型的软件渲染器,如果你正在寻找一个微型光线追踪器,在这里找到here。

我的源码是不相关的。阅读这个教程和实现你自己的渲染器。只有你经历了所有小细节后,你才能学会。

我非常希望你可以发反馈给我,邮箱:dmitry.sokolov@univ-lorraine.fr,当你有问题时,不要犹豫,赶紧联系我。

如果你是一名教师,并想采在课堂上用这个资料。非常欢迎这么去做,不需要任何授权。只需要发邮件通知我就行,可以帮助我提高这个课程。

在这系列文章中,我编写一个简单版本的软件来描述OpenGL是如何工作的。令人惊讶的是,我经常遇到学不会OpenGL/DirectX的人。因此,我准备了一个简短的讲义,我的学生都做出了不错的渲染器。

所以,这个任务如下:不使用第三方库,渲染得到下面这张图片:

提醒:这是一份可以轻松重复OpenGL结构的材料,它使一个渲染器。我不想教学如何去写OpenGL程序,我想教学OpenGL是如何工作的,我深信如果不理解工作原理是不会写出高效的3D程序的。

最后的代码只有500行。我的学生需要10-20小时制作这个渲染器。输入:包含多边形信息的文件+纹理图像。输出:程序会生成一幅图像。

目标是最大程度地减少外部的依赖,我为我的学生提供了一堂课去学习TGA文件。TGA是一种支持RGB/RGBA/Black/White的一种图像格式。所以,开始,我们获得一种简单的处理图片的方式。应该注意,除了加载和保存图像外,一开始的功能就是设置一个像素的颜色。

没有方法去绘制直线和三角形。我们需要自己去写,我提供我与我的学生共同抒写的源代码。但是我不建议你使用它,这是没有意义的。完整的代码在github上可以找到,在这里here你可以找到我给我学生的源代码。

#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;
}

output.tga 是这样的

使用此渲染器渲染的一些案例

Reference

  1. https://github.com/ssloy/tinyrenderer

  2. https://zhuanlan.zhihu.com/cgnotes

人工智能技术基础系列之:迁移学习 作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基 阅读详情

相关推荐

Jasper Report使用JSON数据源创建报表

最近在做一个项目小功能,表单结案要生成PDF报表。 起初,想用HTML模板(art-template模板引擎)编写,利用浏览器的打印功能保存成pdf文件下载。但是HTML编写好的模板,页码、页眉、页脚设置有坑,表单内容中的表格较多,表格不能设置跨页,导致跨页的表格内容与页眉重叠,没能解决这个问题。 于是,转战研究Jasper report生成报表,用更加专业的报表生成工具来做。刚开始,也是跌跌撞撞,遇到了很多问题,因为觉得没有退路了,必须要用这个搞出来,所以就硬着头皮去找各种资料。 主要使用的json

xiaogege2012的专栏 3319

TinyRenderer从零实现(一):lesson 0 准备工作

【代码】TinyRenderer从零实现(一):lesson 0 准备工作。

HR_Reborn的博客 351

win11本地部署openclaw实操第1集

OpenClaw 是一款开源、本地优先、可自托管的 AI 智能体(AI Agent)网关 / 自动化框架,核心是让 AI 从 “只聊天、给建议” 变成 “能在你电脑上真做事” 的数字助手。

weixin_44626085的博客 7126

计算机图形学入门踩坑记录2

计算机图形学入门踩坑记录2 0.前言 正在学习实现一个渲染器tinyrenderer,现记录如下, ssloy/tinyrenderer 链接: 目标github地址 上次看公式看了半天,最后整明白cross()函数计算的给定点对应三角形顶点的分量(一个0-1的比例);这次又碰见一个棘手的问题:第三节最后给出了一个课后题,用已有的贴图,贴在模型上。 1.不明白的地方 题主简要的介绍了几个概念: 1.字母f代表face 一个面(三角形),后面跟着的数字代表序号 2.依次为:顶点序号/纹理序号/?(第三个还没学

武功高强的盲僧的博客 340

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

YOLOv8改进:全网原创首发 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022

多尺度卷积注意力(MSCA),有效地提取上下文信息;1)作为注意力MSCA使用;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3844

[从零构建光栅渲染器] 4.透视投影

[从零构建光栅渲染器] 4.透视投影 非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:https://github.com/ssloy/tinyrenderer。Sokolov的教程为英文,我翻译了其文章。 在学习过程中,有些内容可能您可...

尹豆的博客 841

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

TinyRenderer(1):500行代码实现软件渲染器

Lsson 0 从头开始 这是一个微型软件光栅化程序,如果您正在寻找一个微型软件光线跟踪器,则可以在此处找到它。 我的源代码无关紧要。阅读本文并实现自己的渲染器。只有当您经历所有细微的细节时,您才能了解发生了什么。我确实希望获得电子邮件以获取反馈(dmitry.sokolov@univ-lorraine.fr);如有任何疑问,请随时与我联系。 如果您是老师,并且想在课堂上使用/适应这种材料非常欢迎这样做,则无需授权。只需通过邮件通知我,它将帮助我改进课程。 在本系列文章中,我想通过编写其克隆(一个简化的版

小lex的博客 2435

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

国科大学习资料--矩阵论(叶世伟)-期末考试题整理3

国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3

无名何许人的博客 1403

计算机图形学入门踩坑记录3

计算机图形学入门踩坑记录3 0.前言 正在学习实现一个渲染器tinyrenderer,现记录如下, ssloy/tinyrenderer 链接: 目标github地址 最近碰到一个很大的问题(代码编译不通过),花了2天时间才得以解决,就是第四节引入投影后。 1.不明白的地方 直接上图 我使用的环境是win10+vs2019,现在是2020年7月 题主:6年前提交代码至github,且带有makefile(猜测不是使用vs编译,而是使用make命令编译) 2.解决过程 1.编译时报错的内容有这几类: C44

武功高强的盲僧的博客 469

ParaView: 从 2 或 3 个标量创建向量

ParaView: 从 2 或 3 个标量创建向量

希望我的博客,能帮上你解决学习中工作中所遇到的问题 585

小程序 mathjs渲染公式_[从零构建光栅渲染器] 0.引言

非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:<https://github.com/ssloy/tinyrenderer>。在学习过程中,有些内容可能您可能云里雾里,这时就需要查阅《计算机图形学》的书籍了,这里面的算法和公...

weixin_40007515的博客 247

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[从零构建光栅渲染器] 总结

相应文章目录: [从零构建光栅渲染器] 0.引言 [从零构建光栅渲染器] 1.Bresenham 画线算法 [从零构建光栅渲染器] 2.三角形栅格化和背面剪裁 [从零构建光栅渲染器] 3.隐藏面剃除 z-buffer(深度缓冲) [从零构建光栅渲染器] 4.透视投影 [从零构建光栅渲染器] 5.移动摄像机 [从零构建光栅渲染器] 6. 顶点和片元着色器的工作原理 实现效果 说的话: 呼~ 光栅渲染器的内容基本结尾了。在学习整理过程中,查阅不少的资料和数学公式,其中对我帮助最大的就是《计算机图形学》、Lea

尹豆的博客 642

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

全网最简单的软渲染器

实现一个包含面剔除功能的软光栅渲染器,附带实现效果和工程源码,本系列将一直更新,欢迎您的参与!

少年的博客 939

单片机也能跑3D!零GPU手写光栅化渲染器

在嵌入式MCU上如何实现软件光栅化渲染器,不依赖GPU,用CPU将3D三角形转为2D像素。说明基本原理、数学基础、透视投影和重心坐标光栅化算法,并提供C语言代码。适用于简单3D图形显示。 控制字数。</think>本文介绍如何在单片机上实现软件光栅化渲染器,通过CPU将3D三角形转换为2D像素,不依赖GPU。内容涵盖光栅化原

miyamoto_musashi的博客 182

[从零构建光栅渲染器] 3.隐藏面剃除 z-buffer(深度缓冲)

非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:https://github.com/ssloy/tinyrenderer。Sokolov的教程为英文,我翻译了其文章。 在学习过程中,有些内容可能您可能云里雾里,这时就需要查阅《计算机图形...

尹豆的博客 916

matlab z变换离散化_光栅化渲染器的实现

引言图形渲染管线到底干了什么?这是任何一个学习图形学的人都无法逃避的问题。现代的API(如OpenGL,DirectX等)都将其具体过程封装好了,使用的时候只需传入相应参数,调用函数即可达到渲染的目的。尽管不了解它的原理并不影响使用,但为了编程可持续发展(雾),最好还是自己手动实现一下光栅化渲染器。以下我简单地阐述图形渲染管线的流程(以OpenGL辅以理解),我会用整体->细节的结构去阐述这...

weixin_39537298的博客 257

Qt渲染真相:CPU 软光栅、GPU 开洞与纯GPU

QWidget 默认走 CPU 软光栅。这不是落后,而是一种面向最大兼容性和稳定性的架构选择。Qt Quick / QML 默认走 GPU 硬件加速。这是面向现代视觉体验的架构选择。两者可以在同一个窗口中共存。通过或QRhiWidget,开发者可以在 CPU 绘制的 QWidget 主体中局部"开洞"嵌入 GPU 渲染区域。混合渲染通过 Framebuffer 隔离与合成机制实现,但需要为此支付 GPU → CPU 数据同步的性能代价。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1065

不止于笔记:用GAMES101里的图形学原理,手把手实现一个WebGL迷你渲染器

本文基于GAMES101课程中的计算机图形学原理,详细介绍了如何从零开始实现一个WebGL迷你渲染器。通过将理论转化为实践,包括投影矩阵实现、三角形光栅化、Z-Buffer优化等核心算法,帮助开发者深入理解图形学概念并应用于实际项目。文章还涵盖了Phong光照模型、阴影映射等高级技术,适合希望提升WebGL开发技能的读者。

weixin_33709364的博客 466

FilmCraft 文本引擎 filmcraft-text:从字体解析到抗锯齿光栅化的纯 Rust 渲染管线

FilmCraft 的图形字幕、烧录字幕(caption burn-in)以及 Timecode / Clip Name 特效都由 `filmcraft-text` 这个 L1 层文本引擎驱动:它用纯 Rust 实现字体数据库、OpenType shaping、双向排版、段落布局、自研抗锯齿光栅化与描边/阴影运算,并且能直接构建到 `wasm32-unknown-unknown` 上供 Web 端

gitblog_00815的博客 241

传统渲染与DLSS2.0的对比

调研大作业 在这次调研过程中先了解了一下下渲染,之后从传统抗锯齿算法和传统超分辨率算法两个角度与DLSS2.0对比,探究DLSS2.0的意义。 引言 所有的计算性能仿佛就是一块蛋糕,每当你开启新的技术,蛋糕就要被切除一块,而如果你开启软阴影、全局光照、超级采样,那么蛋糕当中的极大部分就会被砍掉,或者说硬件性能守恒,这意味着除非更换硬件,否则没有办法在不削弱一部分体验的前提中提高你另一部分的体验(在大多时候都是游戏),这点就注定很多的优化软件都是基于歪理邪说,道理很简单,如果你不升级配置,或者不超频,那么你的

xiaochu233的博客 6224

一个能让渲染性能提高100倍的办法

GPU 光线追踪是当今的热门话题,所以让我们来谈谈它!今天我们将光线追踪一个单个球体。使用片段着色器。是的,我知道。并不特别花哨。你可以在Shadertoy 上搜索并获得数百个示例甚至已经有一些很棒的教程教你如何做球体Imposter这就是我们要做的。那么我为什么要写另一篇关于它的文章呢?它甚至不是正确类型的 GPU 光线追踪!好吧,因为光线追踪部分并不是我真正要关注的部分。这篇文章更多的是关于如何在 Unity 中将不透明的光线追踪或光线行进物体注入到光栅化场景中。

2401_82584055的博客 1133

Genesis可视化系统:Vis模块实现渲染和可视化

在机器人仿真和物理AI(Physical AI)领域,可视化不仅是调试工具,更是理解复杂物理现象、验证算法正确性的关键窗口。传统仿真平台往往面临渲染性能瓶颈、视觉效果单一、功能局限等问题。Genesis的Vis模块通过统一的架构设计,提供了从实时交互式查看器到高保真光线追踪的全栈可视化解决方案。 本文将深入解析Genesis Vis模块的核心架构、功能特性及最佳实践,帮助开发者充分利用这一强大的...

gitblog_00921的博客 870

文献阅读:Stylized Neural Painting

摘要 文章提出了一种“风格化神经绘画方法”,不同于以往的风格迁移中pixel to pixel的映射,而是在矢量化环境中模仿艺术创作过程。 这个过程中具有一系列物理意义明确的参数,可以用于调整效果。 此外,文章还讨论了关于0梯度问题的参数搜索问题,并提出了从最优transportation的角度解决这个问题的方法。 引言 近年来,神经网络被广泛用于风格迁移。 但其中传统的图像到图像的迁移要么是一种像素到像素的映射,要么是一种连续的优化过程。 但是艺术家的创作是有笔划顺序的,这和传统的神

q274488181的博客 1787

R2-Gaussian: Rectifying Radiative Gaussian Splatting for Tomographic Reconstruction

本文提出R²-Gaussian,首个基于3D高斯splatting(3DGS)的稀疏视角断层重建框架。研究发现标准3DGS存在积分偏差问题,阻碍精确体数据检索。为此,作者提出三项创新:(1)定制化高斯核;(2)拓展光栅化至X射线成像;(3)开发CUDA可微体素化器。实验表明,该方法在合成和真实数据集上均优于现有方法,仅需4分钟即可生成高质量结果,比NeRF方法快12倍且性能相当。

m0_68654818的博客 1879
上一篇: 【图像算法】radon直线检测及绘制直线
下一篇: [从零构建光栅渲染器] 1.Bresenham 画线算法
尹豆(douysu)
博客等级 码龄9年 151粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值