图形学100问

前言

自问自答100个图形学问题。

rayTracing与graphic pipeline区别?

理论

坐标系

  • 什么是线性变换?
  • 为什么要引入齐次坐标系?
  • 存在那些坐标空间,各个空间的转换关系?
  • 透视的特点是怎样的?
  • 怎么可视化的理解透视行为?
  • 屏幕坐标的z与三维空间的z的关系是?
  • 图形学上的z与w的区别?为什么引入第四维度的w?
  • z-test中,为什么一定要用透视后的z? 能不能用世界坐标系的z?
  • z-interpolation中,参与插值的(x,y)有什么特点?
  • XV-A-RY中,插值时,用的(x,y)要有什么特点,在sampleShading/VRS等情况下,(x,y)是啥位置?

Graphics Pipeline & Rasterization

  • 从伪代码的角度,对比光栅化与光线追踪?
  • 从搜索的角度,如何理解光栅化与光纤追踪?
  • 从存储信息的角度,光栅化与光线追踪分别要存储什么信息?
  • 光栅化的优点是?(省内存空间)从量化的角度说明光栅化节省空间的分析?
  • 光栅化的限制?说明光栅化有哪些缺陷?
    (primitive类型有限制,antifacts,阴影/透明度无统一的处理方式,存在一定程度的overdraw)
  • 光线追踪的优点?(可以渲染一切,容易实现递归)
  • 光线追踪的缺点?(硬件难以实现:内存相关性差,需要在内存中加载整个场景;)
  • 光栅化流水线的输入时什么?
  • 光栅化流水线的输出时是什么?
  • 光栅化流水线分为几个环节?

ANS
sdf
sdf

  • 光栅化几个环节的伪代码是如何写的?
  • 正交投影与透视投影的区别?
  • 在2D平面中如何理解透视?
  • 投影到平面后,会丢失深度信息,如何解决该问题?
  • 透视手算,如何从最简单的2D简化版,一步一步到OpenGL的透视复杂公式?

纹理采样

  1. 从函数的角度,如何理解TU纹理采样?

(Tex coordinate -> addr -> data -> filtered data)

  1. TU中有哪些要考虑的细节?
    2.1 指令有哪些类型?

(texture, texture bias, texture lod ?)

2.2 纹理资源有哪些?

(1D, 2D, 3D, cube, array ?)

2.3 数据格式? 数据类型?

(unorm, uint, snorm, sint, uscale, FP16, FP32)

2.4 寻址方式?

(纹理存储于内存的映射关系? 共有几种寻址方式?那6种?)

2.5 mipmap?(isotropic, anisotropic)
2.6 filter mode

(point, bilinear, trilinear)

  1. 图形学中,纹理有哪些应用?

(材料,材料细节,layer material , 预计算的光照)

  1. 纹理资源有哪些?用途分别是什么?

(1D, 2D, 3D, cube, array ?)

4.1 volume texture?

(也叫3D纹理,用于medical imaging data, wood or marble)

4.2 cubic texture? (Cubic Environment Mapping)
4.2.1 cubic texture的uv/ (x,y,z) 之间是怎么映射的?

程序员视角:
通过法向量指定纹理坐标,而不需要具体指定那个面,那个uv。
立方体贴图有自己特有的属性,可以使用方向向量对它们索引和采样
硬件视角 — 插值:
通过法向量完成插值
硬件视角 — 采样:
将法向量 转换成那个面,面上那个点,然后去采样。

  1. 纹理映射
    5.1 纹理映射是映射的那两个domain?

(DomainA: points on triangle, DomainB: texture domain)

5.2 纹理映射的坐标系统变换是怎样的?

程序员视角
指定三角形三个顶点的纹理坐标。三角形中,其他点的纹理坐标是多少?在世界坐标系中是无法确定的。只有在透视后,才能确定。比如,透视后,才知道近大远小,近处的纹理就会多采集一些,远处的纹理便会少采集一些。
硬件视角
三角形三个定点的纹理坐标是由程序员指定的,不会随平移缩放等变化,但插值结果,即三角形内部点采样那些纹理点会受缩放/shear的影响,但不受平移/旋转的影响。
纹理的attribute在vertex shading不管做任何变化都不需要跟着变。但vs变化会影响三角形中pixel的个数,影响三角形每个点的z,这些变量进而会影响三角形中每个点的纹理坐标。
naiive理解:
先在世界坐标系贴好texture,然后做变化,平移/旋转不会影响texture,只有缩放/shear等影响texture结果。

5.2.1 上述问题两种思路,那个正确? 思路1: 在世界坐标系中,把纹理采集好,贴好,再透视到屏幕中。思路2: 先透视到屏幕中,再根据屏幕中的状态采集纹理。

思路1是朴素做法,思路2是进阶做法。

5.3 从texels到pixels的映射?texture space(连续,归一化坐标), texel space(离散,分散坐标)
6. 为什么纹理映射坐标系统引出归一化坐标?

程序员视角:
贴图时,无需关注具体图的大小,在一个归一化坐标系中操作。
硬件视角:
完成从归一化到个性化的转化
例子:
(以mipmap几层图为例,不同level图的大小不一样,如果用归一化坐标,不同level的texture都可以用同样的tex 坐标索引,这个过程就对不同level texture实现了归一化)

7 texture addressing Mode要解决什么问题? (解决在[0.0, 1.0]之间越界后的行为方式)
7.1 D3D定义了哪些方式?(WRAP, MIRROR, CLAMP, BORDER)
8. texture filtering要解决什么问题?(sample color value from texture for every pixel in the primitive’s on-screen image)
8.1 texture filtering 要解决哪些具体的问题?(blending of textures[diffuse, specular, multi-texture], magnifiled/minified, Nearest-point/Linear/mipmap/Anisotropic)
8.2 Magnification 与Minification的区别是什么?

Magnification: — texure需要放大以匹配screen
texel太小,多个pixel映射到一个texel,做插值。
Nearest, Bilinear,Bicubic
Minification: — antialiasing
texel太大,一个pixel映射到多个texel,需要做过滤/平均。

8.3 什么是Mip-map? Mip-maps有什么优点?

(Minimize aliasing effect, 速度快,开销固定,cache性能提升)

8.4 Mipmap Level如何选择?

(mipmap level:每一层都是原来的四分之一,quad -> pixel,每一层都按这个放到/缩小)
(level: 0 pixel/texel=20, 1 pixels/texel=21, -4 16 pixels per texel)

8.4.1 从一维角度,Mipmap Level选择的公式是咋样?(TODO)
8.4.1.1 为什么要用微分?

当pixel跳一个格子时,texel跳几个格子?

8.4.1.2 为什么要用log2?

一根木棍,每次折一半,折几次其长度恰好为1?
一个二进制表示的数字,每次除以2(砍掉一半/拿掉高位),什么时候值为1?
一个数字表示成2进制,需要多少bit?

8.4.1.3 一维的Mipmap Level选择的示意图
在这里插入图片描述

8.4.2 从二维角度,Mpmap Level选择的公式是咋样?

在这里插入图片描述

8.5 为什么要引出Anisotropic Filtering? 解决原来的什么问题?

8.6 假如X-VARY没有以quad的形式送给TU,那么TU该做如何处理?

问题:
Lod计算需要du/dx, dv/dy, 怎么计算?
方案1: 对于一个quad来说,做差就能算出来
方案2: 若只有一个pixel,如果能把斜率送进来,就能直接算出Lod

8.7

光线追踪

  1. rayTracing工作在什么坐标系? (世界坐标系/局部坐标系?)
  2. rayTracing中物体的组织结构是什么? (TLAS —> BLAS —> GEO)
    2.1 配置的粒度是多大? per GEO/BLAS/TLAS?
    2.2 程序的粒度是多大? per GEO/BLAS/TLAS?
    2.3 rayTracing的数据结构是咋样的?(物体数据,配置,指令,分别是怎样的?挂载结构/节点时怎么样的?)
  3. rayTracing的流程是怎样的?
    3.1 主流程的胶水是怎样的? 谁提供的?
    3.2 供主流程调用的子流程/函数有哪些?(Intersection shader/ any hit shader/ closest shader/ miss shader)
    3.3 各个子流程(如 Intersection shader)是如何调用硬件模块的?(intersection shader调用RTU,可以认为是一次新的调用,RTU部分是一个子子流程)
    3.4 胶水主程序中遍历的shader,与子流程中遍历的shader有何区别?
  4. rayTracing的递归是怎么做的?
    4.1 CSIS(calling shader functions inside other shaders) ?
    4.2 unroll展开,与merge是怎么做的? 即递与归,是怎么实现的?
    4.3 递归展开与合并,都是通过不同的warp实现,不同的warp分配不同的空间,因此省去了栈空间,整个过程会存在warp的依赖问题,这里有点儿像fixed function的in-order处理一样。
  5. ray的求交算法?
    5.1 ray与立方体(AABB)的求交算法?(一条光线,六个木板)
    5.2 ray与三角形的求交算法?()
    5.2.1 如何判断ray与三角形所在的平面相交? (存在一个点,即满足ray的方程,又满足平面的方程)
    5.2.2 如果上述问题成立,如何判断交点在三角形内部? (barycentric, 三个点的权重均大于0)
    5.2.3 ray与三角形求交的上述问题如何简化?(将ray的方向转换成坐标轴的方向)
    5.2.4 如何通过ray与线段的求交,来理解ray与三角形的求交? 从二维的思维方式拓展到三维。
    5.3 ray与球体的求交算法?
    5.4 ray与某物体的求交算法?

光线追踪参考资料

https://developer.nvidia.com/blog/practical-real-time-ray-tracing-rtx/
https://microsoft.github.io/DirectX-Specs/d3d/Raytracing.html#walkthrough

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值