电脑图像

计算机图形学研究人员和程序员的问答

2
追踪Cook-Torrance BRDF的路径
-对不起,很长的帖子,但是我更喜欢这样做,因为“ 细节中有Devil。 ” :) 我正在从头开始编写路径跟踪器,它对于完美扩散的(朗伯型)表面效果很好(即,炉测试至少在视觉上表明它是节能的,并且渲染的图像与使用Mitsuba渲染器生成的图像相同)参数)。现在,我正在实现对原始Cook-Torrance微面模型的镜面反射项的支持,以渲染一些金属表面。但是,似乎该BRDF反射的能量多于所接收的能量。请参阅下面的示例图像: 上图:Mitsuba参考(假设是正确的)。图:直接光采样,重要半球采样,最大路径长度= 5、32分层spp,盒式滤波器,表面粗糙度= 0.2,RGB的路径跟踪。 上图:实际渲染的图像:蛮力朴素的路径跟踪,均匀的半球采样,最大路径长度= 5、4096分层spp,盒式滤波器,表面粗糙度= 0.2,RGB。尽管在渲染设置方面存在一些差异,但很明显,渲染的图像不会收敛到之前显示的参考。 我倾向于认为这不是实现问题,而是有关在渲染方程框架内正确使用Cook-Torrance模型的问题。下面,我解释了我如何评估镜面反射BRDF,我想知道我是否做得正确,否则,为什么。 在深入了解细节之前,请注意渲染器非常简单:1)仅实现暴力天真的路径跟踪算法-不进行直接光采样,不进行双向路径跟踪,不进行MLT;2)在交点以上的半球上所有采样都是均匀的-根本没有重要性采样,对于扩散表面也没有采样;3)射线路径的最大最大长度固定为5-无俄罗斯轮盘;4)辐射/反射率是通过RGB元组通知的-没有光谱渲染。 Cook Torrance微面模型 现在,我将尝试构建实现镜面BRDF评估表达式所遵循的路径。一切开始与渲染方程 ,其中p是交点在表面处,w o是观看向量,w i大号Ø(p,w ^Ø)= LË+∫ΩLi(p,wi)fr(wo,wi)cosθdωLo(p,wo)=Le+∫ΩLi(p,wi)fr(wo,wi)cos⁡θdω L_o(\textbf{p}, \mathbf{w_o}) = L_e + \int_{\Omega} L_i(\textbf{p}, \mathbf{w_i}) fr(\mathbf{w_o}, \mathbf{w_i}) \cos \theta d\omega pp\textbf{p}wowo\mathbf{w_o}wiwi\mathbf{w_i}是光矢量,是沿着w o的输出辐射,是沿着和入射在的辐射。LoLoL_owowo\mathbf{w_o}p 瓦特我 COS θ = Ñ ⋅ 瓦特我LiLiL_ipp\textbf{p}wiwi\mathbf{w_i}cosθ=n⋅wicos⁡θ=n⋅wi\cos \theta = \mathbf{n} \cdot \mathbf{w_i} 上面的积分(即渲染方程的反射项)可以使用以下蒙特卡洛估计器 其中是描述采样分布的概率密度函数(PDF)向量。 …

3
避免与重合表面发生Z角战斗
渲染两个重叠的共面曲面时,一个常见的问题是“ z-fighting”,即渲染器无法确定两个曲面中的哪个更靠近相机,从而在重叠区域产生视觉伪像。 标准的解决方案是在设计模型时使表面略有偏移。还有其他解决方案吗?
26 rendering 

3
什么是模板缓冲区?
维基百科指出,模板缓冲区是着色器可以使用的任意缓冲区。 但是,它暗示它用于裁剪或“紧密绑定”深度和像素缓冲区,这与自身有些矛盾。 模板缓冲区实际上起什么作用,在现代应用中如何实际使用?

2
改变国家的代价是什么?
程序员应该对某些操作的成本有一个很好的了解:例如,CPU上指令的成本,L1,L2或L3高速缓存未命中的成本,LHS的成本。 当涉及到图形时,我意识到我几乎不知道它们是什么。我要记住,如果我们按成本订购它们,状态更改将类似于: 着色器均匀变化。 活动顶点缓冲区更改。 活动纹理单位更改。 活动着色器程序更改。 活动帧缓冲区更改。 但这是一个很粗略的经验法则,甚至可能不正确,我不知道数量级是多少。如果我们尝试放置单位,ns,时钟周期或指令数量,那么我们在谈论多少?

1
我的观点数学正确吗?
我有一个作业,必须使用透视变换来计算和绘制一些点,但是我不确定我的结果是正确的,因为使用相机坐标的3d图看起来与使用图像坐标的2d图非常不同。你能帮我了解怎么了吗? 给出的结果是:相机位于,以世界坐标(以米为单位)指定。相机坐标系通过绕世界参考的Y轴旋转,因此其旋转矩阵为 θ = 160 ö 瓦特- [R c ^ = [ c ^ Õ 小号(θ )0 š 我Ñ (θ )0 1 0 - š 我Ñ (θ )0 Ç Ô 小号(θ ) ]w ^ŤC= [ - 1 ,1 ,5 ]Ťw ^ŤC=[-1个,1个,5]Ť_WT^C = [−1, 1, 5]^T角= 160Øθ=160Ø\theta = 160^ow[RC= ⎡⎣⎢c o …

2
为什么将模型视图矩阵的转置逆用于转换法向量?
当渲染3D场景并将变换应用于对象时,必须使用模型视图矩阵的转置逆来变换法线。因此,对于法线,modelViewMatrix M,变换后的法线n '为ñnn中号MMñ′n′n' ñ′= (M− 1)Ť⋅ ñn′=(M−1)T⋅nn' = (M^{-1})^{T} \cdot n 变换对象时,很明显需要对法线进行相应的变换。但是,为什么从数学上讲这是对应的转换矩阵呢?

5
投影到2D空间中的球体是否总是会产生椭圆形?
我的直觉一直是,当将任何球体投影到2D空间中时,结果在数学上始终将是椭圆(在退化情况下为圆)。 过去,当我积极地进行自己的图形编程并与其他人一起提出来时,他们坚称我错了。如果我没记错的话,他们认为结果可能有些模糊“蛋形”。 谁是正确的? 既然已经提交了一个答案,我不想完全改变我的问题,但是我意识到由于多年来对这一领域的熟悉程度,我遗漏了重要的细节。 我打算专门询问透视投影,其中投影是线性应用程序。 当然,其他投影对于许多用途也很有趣,因此我现在不希望将其删除。但是,如果答案中最突出的部分是透视投影,那就太好了。


1
为什么我的Perlin Noise看起来“块状”?
我尝试仅凭理论自己实现Perlin Noise (遵循flafla2.github.io/2014/08/09/perlinnoise.html)。不幸的是,我无法获得“原始” Perlin Noise的外观。 下面的代码呈现Perlin Noise的块状版本的原因是什么? 我应该改进/更改代码中的哪些内容,以使其呈现出没有伪影的Perlin Noise? 我怀疑插值方式或grads向量中可能存在问题。该grads载体包含(晶格点随机向量)和(大小矢量)的点产品-适用于所有4个附近的格点。(随机向量和大小向量在第一个链接中进行了描述。) GLSL沙箱:http://glslsandbox.com/e#32663.0 float fade(float t) { return t * t * t * (t * (t * 6. - 15.) + 10.); } vec2 smooth(vec2 x) { return vec2(fade(x.x), fade(x.y)); } vec2 hash(vec2 co) { return fract (vec2(.5654654, -.65465) * dot …
21 glsl  noise  artifacts 

3
为什么对于图形API,线程安全如此重要?
据称Vulkan和DirectX12都可以以线程安全的方式使用。人们似乎对此感到兴奋。 为什么将其视为如此巨大的功能?无论如何,“真实的”处理被扔到了单独处理单元上的存储桥上。 另外,如果它太大,为什么直到现在才出现线程安全Graphics API?

3
俄罗斯轮盘真的是答案吗?
我已经看到,在“路径跟踪”的某些实现中,一种名为“俄罗斯轮盘赌”的方法用于剔除某些路径并在其他路径之间共享它们的作用。 我知道,与其遵循一条路径直到其下降到某个贡献阈值以下,然后放弃它,而是使用一个不同的阈值,并且贡献小于该阈值的路径仅以很小的概率终止。其他路径的贡献增加了相应于共享来自终止路径的损耗能量的量。我不清楚这是否是为了纠正该技术带来的偏差,还是整个技术本身是否需要避免偏差。 俄罗斯轮盘赌给出公正的结果吗? 是否需要俄罗斯轮盘才能获得公正的结果? 也就是说,使用很小的阈值并在路径下降到该阈值以下时立即终止路径会产生更大的偏差还是更少的偏差? 给定任意数量的样本,两种方法都将收敛于无偏的结果图像上吗? 我想了解使用俄罗斯轮盘赌方法的根本原因。速度或质量上有明显差异吗? 我知道能量会在其他射线中重新分配,以保持总能量。但是,如果光线在下降到固定阈值以下时终止,而不是在达到该阈值后具有随机确定的寿命,则是否仍不能进行这种重新分配? 相反,如果最终由于终止光线而不重新分配能量而损失的能量最终仍然丢失了(因为最终将重新分配光线的能量也终止了),这如何改善这种情况?

1
射线追踪中的抗锯齿/过滤
在光线跟踪/路径跟踪中,最简单的抗锯齿图像方法之一是对像素值进行超采样并取平均结果。IE浏览器 而不是通过像素中心拍摄每个样本,而是使样本偏移一定量。 在互联网上搜索时,我发现了两种略有不同的方法: 根据需要生成样本,并使用过滤器权衡结果 PBRT就是一个例子 生成具有等于过滤器形状分布的样本 两个例子是smallpt和Benedikt Bitterli的Tungsten Renderer 产生并称重 基本过程是: 根据需要创建样本(随机,分层,低差异序列等) 使用两个样本(x和y)偏移相机光线 用射线渲染场景 使用过滤器功能和参考像素中心的样本距离计算权重。例如Box过滤器,Tent过滤器,Gaussian过滤器等) 将权重应用于渲染中的颜色 生成过滤器形状 基本前提是使用逆变换采样来创建根据滤波器形状分布的采样。例如,以高斯形状分布的样本的直方图将是: 可以完全完成此操作,也可以将功能合并到离散的pdf / cdf中。smallpt使用帐篷过滤器的确切逆cdf。装箱方法的示例可以在这里找到 问题 每种方法的优缺点是什么?为什么要在另一个上使用一个?我可以想到几件事: 生成和加权似乎是最可靠的,它允许将任何采样方法与任何过滤器进行任意组合。但是,它要求您跟踪ImageBuffer中的权重,然后进行最终确定。 由于您不能使用负pdf,因此“以过滤器形状生成”只能支持正过滤器形状(即,不支持Mitchell,Catmull Rom或Lanczos)。但是,如上所述,由于您无需跟踪任何权重,因此实现起来更容易。 但是,最后,我想您可以将方法2视为方法1的简化,因为它本质上是使用隐式Box Filter权重。


1
为什么在OpenCL中禁止递归?
我想使用OpenCL加速渲染光线跟踪图像,但是我注意到Wikipedia页面声称Open CL中禁止递归。这是真的?由于我在光线跟踪时大量使用递归,因此需要大量的重新设计才能从速度上受益。阻止递归的基本限制是什么?有什么办法解决吗?

1
为什么片段着色器中的这种条件如此缓慢?
我已经在WebGL中建立了一些FPS测量代码(基于此SO答案),并且发现我的片段着色器的性能有些奇怪。该代码仅在1024x1024画布上呈现一个四边形(或者说是两个三角形),因此所有魔术都发生在片段着色器中。 考虑一下这个简单的着色器(GLSL;顶点着色器只是一个传递): // some definitions void main() { float seed = uSeed; float x = vPos.x; float y = vPos.y; float value = 1.0; // Nothing to see here... gl_FragColor = vec4(value, value, value, 1.0); } 因此,这只是渲染白色画布。在我的机器上,平均速度约为30 fps。 现在,让我们增加数字运算的难度,并根据与位置相关的噪声的几个八度音程来计算每个片段: void main() { float seed = uSeed; float x = vPos.x; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.