在VS中写入SSBO并从FS中读取

问题描述 投票:0回答:1

使用Vulkan库 我有一个在顶点着色器中计算的 vec3[] 位置(由 TBN 矩阵转换的数百个全向光位置),我希望将其传递给片段着色器进行读取。

我尝试为此创建一个 SSBO 缓冲区,并带有 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 标志,因为不会从客户端 CPU 端向其中上传任何数据(仅 VS 写入,然后 FS 从中读取)。当缓冲区工作时,我有读/写危险。

着色器中的缓冲区:

//ssbo for TS omni
layout(set=0, binding=11) coherent buffer OmniPositionsTS
{
    vec3 mOmniPositionsTS[];
};

代替 SSBO,尝试了一个简单的数组[16]“out”,在 FS 中用作“in”变量,它的工作方式就像一个魅力,但当然我对这样的 in/out 属性的限制非常有限,因此 32 以下 返回 SSBO 解决方案:

这是否意味着片段着色器不会等待顶点着色器完成写入 SSBO?为什么其他着色器改变“出”和“入”变量不会受到这种竞争条件的影响?

我应该在顶点着色器中调用 MemoryBarrier 吗? 一般来说,将 TBN 转换后的光位置传递给片段着色器的首选方式是什么?

glsl vulkan ssbo
1个回答
0
投票

根据 Vulkan 内存模型,片段着色器只能依赖生成特定片段所需的顶点着色器调用的执行结果。也就是说,如果您正在渲染一个三角形,则由于该三角形而执行的所有片段着色器都可以自由读取由负责生成该三角形的 3 个顶点着色器调用写入的数据。 如果没有额外的同步,FS 无法访问三角形周围 VS 调用写入的所有其他数据。不,着色器中的内存屏障不算在内。您需要在生成数据的 VS 调用和接收数据的 FS 调用之间存在硬执行依赖关系。这通常是某种包含内存屏障的管道屏障。这要求生成数据的 VS 调用与读取数据的 FS 调用位于不同的绘制函数调用中。

© www.soinside.com 2019 - 2024. All rights reserved.