电脑图像

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

2
如何将四边形投影为矩形?
tl; dr:射影几何中的数学问题:如何找到如下所示的投影的4x4相机矩阵,使得点A,B,C,D位于单位框的边缘某处(例如OpenGL归一化设备坐标),单位框的角沿EA,EB,EC,ED射线落在合理的位置? (这可能是单应性,透视性和/或归类的一种特殊情况。不熟悉术语。) 细化 给定视口内的四边形ABCD,我认为存在一个独特的(?)转换,可将其映射回矩形。如下图所示:视口中的四边形ABCD充当物理“窗口”,如果我们将其映射回矩形,它将显得失真。 (右边的方框代表NDC,我稍后再谈) 目的是快速获得右侧的图像。我们可以用光线跟踪每个点来获取图像(我已经完成了),但是我更喜欢使用OpenGL或其他投影技术,因为我想利用诸如混合,基元之类的东西。 第一次尝试 我相信我可以解决以下问题:找到3x4 相机矩阵,该矩阵在3空间(在左侧)中使3 + 1维均匀坐标,然后将其投影到2空间(在2维上)具有2 + 1维均匀坐标(在左侧)正确的)。可以使用直接线性变换来解决此问题,以获得摄像机矩阵Ba=0未知项a的方程组,并使用奇异值分解来求解该系统(SVD)。我将向量EA,EB,EC,ED(其中E是您的肉眼或世界空间中的相机)作为原像中的点,并将(0,0),(1,0),(1 ,1),(0,1)之类的东西作为后图像中​​的点,并且每对点都会给出一些线性方程式以插入SVD。生成的矩阵将映射EA->(0,0)等。(假设有足够的自由度,即,如果解决方案是唯一的,那么我不确定,请参见注释[a]。) 但是令我烦恼的是,这不是OpenGL的工作方式。OpenGL不会直接使用3x4矩阵将3d投影到2d。OpenGL需要“归一化设备坐标”(NDC),它们是三维点。投影到NDC之后,将绘制“单位”框中从(-1,-1,-1,1)到(1,1,1,1)的所有内容;外部的所有内容都会被裁剪(因为我们正在处理同质坐标:仅当(x / w,y / w,z / w的前三个坐标)时,任何点(x,y,z,w)才会显示在屏幕上,1)在-1至1)的单位框中。 因此,问题就变成了:是否存在某种合理的变换,可以将一些看起来怪异的长方体映射到均质坐标中(特别是在左侧绘制的长方体,其ABCD(前端)和A'B'C'D'(后端,隐藏)在前端后面))到单位立方体,例如使用4x4矩阵?怎么做? 我尝试过的 我已经尝试了一些更强大的方法:我使ABCD和A'B'C'D'看起来像是普通的锥体平截头圆锥体(例如gl平截头体)(即,在这种假设的设置中,左侧的图像只是在其上叠加了一个黑色矩形)而不是四边形),然后使用DLT /直接线性变换来求解所谓的4x4矩阵。但是,当我尝试它时,似乎没有足够的自由度...生成的4x4矩阵并未将每个输入向量映射到每个输出向量。在使用A,B,C,D,A'(5对转换前和转换后向量)时,我/几乎/得到了我想要的结果...这些向量已正确映射,但是例如B', C',D'映射到(3,3,1,1)而不是(-1,-1,1,1),并被OpenGL裁剪掉。如果我尝试添加第六点(用于投影4x4矩阵的6对点),我的解决方案似乎退化(零,无限)。我在这里要处理多少自由度,并且使用4x4矩阵映射我们知道和喜欢的4个向量(3 + 1维齐次坐标向量)是否有可能? 随意的小想法 我猜想不可能将任意长方体映射到具有4x4矩阵的任意长方体,尽管我很困惑,因为我认为可以使用2D中的某些矩阵在2d中将任何凸四边形映射到任何其他凸四边形。 ,例如,Photoshop?...不能/不能通过投影变换来完成吗?以及如何将其推广到3d?......同样,由于未能找到4x4矩阵,线性代数表示,在最佳情况下,我们不应该期望NxN矩阵将N个以上线性独立的点映射到N个目标点,但是我觉得这是同质的协调作弊这是因为存在一些隐藏的共线性吗?我猜不会? 另一个解决方案? 我猜可能还可以做以下丑事:使用典型的平截头体相机投影矩阵,找到与角对应的2D点,然后执行2D透视变形单应性,但是如果在渲染像素之后发生(例如photoshop),那么分辨率就会出现问题……也许假设可以找出一个矩阵在NDC空间内的XY平面上执行此转换,然后将其与基于普通视锥峰的矩阵组合起来? (注释[a]:自由度:如果需要的话,可以将ABCD进一步约束为作用在矩形上的投影变换的后图像...可以说是左侧的黑色矩形是投影相框剪贴画模型的结果)

1
使用LUT加速移动设备的Trig重型着色器
我正在尝试使此着色器在非常老的iDevice以及最终的Android上运行。 即使将每个片段的代码减少到2个正弦函数,着色器也以约20fps的速度运行。 我已经考虑过从旧的着色技术书中摘下一片叶子,并创建一个包含一堆预定义触发值的数组,并以某种方式使用这些值来近似着色器。 在上面链接的着色器中,我已经在模拟,如果四舍五入发送到trig函数的值,则鼠标越靠左(向下),着色器的质量越差。它实际上非常酷,因为它确实在左侧非常像一个完全不同且非常酷的着色器。 无论如何,我有两个难题: 我不知道在GLSL着色器中恒定或统一的数组中拥有360个值的最有效方法是什么? 我想不通如何像通常要在0到360之间的角度放置数字一样(是的,我知道GPU使用弧度),我会这样做。 func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; } 但是,GLSL不允许使用while循环或递归函数。

1
以辐射度单位还是光度单位渲染?
在传统渲染中,通常使用辐射度单位进行所有计算,无论是作为全光谱渲染还是按分量计算(XYZ,RGB等)。 但是,由于现代渲染添加了更多基于物理的模型,因此艺术家可以方便地以更熟悉的光度单位指定值,例如以流明表示的光强度。 为了将管道全部保留在一种类型的单元中,可以执行以下操作之一: 使用发光效率将光度单位转换为辐射度单位 将整个渲染管线保持为光度单位 塞巴斯蒂安·拉加德(SébastianLagarde)在他的Siggraph 2014演讲“ 将冻伤转移到PBR”的课程笔记中很好地表达了这一想法。 我的问题是: 仅以光度单位进行渲染有任何不利之处吗? 据我所知,光度单位只是偏向人眼的辐射度单位。考虑到我们将用肉眼观看最终图像,所以我认为这不是问题。 冻伤是RGB组件明智的引擎。通过仅以光度单位进行渲染,光谱渲染器是否还会有其他缺点?

1
假设微面分布函数的原因?
文章《通过粗糙表面折射的微面模型》(以及其他内容)提醒我们有关微面分布函数D的以下假设: 微面密度为正值 总微表面积至少与相应的宏观表面积一样大 在任何方向v上,微表面的(有符号)投影面积与宏观表面的投影面积相同 我可以理解为什么1)分布密度为正值,并凭直觉认为2)表示倾斜的微面的总面积不能小于其投影。 但是,我不确定3)的理由。第三条件是什么意思?

1
在颜色方面,“静音”是什么意思?
我想从Adobe Kuler等图像中提取颜色。当我选择彩色或静音时,将显示相应的颜色。但是,彩色或柔和颜色的定义是什么?“五颜六色”,“深”和“静音”是什么意思?
10 color 

3
作为(漫反射/反照率)纹理的16位半浮点线性HDR图像?
因此,我已经考虑了一段时间,并尝试通过google找到答案,但没有成功。 如果您所有的纹理都是8位LDR图像(如JPEG),则在渲染时不可能与曝光控制/色调映射产生冲突。就是说,如果您调整图像的渲染曝光度,则应该在纹理中不存在的细节上进行曝光,因为低动态范围限制了这些细节。因此,在具有16位半浮点数的线性色彩空间中将纹理作为HDR图像并另存为.exr,以获得良好的颜色表示(32位“全”浮点数可能会过大吗?),这是否有意义?我认为,要获得更详细和正确的颜色值,可能还会对GI产生影响,并且如何计算颜色渗色? 还是根本没有必要,因为我们想要的渲染的最终结果可能会与以任何方式拍摄的纹理的曝光水平相似?而且由于相机通常以12-14bit的速度拍摄,因此您必须对纹理进行多次曝光,并做所有额外的工作才能将它们全部组合成一个HDRI。 编辑: 为澄清起见,我最感兴趣的是从照片逼真的渲染角度来看,使用光线跟踪渲染器(例如mental ray,V-Ray,Arnold等)进行全光模拟和全局照明,而不是实时游戏引擎。


2
使用现代填充率和延迟渲染,咬合剔除是否仍然有意义?
例如,虽然它是当前最先进的GPU,但GTX 980的惊人填充率为72.1千兆像素/秒,它具有从后到前的渲染和/或Z缓冲区检查,看起来几乎是荒谬的,甚至可能4k分辨率。就多边形数量而言,如果正确地批处理和/或实例化它们,现代GPU可以无数个地处理成千上万个纹理三角形。 使用正向渲染时,着色器将要运行的片段数量可能很快变得不堪重负,但是如果使用延迟渲染,则根据分辨率的不同,代价通常或多或少是恒定的,并且我们早就通过了大多数着色或后期处理效果可以1080p实时完成。 无论哪种方式,当今的限制因素最常见的是绘制调用次数,并且着色成本(通过适当的延迟渲染和几何体批处理将着色成本都保持在较低水平),因此请记住,这不仅是去除背面和超出范围,截锥体的多边形有什么实质性的好处?成本(CPU / GPU时间,程序员时间)是否会在很多时候超过收益?

1
锥面光线追踪:覆盖,重叠和邻接的三角形
John Amanatides 在他的经典论文《使用锥进行射线追踪》中描述了经典射线追踪的一种变体。通过将光线的概念扩展一个孔径角(使其成为圆锥形),可以减少混叠效果(包括那些源自太少的蒙特卡洛样本的混叠效果)。 在圆锥三角形相交期间,将计算标量覆盖率值。该值表示被三角形覆盖的圆锥的分数。如果小于,则表示三角形没有完全覆盖圆锥体。需要进一步测试。但是,如果不使用更先进的技术,我们只知道覆盖了多少圆锥体,而不知道覆盖哪些部分。111 阿马那提德州: 由于目前仅使用分数覆盖率值来混合来自各种对象的贡献,因此将正确计算重叠的曲面,但不会正确计算邻接的曲面。 这对我来说没有意义。从我的角度来看,这是另一回事。让我们举个例子:我们有两个邻接的三角形,一个绿色和一个蓝色的三角形,每个三角形正好覆盖了我们圆锥的50%。它们与观看者的距离相同。 首先测试绿色三角形。覆盖值为0.5,因此接下来将测试蓝色三角形。蓝色覆盖值为0.5时,我们的视锥已被完全覆盖,因此我们完成了操作,最终得到了50:50的绿蓝色混合物。大! 现在想象一下,我们杀死了蓝色三角形,并在绿色一个重叠的后面添加了一个红色。Greeny再次为我们提供了0.5的覆盖率值。由于我们不再需要测试蓝色的了,所以我们往下看,然后很快找到红色的了。这也将返回一些大于0的coverage值,这不应返回,因为它在绿色的后面。 因此,由此得出的结论是,邻接的三角形可以很好地工作,而重叠的三角形则需要更多魔术,例如覆盖蒙版才能正确。这与Amanatides所说的相反。我误会了什么吗?或者这是纸条上的纸条?
10 raytracing 

1
制服的排列和申报顺序重要吗?
在部分6.4恒定的缓冲器本书的实用渲染和计算用的Direct3D 11(325页,326)中提到: 默认情况下,HLSL编译器将尝试对齐常量,以使它们不跨越多个float4寄存器。[...] HLSL常量缓冲区的打包也可以通过packoffset关键字手动指定。 我假设类似的规则将适用于OpenGL等效的统一缓冲区对象,因为它们映射到相同的硬件功能。 香草制服呢?宣布制服时适用哪些规则? uniform vec2 xy; // Can we expect the compiler to pack xy uniform vec2 zw; // into a same four component register? uniform vec2 rg; uniform float foo; // Will this prevent from packing rg and ba? uniform vec2 ba; // If so, will …

1
半球谐波的卷积
球谐函数(SH)是一种仅用少数几个系数表示低频球面函数的方法。它们具有一些不错的数学性质,例如,可以将具有核函数h(x)(具有圆对称性)的卷积计算为 如果对于3级SH 用余弦波瓣进行卷积,这会导致带的简单缩放 在许多情况下,例如不透明表面上给定点的入射光,不需要完整的球面信息,因为球面的一半始终为零/不确定/未使用。因此,半球谐波(HSH)诞生了。 HSH与任意核(具有圆形对称性)的卷积如何工作?是否可以扩展SH的卷积,或者是否有任何论文对此进行详细介绍?
10 hemisphere 

1
创建Voronoi网格的管道
我想实现一个Maya插件(此问题独立于Maya)以创建3D Voronoi模式,例如 我只知道我必须从点采样开始(我实现了本文描述的自适应泊松采样算法)。 我认为,从这些观点出发,我应该使用Voronoi创建网格的3D线(我尝试使用(Python)scipy.spatial.Voronoi,但结果与我的预期有所不同)。 我想念什么吗?谁能建议我创建此类模式所必须实施的适当管道和算法? [编辑]以下是是我所得到的处理结果我从scipy.spatial.Voronoi得到这样(的建议了几个例子在这里): vor = Voronoi(points) for vpair in vor.ridge_vertices: for i in range(len(vpair) - 1): if all(x >= 0 for x in vpair): v0 = vor.vertices[vpair[i]] v1 = vor.vertices[vpair[i+1]] create_line(v0.tolist(), v1.tolist()) 灰色顶点是采样点(原始形状是一个简单的球体): 这是更复杂的形状(手臂)
10 3d  geometry  mesh  polygon 


1
我可以仅使用单点重力来跟踪重力透镜吗?
我想通过距离较远的星系的镜头效果来模拟距离较远的物体的放大倍数。我是否需要对大量的点质量进行建模,还是仅凭一个平均点质量就可以摆脱? 我可以看到如何使用双曲线来跟踪受单点质量影响的光线,但是我不知道从多点质量开始的位置。因此,在尝试构建此光线跟踪器之前,我想知道我是否能够避免多个质量,并且仍然有可信的结果。
10 raytracing 

1
时间重投影如何工作?
时域抗锯齿(和其他时域算法)的工作方式是,将该帧的像素与最后一帧的像素进行匹配,然后使用该信息。 我知道您可以使用最后和当前的帧矩阵以及运动矢量信息来匹配帧之间的像素。 但是我不知道如何知道重新投影的像素是否有效?例如,旧像素现在可能隐藏在其他对象后面。 只是颜色吗?如果是这样,如何处理动画纹理或变化的光照条件?

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.