计算机图形学(渲染方向)学习全攻略——学术科研篇

博主以前是打算做计算机视觉的,但是出于好奇,不幸进入了图形学的大坑。在学图形学中,有一些经验和方法,与大家分享一下。

这个博客文章我会不断进行更新,将适合的资料学习顺序进行总结。

准备阶段(一般是刚入大学的大学生)

首先需要学习编程语言,这里主要指C/C++,C++语言是图形学的基础编程语言,是绝对绕不开的。

入门编程书:

建议的阅读顺序:The C Programming Language->C primer plus -> C++ primer 

推荐顺序理由:第一本书最简洁,例子和解释也都非常好,建议认真阅读,把里面每个程序都写一遍,然后一本一本地来读。

C primer plus可以零基础阅读,但是鉴于比较厚,还是放在第一本书后面读比较好。

C++ primer是需要有一定编程基础才能开始啃的,千万不要听别人瞎建议一上来就啃C++primer,这本书序言部分也说过,假定读者有编程的基础。C++ primer阅读的时候建议列一个提纲,将阅读过的内容目录整理一下,经常回顾,否则你很有可能学完一遍以后不知道自己学了什么,甚至学了一半就学不下去了。

《数据结构与算法》,虽然很多时候我们意识不到数据结构的重要性,但现代的图形学代码资源一般都充斥了大量的数据结构,比如堆栈和树,没有专门学习过数据结构是很难快速掌握一些原理的。

需要具备的数学知识:

高等数学,线性代数,概率论,复变函数(会一点就好,以后再慢慢拓展)

但是强烈建议在科研和学习中,每天抽固定的一两个小时来学习数学知识:高等代数、数学物理方法、信号与系统、随机过程、离散数学、数学分析、数值分析等科目都是图形学必备的数学基础,如果每天拿出一两个小时来学习这些东西,有针对性目的性地学习一下,经常做点题练习一下,用不了两年,你就会真的变成能够利用数学来解决问题的人。

数学能力编程能力是将高手和一般人区分开的唯一标准。

开始阶段(可以和准备阶段一起学习)

首先建议先学习光栅技术主导的渲染技术,因为毕竟目前游戏领域还是光栅为主导的,光栅学会了,对GPU管线等理解都有很多好处。当然也可以从光线追踪开始学起,其实差不太多。

有很多大佬说最好一上来自己做光栅引擎,这个见仁见智,我个人的想法是还是先学习一下主流的图形学编程方法,然后再自己动手做。

在学习前,可以在B站上看一下闫令琪大佬的计算机图形学入门,有个初步的认识:

GAMES-Webinar的个人空间_哔哩哔哩_Bilibili

图形学三大方向:仿真、渲染、建模都可以简单了解了解。讲真,一开始别人说起这个比较新的课程时我个人是带着有色眼镜去看待的,我不太相信图形学可以用视频来教学。但是不得不说这里面的内容还确实不错,很适合初学者学习了解,但是不要指望看个视频就能把所有理论公式都学会,仅当了解图形学里面有什么内容。

接下来的学习顺序:Learning OpenGL -> RayTracing in one weekend等三本书(Peter Ray tracing 三部曲)

每个都要从头到尾两遍以上,再考虑进入下一阶段。

之后再学习这个小教程Home · ssloy/tinyrenderer Wiki (github.com)

这个教程有两个部分需要学习,一是光线追踪器,二是光栅器。学习一下基本原理,还可以对上面的光线追踪三部曲的书中实现的代码进行一下统筹和优化

同时学习一下CUDA编程的方法:

《CUDA by Example.An Introduction to General-Purpose GPU Programming(特别简单,适合入门)》然后可以买一本《The CUDA Handbook(比较难,但是很全面)》用来当参考手册。

提高阶段

这个阶段可以看的书有很多,在进入这个阶段之前,确保自己真正学会了Learning OpenGL和光追三部曲这些教程里的内容。然后,就是圣经了:

成神必备之书,尽量全都读完,重点是实践,一定要自己编程操作一下。阅读顺序为,先读完一二三四章,然后剩下的一边优化自己的引擎一边学习,或者用到哪里学哪里。

对于图形学来说,离线和实时渲染没必要完全分得那么清楚,放在一起学最好。

《realistic-image-synthesis-using-photon-mapping》

《Spherical Harmonic Lighting:The Gritty Details》

《Robust Monte Carlo Methods for Light Transport Simulation》

《Real-Time Rendering 4th Edition》

《Advanced Global Illumination》

这些书可以从头到尾阅读和实验(相信我,图形学你不自己做实验基本上坚持不下来),也可以根据兴趣阅读,《Robust Monte Carlo Methods for Light Transport Simulation》是比较早的论文,但是非常经典,最佳博士论文。

(2023.9.6 补充:科研人员,如果不是来自图形学大组且没有导师指导,不建议学习BDPT和MLT等复杂算法,学了你也发不出什么论文,学神经渲染或者可微渲染或者nerf,水个论文毕业要紧)

我写的一个《PBRT》从零到全部吃透的系列电子小书,目前已经完成,发布在了我们的网站上:PBRT基础理论与代码实战 – Dezeming Family  教读者一步一步从零开始,不但掌握源码,还能自己构建一个PBRT引擎。同时我还在写这套系列书的续集——《PBRT——专业知识理论与代码实践》系列,将里面涉及的原理讲透彻。

基础巩固阶段

《Fundamentals of computer graphics steve-marschner》

是时候回来复习一下基础了。这本书不太建议从头到尾读,可能会比较枯燥,没事的时候翻一番,用到的时候仔细看就好。

之所以不把基础入门书放在最前面,主要是因为你阅读它并不能自己做出来一些好玩的demo,会使图形学学起来非常枯燥。

专业阶段

《GPU Germs》《GPU Pro》

《RayTracing Gems》

《各种论文……》

这个时候就不要从头到尾地学了,研究什么方向就去学什么方向就好了。尤其是对于一般院校的研究人员,在缺乏大佬指导以及缺乏同行交流的前提下,是没有多少时间和精力全都弄懂的。

各种论文之类的都根据自己的方向着重学习,找几篇文献综述,把里面的论文一篇一篇阅读完,建立在自己方向的基础,比如博主本人是医学影像体渲染方向,主要就是各种体渲染算法及其优化算法,以及先进的全局光照技术。

  • 58
    点赞
  • 318
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Java及⼤数据学习路线 1.Java学习路线 1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和Session 服务器端组件Filter 服务器端组件Listener 国际化 异步数据传输框架Ajax ⽂件的上传下载 1.3JavaEE框架 系统整体分层解耦框架spring 轻量级Web框架springmvc 轻量级持久层框架mybatis 服务器操作系统Linux 内存数据库Redis 项⽬架构、jar包管理⼯具Maven 1.4JavaEE⾼级 SVN/IDEA开发⼯具 分布式版本管理⼯具Git与Github Mysql⾼级 Mycat实现MySQL的分布式、分库分表、读写分离 Nginx反向代理、负载均衡、动静分离 JVM内存模型、参数调优 JUC线程⾼级 分布式架构注册中⼼Zookeeper 虚拟化应⽤容器Docker 全⽂检索引擎ElasticSearch 消息队列RabbitMQ 前端VUE/ES6 2⼤数据学习路线 2.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 2.2JavaEE核⼼ HTML、CSS、JS、XML Tomcat服务器、HTTP协议、JSP、Servlet组件 EL表达式、会话控制、⽂件的上传下载 Filter组件、Listener组件、异步传输框架AJax 系统整体分层解耦框架spring 轻量级Web框架springmvc 轻量级持久层框架mybatis 项⽬架构、jar包管理⼯具Maven 服务器操作系统Linux 内存数据库Redis Mysql⾼级 命令解析器Shell 2.3Hadoop⽣态体系 ⼤数据存储框架Hadoop 分布式服务管理框架zookeeper hadoop⾼可⽤HA 数据仓库hive 数据查询框架impala+kudu+clouderManager ⽇志采集传输框架flume/idea 分布式发布-订阅消息系统Kafka+监控器kafkaManager+kafkaMonitor 分布式⾮关系型数据库Hbase+Hbase⼆级索引创建⼯具Phoenix 任务调度框架Azkaban 数据查询框架Kylin+druid ⼤数据图形化⼯具Hue 分布式版本管理⼯具Git与Github 2.4 Spark/Flink⽣态体系 全⽂检索+⽇志搜集+数据可视化ELK 多范式编程语⾔Scala SparkCore/Spark SQL/Spark Streaming/Spark mlib Spark内核和优化 JVM/JUC python 数据结构 ⼤数据框架Flink 3 Java基础图谱 4 软件开发介绍 软件开发 软件,即⼀系列按照特定顺序组织的计算机数据和指令的集合。有系统软 件和应⽤软件之分。 4.1 ⼈机交互⽅式 图形化界⾯(Graphical User Interface GUI)这种⽅式简单直观,使⽤ 者易于接受,容易上⼿操作。 命令⾏⽅式(Command Line Interface CLI):需要有⼀个控制台,输 ⼊特定的指令,让计算机完成⼀些操作。较为⿇烦,需要记录住⼀些 命令。 Pascal之⽗Nicklaus Wirth: "Algorithms+Data Structures=Programs" 4 .2常⽤的DOS命令 dir : 列出当前⽬录下的⽂件以及⽂件夹 md : 创建⽬录 rd : 删除⽬录 cd : 进⼊指定⽬录 cd… : 退回到上⼀级⽬录 cd: 退回到根⽬录 del : 删除⽂件 exit : 退出 dos 命令⾏ 补充:echo javase>1.doc
第1章绪论 1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教学 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形学研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科学计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数学描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dezeming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值