Questions tagged «shader»

对于所有与着色器有关的问题,即GPU管道的可编程部分。有关特定于语言的着色器问题,另请参见[glsl]和[hlsl]标签。

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; …

1
恒定条件是否比切换着色器更昂贵?
通常,在着色器中分支不是一个好主意。但是现在我有了一个着色器,其条件对于整个绘制调用而言是恒定的。因此,对于一个绘制调用,执行的分支始终相同。 这种分支是否仍然比拥有多个没有这些分支并在它们之间切换的着色器还要昂贵?


2
导数图与切线空间法线图
我发现某些引擎使用导数贴图代替切线法线贴图。 经过一番阅读之后,替换切线空间法线似乎是一种很棒的方法,但是使用它们会不会有一些不利之处?为什么仍继续使用切线空间法线? 是否可以将优点和缺点进行比较?

1
着色器中的循环性能
我想知道在着色器中集成动态循环功能的最佳方法是什么? 首先,似乎动态数组是不可能的。因此,创建最大大小的数组并仅填充其中一部分或使用预定义的大小定义数组会更好吗? 那么,迭代此数组的最佳方法是什么? 使用展开循环或动态循环进行4到128次迭代比较好吗?我还看到有可能将其展开到最大的预定义迭代次数,然后使用诸如的条件将其停止if (i == myCurrentMaximumIterationNumber)。

1
更改着色器程序时是否需要重新绑定制服或属性?
渲染场景通常涉及多个着色器程序,在我的情况下,所有着色器程序都使用相同的属性,并且至少共享一些制服。为了使它们正常工作,我目前保持安全,这意味着我每次在着色器程序之间切换时都重新绑定属性并获得适当的统一位置。因此,基本上每个帧中都有多次,这可能不是最佳方法。 因此,在切换着色器程序之后,是否有必要(通常​​)重新绑定属性和制服?又为什么呢? 如果是这样,是否有办法在程序启动时执行一次,而不必再次触摸它们(设置统一值除外)?
11 opengl  glsl  shader 



1
使用多种光源进行高效渲染
要使用phong阴影渲染具有单个光源的场景,可以基于材质和光源的环境/漫反射/镜面反射分量计算传递到片段着色器中的每个片段的最终颜色。 通过将将每个单独光源应用于片段的结果加在一起,可以很容易地扩展它以适应多个光源: final_color = (0, 0, 0, 1) for each light: final_color += apply_light(material, light) final_color = clamp(final_color, (0,0,0,1), (1,1,1,1)) 但是,在有大量光源的情况下,此过程非常缓慢;对于N灯光,这种方法需要计算phong阴影N每个片段的时间。 有没有更好的方法来渲染具有大量光源(数百个,数千个等)的场景?


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
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.