小编Eal*_*ann的帖子

我可以将 R8G8B8A8 放入 UBO 中,并将其用作 vec4 吗?

我尝试优化工作计算着色器。它的目的是创建一个图像:找到合适的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4).

  • 颜色在 UniformBuffer 的 uint 数组中进行索引。
  • 该 UBO 中的一种颜色封装在一个 uint 中,如 {0-255, 0-255, 0-255, 0-255}。

这里是代码:

struct Entry
{
    *some other data*
    uint rgb;
};

layout(binding = 0) uniform SConfiguration
{
    Entry materials[MATERIAL_COUNT];
} configuration;

void main()
{
    Entry material = configuration.materials[currentMaterialId];

    float r = (material.rgb >> 16) / 255.;
    float g = ((material.rgb & G_MASK) >> 8) / 255.;
    float b = (material.rgb & B_MASK) / 255.;

    imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(r, g, b, 0.0));
}
Run Code Online (Sandbox Code Playgroud)

我想清理/优化一下,因为这种颜色转换在着色器中看起来很糟糕/无用(并且应该预先计算)。我的问题是: …

glsl compute-shader vulkan

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

存储缓冲区-[y] [x]使用的int数组比[x] [y]快3倍?

作为一个测试项目,我使用计算着色器(Vulkan)编写了Consway基本的生活游戏。基本上:

  • “板”存储在存储缓冲区内部的int数组中。
#define WIDTH 800
#define HEIGHT 600
#define WORKGROUP_SIZE 32

layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1) in;

layout(binding = 0) readonly buffer buf1 {
   int data[WIDTH][HEIGHT];
} previousBoard;

layout(binding = 1) buffer buf2 {
   int data[WIDTH][HEIGHT];
} nextBoard;
Run Code Online (Sandbox Code Playgroud)
  • 然后,计算着色器每帧更新一次(每个像素调用一次)。

我随机进行了一些更改,并且我注意到,如果使用data[y][x](from gl_GlobalInvocationID.xy)访问阵列,我的程序比使用(至少在我的计算机(intel UHD 620)上)进行的普通访问要快3倍。data[x][y] [x] [y]为500 fps,而[y] [x]为1700 fps)。

我花了几个小时来隔离这种行为,以确保这不是副作用。我什至反汇编了Spir-v代码,但发现没有什么有趣的东西可以帮助我理解。这里是着色器的差异(带有[x] [y]和[y] [x]):https : //www.diffchecker.com/vFlkEsQp

我远远不了解这里会发生什么。是否有任何原因可以解释这种性能差异?

我对使用[y] [x]不太满意(或者应该?),那么我还有另一种方法可以使[x] [y]达到类似的效果吗?

compute-shader vulkan

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

标签 统计

compute-shader ×2

vulkan ×2

glsl ×1