电脑图像

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

2
在现代GPU上组织顶点数据的最高效方式
说我有顶点组成的模型,每一个position,normal,tangent,和texcoord属性,其中三角形由指数三元规定。 如果我们只关注顶点属性,那么我知道两种广泛的策略:数组的结构和结构的数组。我还听说结构数组是首选的,因为它会增加给定顶点的属性的内存局部性(并因此增加高速缓存局部性)。 确实可以提高性能吗?我能想到的主要方式是通过顶点索引,该索引要求光栅化器获取早已从缓存中逐出的顶点数据。如果像这样的顶点数据访问是随机的,那么将顶点的所有属性都保留在同一缓存行上肯定会使事情变得更快,但这不是可以通过优化三角形规格的顺序来最大程度缓解的问题吗? 此外,据我了解,现代GPU在解压缩相同类型的长矢量上可能比许多类型的结构的矢量更好。如果优化了索引顺序,那么数组结构布局是否可以始终胜过相同顶点数据的结构数组布局?

1
蓝噪声采样和蓝噪声纹理之间的联系?
您可以像这些泊松圆盘样本一样进行蓝噪声采样: 并且您可以具有如下所示的蓝噪声纹理: 我得到第一幅图像,其中有一个输入(样本的索引)和两个输出(点的x,y坐标),第二幅图像基本上是相反的,其中有两个输入(x,样本的y坐标)和一个输出(点的值)。 不过我很好奇,这些有什么关系? 如果对第二个图像进行DFT,可以看到它的高频成分多于低频成分,但是我不确定如何对第一组数据点进行DFT。 我想知道是否有可能采用其他低差异序列(例如,哈尔顿或抖动的网格)并从构思中制作出纹理,例如第二张图像?
9 sampling 

1
将正确的光物理应用于辉光的高斯模糊公式
我正在尝试使用可分离的高斯模糊制作发光着色器。 最近,我受到一段短短的youtube视频“计算机颜色已损坏”的启发,而我对颜色插值一无所知,他的建议很漂亮! 视频谈论的一件大事是应该将此原理应用于模糊处理,但是我很困惑。我真的不知道何时添加值时平方什么和平方什么。我目前的理论是,高斯模糊的每个纹理样本都通过使用贝尔曲线加权的两个幂的幂来提高,并像往常一样添加到总和中。最后,总和是平方根,但是我不确定这是否正确。有人可以确认吗?这会带来有意义的变化吗?

3
消除抖动噪声的正确方法是什么?
当减小色彩深度并以2位噪声抖动(n =] 0.5,1.5 [并且output = floor(input *(2 ^ bits-1)+ n))时,值范围的两端(输入0.0和1.0 )很吵。希望它们是纯色的。 例如:https://www.shadertoy.com/view/llsfz4 (上图是shadertoy的屏幕截图,描绘了一个渐变,并且两端分别应为纯白色和黑色,但噪声较大) 当然,可以通过压缩值范围来解决问题,以便两端始终取整为单个值。不过,这感觉有点骇人听闻,我想知道是否有办法“适当地”实现此功能?

1
调整发光着色器以使其看起来更好
我有一个简单的游戏,它的主题是这些小线条。它针对iOS和android,因此它具有可在其上运行的大量处理器。 我试图向他们添加实时发光有两个原因 我试图掩盖一个事实,我没有足够的渲染时间来处理大多数设备上的抗锯齿。 游戏的主题应该是纯光,因此应该使图片看起来像是纯光。 我已经调整了一个可分离的高斯模糊着色器一段时间了,但我感到很沮丧,只是无法正确显示,也许是我想徒劳地隐藏光线的锯齿边缘同时不要使光线看起来模糊。 我最大的问题是使它看起来最好的所有变量。 我是图形/渲染的新手,我绝对不是艺术家。向我借钱最令人沮丧的是似乎涉及的所有变量。有了辉光,我看到了很多可能的变化。 A.添加混合模式,屏幕混合模式或其他混合 B.对模糊进行加权,然后在合并之前对法线进行加权 C.高斯钟形函数的Sigma(我一直在使用这个 令人困惑的计算器,但它似乎并没有提供别人看到的相同值) D.标量发送到sigma函数的“ x”值 E.样本比例(使模糊半径变小或变大) F.更改发光缓冲区的分辨率 使用如此多的变量时,如何找到“最佳外观”常量? 我也遇到了问题,因为在我进行调整和看到它之间很难看到更改之间的时间,我会在着色器玩具中进行此操作,但是我无法加载此图像或通过程序生成类似的图像。 现在,我真的停留在高斯钟形曲线内核的sigma上,特别是因为我需要输入数字而不是公式,因为我需要处理器速度。您能建议使用一个好的sigma吗?

1
OpenGL GLSL-Sobel边缘检测过滤器
关于此主题,我已经在GLSL中成功实现了Sobel Edge Detection过滤器。这是过滤器的片段着色器代码: #version 330 core in vec2 TexCoords; out vec4 color; uniform sampler2D screenTexture; mat3 sx = mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 ); mat3 sy = mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 ); void main() { vec3 diffuse = texture(screenTexture, …

4
现代OpenGL有多个视口?
我使用SDL2。 目前,我唯一的着色器具有MVP矩阵,并使用该矩阵转换点。 我使用GLM计算摄像机的视图和投影矩阵: glm::lookAt(pos, pos + forward, up); glm::perspective(fov, aspectRatio, zNear, zFar); 我进行了搜索,但是我只能找到多个视口的旧版实现。 例如,如果我创建了4个摄像机,并且假设它们都相同,则除了每个摄像机要渲染的屏幕不同之外,其他的四分之一。(所以我想要4个视口具有相同的内容) 我怎样才能做到这一点?抱歉,如果我没有提供足够的信息,请随时提出。
9 opengl  glm 

4
为什么不对凹凸贴图,法线贴图和位移贴图进行伽玛校正?
因此,我试图从相当技术的角度来解决这个问题。 在着色器中添加凹凸贴图,法线贴图或“位移”贴图时,不应对其进行伽玛校正。但是应该是弥散纹理。但为什么? 当您以JPEG,PNG或TIFF等格式将文件保存为8bit(或16bit Integer)格式时,它们的伽马系数为0.4545(1 / 2.2)。因此,相机会捕获来自现实世界的光线(线性)当将照片另存为JPEG时,会添加1 / 2.2的伽玛值,以将信息压缩为8位,然后在监视器上查看图像时再添加2.2的伽玛值,使亮度再次线性化。 因此,当使用漫反射纹理(如照片)时,您需要“去除” 1 / 2.2伽玛以使其线性(称为线性化),因此现在纹理看起来更暗,但是从数学角度来看,这些值是正确的,因此渲染器将进行正确的计算。旁注:该软件使用2.2的显示灰度系数来确保纹理看起来正确,这只是为了内部计算而已将它们线性化。但是,当我在Photoshop中创建凹凸贴图并将其另存为JPG或PNG时,该图像中也会烧入1 / 2.2伽玛,那么为什么也不需要线性化凹凸贴图呢? 如果在3ds Max中以2.2的输入gamma加载凹凸贴图,就像使用“漫反射”纹理一样,则漫反射看起来正确,但凹凸看起来是错误的,因此我必须将凹凸的输入gamma设置为1.0使其看起来正确,但正如我所说:为什么两个图像文件都烧入了1 / 2.2伽玛,对吗?
9 gamma 

1
扫描转换期间的样品间隙是多少?
在本教程中, 通常情况下,渲染共享边的三角形。OpenGL提供了保证,只要共享的边顶点位置相同,在扫描转换期间就不会有样本间隙。 1扫描转换期间的样品间隙到底是什么? 2在什么情况下会发生? 3当线穿过片段的中心时会发生吗?

1
完全蒙特卡洛体积散射
我想将完整的蒙特卡罗体积散射添加到我的路径追踪器中,但是我在研究如何做到这一点上很难。让我解释一下我想做的事情: 射线进入材料,然后应用BTDF,然后经过一定距离,发生体积散射事件,此后(在各向同性的情况下),射线沿散射方向向任意方向散射。球。重复此过程,直到射线与另一个BTDF一起离开材料为止。 我的问题如下: 如何选择分散事件之间的距离?直觉告诉我应该有某种散布pdf,它给出一定距离后散布的可能性吗? 这是正确的吗? pdf是各向同性材料的线性函数吗? 此功能是否有名称或我可以使用Google的名称? Beer-Lambert还会在分散事件之间应用吗? 我不会。由于Beer-Lambert是实际散射计算的简化。 再说一次,也许Beer-Lambert是一个微观尺度的计算,而路径追踪则是一个宏观尺度。 相当于BSDF的体积是多少?看起来我可以使用诸如Henyey-Greenstein之类的相位函数来确定新方向,但是如何使用衰减呢? 最后,对于蒙特卡洛体积散射,有哪些更好的Google短语? 搜索体积散射或SSS,最终会给出有关完整蒙特卡罗模拟(偶极子,散射,入散射,出散射,扩散等)的简化的论文,方法和博客文章。

1
GGX几何术语的正确形式
我正在尝试在raytracer中实现微面BRDF,但是遇到了一些问题。我读过的许多论文和文章都将局部几何术语定义为视图和半矢量的函数:G1(v,h)。但是,实现此目标时,我得到以下结果: (最下面一行是粗糙度为1.0-0.0的电介质,最上面一行是粗糙度为1.0-0.0的金属电介质) 边缘周围有一个怪异的高光,nl == 0附近有一个截止。我使用Unity作为参考来检查我的渲染,因此我检查了它们的着色器源,以查看它们的用途,并从中可以看出它们的几何项根本没有被半向量参数化!因此,我尝试了相同的代码,但使用了宏观表面法线而不是半向量,并得到以下结果: 在我未经训练的眼睛看来,这似乎更接近预期的结果。但是我有感觉这是不正确的?我阅读的大多数文章都使用半向量,但不是全部。是否有这种差异的原因? 我将以下代码用作几何术语: float RayTracer::GeometryGGX(const Vector3& v, const Vector3& l, const Vector3& n, const Vector3& h, float a) { return G1GGX(v, h, a) * G1GGX(l, h, a); } float RayTracer::G1GGX(const Vector3& v, const Vector3& h, float a) { float NoV = Util::Clamp01(cml::dot(v, h)); float a2 = …

1
将纹理映射到双曲三角形
我一直在如何解决这个问题上停留了一会儿,所以任何建议将不胜感激! 我想以右下欧氏三角形的形式将纹理映射到Poincare磁盘上的双曲三角形。 这是纹理(纹理的左上角三角形是透明的且未使用)。您可能会认识到这是Escher's Circle Limit I的一部分 抱歉,看到评论,因为我似乎不允许张贴两个以上的链接! 这就是我的多边形的样子(它以原点为中心,这意味着两个边都是直线,但是通常所有三个边都是圆弧): 多边形的中心是由其顶点形成的欧几里得三角形的中心,我正在使用UV的中心对贴图进行UV映射,将其划分为与多边形具有相同数量的面,并将每个面映射到相应的多边形面上。但是结果看起来像这样: 如果有人认为使用UV映射可以解决此问题,我很乐意提供一些示例代码,但是我开始认为这可能是不可能的,我将不得不编写自己的映射函数。 由于AB,AC,BC线实际上可能是弧线而不是线,因此对@Nathan的答案进行了一些改进。 方法:选择最长的边,例如BC,然后将其细分为偶数个部分。将另外两个侧面细分为相同数量的零件。那么连接它们的线(下面答案中的DE)实际上也必须是弧线,而不是直线。根据需要细分这些新弧,添加新三角形作为面,然后将纹理的右下三角形UV映射到这些新面。 简单?一点也不。但这行得通。

1
在GPU上创建共享的顶点法线
我已经成功地将Marching Cubes的实现从CPU移植到了OpenGL计算着色器中,但是我还没有解决法线问题,并且想知道最好的解决方法。 我的实现专门处理二进制值字段(我正在尝试为尚没有距离估计器的3D分形函数建模),因此渐变和前向差分方法将不起作用。我有共享的顶点在工作,并且我的CPU实现使用此处描述的Quilez方法将面法线累积到每个相邻顶点上。 我可以将该实现移植到另一个着色器上,但是我看到的问题是需要大量的原子。由于我们只能在标量整数类型上使用原子,并且我无法想到一种以可加方式将3个有符号的int打包为1的方法,这意味着每个着色器调用3个轴* 3个顶点= 9个原子加法。它们当然会散布在整个内存中,所以这不像是击中单个原子计数器9次,但它看起来仍然像是个地狱。 另一种选择是针对每个多边形运行一个着色器调用,并构建人脸法线列表(我可能会以此方式打包到x10y10z10),然后每个顶点的着色器来累积所有相邻人脸的法线。但是,这将是一个巨大的内存消耗,面部索引的存储空间每个顶点需要12 int才能处理最坏的情况。还有一个问题,如何在不再次使用原子的情况下写入该存储,以计算出已将多少张面写入特定顶点。 任何人对此有更好的主意吗?

3
沿曲线排序一组无序点
我有一组3D点(我从执行实体细分的库中恢复),这些点属于曲线(即,实体的边缘)。这意味着曲线肯定会经过这些点中的每一个。 但是,点集是无序的,因此我需要对其进行排序,以便能够正确绘制此曲线。 有没有针对此类问题的已知方法? 一些其他信息: 曲线通常是参数化的(样条曲线/贝塞尔曲线,圆切片..)。 这些点作为浮点坐标给出。 这些点非常密集地打包(但是它们可以像我想要的那样密集)。为了让您有个想法,对于一条曲线,它在x中占19个单位,在x中占10个单位,在z中占5个单位,我引用了曲线段中的一系列点:(20.7622,25.8676,0)(20.6573,25.856, 0)(20.5529,25.8444,0)(20.4489,25.8329,0)(20.3454,25.8213,0)
9 geometry  mesh  curve 

1
OpenGL镶嵌中的每个顶点计算
我尝试使用硬件镶嵌来实现基于位置的布料模拟。这意味着我只想将控制四边形上载到图形卡,然后使用镶嵌和几何着色在布料中创建节点。 这个想法遵循本文: David Huynh,“使用硬件镶嵌细分的布料模拟”(2011年)。论文。罗彻斯特理工学院 http://scholarworks.rit.edu/theses/265/ 我知道如何使用镶嵌来创建模拟点。我不知道如何将计算出的信息存储到帧缓冲区中。 几何图形以及镶嵌评估着色器具有每个顶点计算所需的信息。但是它们可以直接写入帧缓冲区吗? 我知道的片段着色器可以写入帧缓冲区,但是我的信息将被插值,并且我不再知道在哪个位置写入什么内容。

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.