小编Gig*_*igo的帖子

计算矩阵的 k 次幂的迹

我需要将矩阵的迹计算为 3 和 4 的幂,并且它需要尽可能快。

这里的矩阵是一个简单图的邻接矩阵,因此它是正方形的,对称的,它的条目总是 1 或 0,对角线元素总是 0。

对于矩阵的 2 次幂的迹的优化是微不足道的:

  • 我们只需要跟踪的对角线条目 (i,i),跳过所有其他条目
  • 由于矩阵是对称的,这些条目只是第 i 行的条目平方和相加
  • 由于条目只有 1 或 0,因此可以跳过平方运算

我在维基百科上发现的另一个想法是总结 Hadamard 乘积的所有元素,即 entry-wise multiplication,但我不知道如何将这种方法扩展到 3 和 4 的幂。

http://en.wikipedia.org/wiki/Trace_(linear_algebra)#Properties

也许我只是瞎了,但我想不出一个简单的解决方案。

最后我需要一个 C++ 实现,但我认为这对问题并不重要。

在此先感谢您的帮助。

math optimization linear-algebra mathematical-optimization adjacency-matrix

5
推荐指数
1
解决办法
1万
查看次数

如何使用深度缓冲区来存储索引

我想以一种稍微不正统的方式使用深度缓冲区,我对所有规范化,缩放以及那里发生的事情感到非常困惑.

我的计划是由AMD的一些人实现空间哈希算法(链接到pdf).

tl; dr-version:通过将3D顶点离散化为(平面2D)深度纹理数组来加速最近邻搜索,将深度设置为VertexID.使用深度纹理的原因是,有一些智能深度测试甚至可以按排序顺序获得结果,但这里不太重要.

我的问题是VertexID显然是一个整数,范围从0顶点的总量ParticleCount,但不能直接使用,因为顶点着色器的输出必须[-1..1)在OpenGL(或[0..1)在DirectX)中规范化.

我的顶点着色器因此做了类似的事情:

float depth = 2.0 * gl_VertexID / ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);
Run Code Online (Sandbox Code Playgroud)

这有点工作,但实际存储到绑定到当前帧缓冲区的深度纹理的值会让我感到困惑.我没有完全理解浮点深度缓冲区和整数版本之间的区别,如果我甚至无法输出实数整数,并且从深度纹理读取后,[0..1]无论我设置的是什么内部格式,所有内容似乎都被标准化(DepthComponent24,32,32f).

有人可以给我一些建议如何从这些深度纹理中获取VertexIDs吗?

谢谢

opengl shader glsl depth-buffer

5
推荐指数
1
解决办法
584
查看次数

使用单纯形噪声替换的球体的解析法线

我想渲染一个像球体一样的行星.总体思路如下:

  • 生成一组构成球体的单位长度顶点.
  • 渲染球体时,着色器会评估单位球面上的3D单面噪声.
  • 结果用作"高度"以沿其方向移动当前顶点.

到目前为止,一切都正常运作.

现在我想添加光照,因此需要法线到表面.

在实现与照明相关的部分时,我快速添加了一种方法,使用片段着色器中的偏导数来估计地形的法线,如下所示:

vec3 X = dFdx(ins.position);
vec3 Y = dFdy(ins.position);
vec3 normal = normalize(cross(X,Y));
Run Code Online (Sandbox Code Playgroud)

ins.position插值世界位置在哪里.

虽然这种方法有效,但它看起来并不是很好,因为它实际上导致了每个面的法线.

不正常的近似值

现在来看实际问题:

  • 计算每顶点法线会导致平滑法线,与图片不同,是否正确?
  • 单因素噪声优于Perlin噪声的优点之一是具有"定义明确且连续的梯度,可以非常便宜地计算"(引用优秀的单纯形噪声揭秘),并且梯度应该能够计算正常,对吗?

如果秒问题是"是",我有两个问题:

  • 单纯噪声算法取自一个流行的来源,遗憾的是不包括梯度计算.我将在下面发布我的添加尝试,但我不知道它是否正确.
  • 即使我有渐变,我仍然坚持从那里获得法线.

任何帮助是极大的赞赏!

我在渐变实现中的镜头(替换了最后几行的snoise):

float snoise(vec3 v, out vec3 grad)
{
    ......

    // Mix final noise value
    vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);
    vec4 m2 = m * m;
    vec4 m4 = m2 * m2;

    vec4 pdotx = vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3));

    vec4 temp …
Run Code Online (Sandbox Code Playgroud)

opengl glsl normals simplex-noise

5
推荐指数
1
解决办法
1028
查看次数

修复了Nvidia和AMD的GLSL着色器

我无法让我的GLSL着色器在AMD和Nvidia硬件上运行.

我不是在寻找修复特定着色器的帮助,而是如何避免出现这些问题.是否可以检查着色器是否可以在AMD/Nvidia驱动程序上编译,而无需在具有相应硬件的机器上运行该应用程序并实际尝试它?

我知道,最后,测试是唯一可以肯定的方法,但在开发过程中我想至少避免明显的问题.

每个使用GLSL的人都必须遇到这些问题,为什么我找不到一个好方法来修复它们呢?

opengl shader nvidia glsl

2
推荐指数
1
解决办法
3866
查看次数

Pango无法使用librsvg查找字体

我正在使用librsvg将SVG文件呈现给Cairo上下文.然后我使用Pango"手动"在顶部渲染一些文本.

渲染SVG时,我得到Pango警告它无法加载字体:
"couldn't load font "'Calibri' Not-Rotated 16", falling back to "Sans Not-Rotated 16", expect ugly output."

之后通过Pango手动文本渲染完美无缺.我尝试了多个不同的字体系列,它们都可以正常渲染,没有任何警告.

我甚至浏览了librsvg源代码,看看它是如何使用Pango但我看不出与我正在做什么有任何重大差异.

我不知道如何继续调试这个问题,任何有关Pango如何在Windows下定位字体以及可能影响其查找能力的建议都非常感谢.

如果重要:
我从这里下载了所有需要的二进制文件:http://sourceforge.net/projects/ezwinports/files/

pango cairo librsvg

1
推荐指数
1
解决办法
1355
查看次数