计算机图形学
文章平均质量分 85
记录学习图形学过程的点滴
Jack Mai
Stay hungry.
展开
-
《用两天学习光线追踪》5.混合密度函数采样
本项目参考自《Ray Tracing in One Weekend》系列。项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》3.球体和表面法向量《用两天学习光线追踪》4.封装成类《用两天学习光线追踪》5.抗锯齿《用两天学习光线追踪》6.漫反射材质《用两天学习光线追踪》7.反射向量和金属材质《用两天原创 2020-11-09 20:30:20 · 353 阅读 · 0 评论 -
《用余生学习光线追踪》4.直接对光照采样
我们希望尽可能地往重要的方向采样,但在各方向均匀采样,并不会使得重要方向的采样数量变多。接下来,我们人为地让更多的射线往光照的方向采样。我们可以向着光源的位置生成一个随机的方向,只需在光源材质上随机选取一个点,然后向着这个点的位置生成射线。但我们还需要知道这个pdf(direction)。假设光源的面积为AAA,如果对这个光源表面随机采样,则该光源表面的pdf为1/A1/A1/A,但如果要从一个定义了方向的单位球的球心为起点,发射射线到这个光源表面,则需要求解对应的pdf公式。如上图所示,dAdAd原创 2020-11-07 15:44:28 · 753 阅读 · 0 评论 -
《用余生学习光线追踪》3.生成球坐标随机方向
本项目参考自《Ray Tracing in One Weekend》系列。项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》3.球体和表面法向量《用两天学习光线追踪》4.封装成类《用两天学习光线追踪》5.抗锯齿《用两天学习光线追踪》6.漫反射材质《用两天学习光线追踪》7.反射向量和金属材质《用两天原创 2020-11-06 19:44:30 · 571 阅读 · 0 评论 -
《用余生学习光线追踪》2.光照散射与重要性采样
本项目参考自《Ray Tracing in One Weekend》系列。项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》3.球体和表面法向量《用两天学习光线追踪》4.封装成类《用两天学习光线追踪》5.抗锯齿《用两天学习光线追踪》6.漫反射材质《用两天学习光线追踪》7.反射向量和金属材质《用两天原创 2020-11-05 21:58:45 · 746 阅读 · 0 评论 -
《用余生学习光线追踪》1.蒙特卡洛积分与概率密度函数PDF
本项目参考自《Ray Tracing in One Weekend》系列。项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》3.球体和表面法向量《用两天学习光线追踪》4.封装成类《用两天学习光线追踪》5.抗锯齿《用两天学习光线追踪》6.漫反射材质《用两天学习光线追踪》7.反射向量和金属材质《用两天原创 2020-11-05 17:49:28 · 2079 阅读 · 1 评论 -
《用一周学习光线追踪》7.长方体和平移旋转
本项目参考自《Ray Tracing in One Weekend》系列。上接《用两天学习光线追踪》,继续学习光线追踪。本节将会实现长方体,并解释光线追踪的平移和旋转变换。原创 2020-05-15 10:22:47 · 976 阅读 · 0 评论 -
《用一周学习光线追踪》6.光照和轴对齐矩形
本项目参考自《Ray Tracing in One Weekend》系列。上接《用两天学习光线追踪》,继续学习光线追踪。本节将会新增自发光材质和轴对齐矩形,并渲染图形学教材中的经典场景Cornell Box。原创 2020-05-04 21:14:03 · 903 阅读 · 0 评论 -
《用一周学习光线追踪》5.球面纹理贴图
本项目参考自《Ray Tracing in One Weekend》系列。上接《用两天学习光线追踪》,继续学习光线追踪。本节主要介绍球面纹理贴图的映射公式、图片的读取及纹理贴图类的定义和使用。原创 2020-04-28 09:49:16 · 1917 阅读 · 1 评论 -
《用一周学习光线追踪》4.柏林噪声
本项目参考自《Ray Tracing in One Weekend》系列。上接《用两天学习光线追踪》,继续学习光线追踪。项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》3.球体和表面法向量《...原创 2020-04-09 01:40:54 · 834 阅读 · 0 评论 -
《用一周学习光线追踪》3.纯色纹理和棋盘纹理
本节将实现纯色纹理和棋盘纹理,回忆一下我们之前是如何定义lambertian的球体的:我们将各个通道的反射率赋值给lambertian的构造函数,然后发射的射线命中该位置后,如果产生了散射光线,将该位置的反射率作为系数,乘以散射光线所采样得到的颜色值,从而实现该材质对射线的颜色吸收与反射。原创 2020-03-16 00:42:54 · 1055 阅读 · 0 评论 -
《用一周学习光线追踪》2.BVH树、AABB相交检测
射线和物体的相交检测,是光线追踪器的主要时间瓶颈,目前时间复杂度是线性的。有两种方法可以将时间复杂度降低到对数级别:一是空间划分,二是物体划分。本节将用BVH实现物体划分。原创 2020-03-13 16:49:12 · 4040 阅读 · 2 评论 -
《用一周学习光线追踪》1.动态模糊
上一章《用两天学习光线追踪》中,我们制作了一个简单的光线追踪器。本节将会增加动态模糊的效果。代码改动:1.ray增加一个参数t。2.camera生成随机数并赋值给ray的t。3.增加moving_sphere类。原创 2020-03-13 16:06:31 · 1208 阅读 · 0 评论 -
《用两天学习光线追踪》10.散焦模糊
本节内容:1.新增相机的参数,实现一个带光圈可散焦模糊的相机。2.场景中随机生成更多的不同材质球体。原创 2020-03-02 17:18:44 · 1823 阅读 · 0 评论 -
《用两天学习光线追踪》9.可放置相机
本节目标:新增相机的参数,实现一个可放置的相机。原创 2020-03-02 17:18:25 · 1085 阅读 · 1 评论 -
《用两天学习光线追踪》8.折射向量和电介质
本节将会实现折射向量和电介质材质的光线追踪,例如玻璃材质。原创 2020-03-02 17:18:09 · 1390 阅读 · 0 评论 -
《用两天学习光线追踪》7.反射向量和金属材质
本节内容:1.封装材质类material,2.实现反射函数,3.实现金属材质类原创 2020-03-02 17:17:51 · 1618 阅读 · 0 评论 -
《用两天学习光线追踪》6.漫反射材质
本节将会是一个重大的转折点,我们将会看到光线在漫反射材质表面反射的效果。主要内容:漫反射材质的随机反射,及递归光线追踪的实现。原创 2020-03-02 17:17:05 · 2145 阅读 · 0 评论 -
《用两天学习光线追踪》5.抗锯齿
用现实生活中的相机拍照,很少会有锯齿,因为每个像素的颜色,其实是各种物体和背景的混合后得到的平均的颜色。我们可以用类似的求平均的方法,对光线追踪的像素进行采样。本节内容:1.将相机封装成类。2.生成[0,1)的随机数。3.随机采样并求平均。原创 2020-03-02 17:16:45 · 1512 阅读 · 0 评论 -
《用两天学习光线追踪》4.封装成类
场景中,如果有很多个球体怎么办呢?如果光线命中特殊材质后发射了反射怎么办?解决方案如下:1.将球体封装成类。2.一条射线的路径上可能会命中好几个球,因此要选出射线能命中的最近的球。3.用数组存储这些球。4.如果发射了反射等行为,则要记录上一条射线的命中信息,例如命中终点、命中点的法向量等。原创 2020-03-02 17:15:02 · 924 阅读 · 0 评论 -
《用两天学习光线追踪》3.球体和表面法向量
上一节中,我们以相机所处的原点(0,0,0)为起点,对屏幕的每个像素都发射一条射线,并实现了光线没有命中物体时,返回天空颜色的效果。但如果命中了物体,又该如何处理呢?本节目标:判断射线是否命中球体,并可视化球体的表面法向量。原创 2020-03-02 17:14:37 · 2594 阅读 · 0 评论 -
《用两天学习光线追踪》2.射线、简单相机和背景输出
本节目标:以相机所处的原点(0,0,0)为起点,对屏幕的每个像素都发射一条射线:①. 如果命中物体,就处理命中物体的情况,这种情况放到下节处理②. 如果没有命中,获取射线方向的单位向量的y值,从0到1对浅蓝色和白色进行插值,以模拟天空的颜色,最终将颜色值输出到屏幕。如下图所示:原创 2020-03-02 17:13:52 · 1858 阅读 · 0 评论 -
《用两天学习光线追踪》1.项目介绍和ppm图片输出
本项目参考自教程《Ray Tracing in One Weekend》,在跑通了所有例子之后,加上了自己的理解写成笔记,项目使用CPU多线程提速,并增加了GUI进度显示。项目链接:https://github.com/maijiaquan/RayTracing目录:《用两天学习光线追踪》1.项目介绍和ppm图片输出《用两天学习光线追踪》2.射线、简单相机和背景输出《用两天学习光线追踪》...原创 2020-03-01 22:00:00 · 3537 阅读 · 3 评论 -
折射向量的推导
对于折射,有个著名的公式:Snell’s lawsinθ1sinθ2=η2η1\dfrac{\sin\theta_1}{\sin\theta_2} = \dfrac{\eta_2}{\eta_1} sinθ2sinθ1=η1η2其中,θ1,θ2\theta_1,\theta_2θ1,θ2分别是入射角和折射角,η1,η2\eta_1, \eta_2η1,η2分别是两种...原创 2020-02-21 22:03:04 · 4039 阅读 · 3 评论 -
3D渲染管线中的物体剔除
在执行背面消除之前,要先进行物体剔除(Object Removal)。可以使用包围球测试来剔除物体,对每个物体,创建一个将其包围起来的球体,并判断球体是否位于视景体内。原创 2019-10-24 17:04:55 · 412 阅读 · 0 评论 -
3D渲染管线中的坐标变换
3D物体被渲染到屏幕之前,会经历以下的坐标变换: 局部坐标 Local Coordinates 世界坐标 World Coordinates 相机坐标 Camera Coordinates 透视坐标 Perspective Coordinates 屏幕坐标 Screen Coordinates在不考虑光照计算、着色处理和纹理映射,只考虑几何变换的情况下,3D渲染管线中的坐标变换流程如下:该变换流程,将3D模型的局部坐标,变换到屏幕坐标。本文先不考原创 2019-09-18 12:35:14 · 1936 阅读 · 0 评论 -
3D旋转矩阵的推导
2D中的旋转假设只绕原点旋转,则可以通过一个参数θ来描述旋转量。假设逆时针为正方向,下图展示了基向量p,q绕原点旋转θ度之后得到的新的基向量p′和q′。3D中绕坐标轴的旋转绕z轴的旋转矩阵绕x轴的旋转矩阵绕y轴的旋转矩阵原创 2019-09-16 17:18:45 · 3330 阅读 · 0 评论 -
现代OpenGL教程(九):基础光照——材质(ImGui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org和learnopengl.com/,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代O...原创 2019-01-11 21:55:31 · 1866 阅读 · 0 评论 -
现代OpenGL教程(八):基础光照——Phong光照模型(ImGui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org和learnopengl.com/,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代O...原创 2019-01-05 21:52:20 · 4414 阅读 · 5 评论 -
现代OpenGL教程(七):基础光照——颜色(imgui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org和learnopengl.com/,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代O...原创 2019-01-04 16:59:06 · 3089 阅读 · 0 评论 -
现代OpenGL教程(六):鼠标和键盘(imgui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代OpenGL教程(一):绘制三角形(...原创 2019-01-03 21:49:04 · 3885 阅读 · 0 评论 -
现代OpenGL教程(五):obj文件和obj模型加载(imgui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代OpenGL教程(一):绘制三角形(...原创 2019-01-02 21:32:15 · 5849 阅读 · 2 评论 -
现代OpenGL教程(四):立方体纹理贴图(imgui+OpenGL3.3)
前言:该系列教程主要参考自网站www.opengl-tutorial.org,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3w换成了glew,glew具体环境配置可参考:OpenGL环境配置教程:VS2012 + GLEW + GLFW + GLM。教程目录(持续更新中):现代OpenGL教程(一):绘制三角形(...原创 2018-12-30 21:34:25 · 4598 阅读 · 0 评论 -
现代OpenGL教程(三):绘制彩色立方体(imgui+OpenGL3.3)
前言:imgui 是一个开源的GUI框架,自带的例子里面直接集成了glfw+gl3w环境,本例使用的版本是imgui v1.61,下载地址:https://github.com/ocornut/imgui/tags。本教程在上一个教程现代OpenGL教程(二):矩阵变换(imgui+OpenGL3.3)的基础上进行修改,绘制一个彩色立方体。教程目录(持续更新中):现代OpenGL教程(一):...原创 2018-12-29 17:25:07 · 7299 阅读 · 1 评论 -
现代OpenGL教程(二):矩阵变换(imgui+OpenGL3.3)
前言:imgui 是一个开源的GUI框架,自带的例子里面直接集成了glfw+gl3w环境,本例使用的版本是imgui v1.61,下载地址:https://github.com/ocornut/imgui/tags教程目录(持续更新中):现代OpenGL教程(一):绘制三角形(imgui+OpenGL3.3)现代OpenGL教程(二):矩阵变换(imgui+OpenGL3.3)原创 2018-12-28 21:02:44 · 2360 阅读 · 1 评论 -
现代OpenGL教程(一):绘制三角形(imgui+OpenGL3.3)
前言:imgui 是一个开源的GUI框架,自带的例子里面直接集成了glfw+gl3w环境,本例使用的版本是imgui v1.61,下载地址:https://github.com/ocornut/imgui/tags教程目录(持续更新中):现代OpenGL教程(一):绘制三角形(imgui+OpenGL3.3)现代OpenGL教程(二):矩阵变换(imgui+OpenGL3.3)原创 2018-12-28 08:24:37 · 11776 阅读 · 5 评论 -
OpenGL环境配置教程:vs2012-glew-glfw-glm
前言最近入坑图形学,打算从最基础的OpenGL学起,http://www.opengl-tutorial.org/ 是一个不错的OpenGL入门网站,教程代码的环境都配置好了,直接下载后CMake之后就能跑。现在手动再VS2012中把GLEW、GLFW、GLM配置一遍。环境如下:Visual Studio 2012GLEW 2.1.0GLFW 3.2.1GLM 0.9.7.1...原创 2018-12-05 14:09:55 · 1722 阅读 · 0 评论 -
3D渲染管线中的背面消除
背面消除在世界空间中进行,背面消除完成之后,再进行世界坐标到相机坐标的变换。背面消除工作原理如下:1. 物体的所有多边形的三个顶点以统一的方式进行标记,例如顺时针。2. 计算该根据多边形的两个向量,计算多边形的面法线(surface normal)3. 计算观察向量(view vector)4. 计算面法线和观察向量的点乘,若结果<=0,说明夹角大于90°,则标记多边形为背面5. 在后面的绘制中过滤掉有背面标记的多边形原创 2019-09-23 11:28:32 · 654 阅读 · 0 评论