sokol_gfx.h:功能请求 可写入存储缓冲区
你好! 由于我需要从片段着色器写入 SSBO, 所以我做了一个小的"扩展", 它允许实现此功能, 我想知道你是否愿意在 sokol_gfx.h 中包含此功能。 目前我只实现了 Metal 和 OpenGL 后端, 因为我有测试访问和经验。 这是否是你考虑包含的内容, 或者在某个后端中这将是荒谬的? 如果是这样, 我可以尝试提交一个 PR, 但我只能提供这两个后端。 示例用例: > 想象一下一个噪声着色器, 它根据函数评估写入特定片段, 并且需要反馈此信息, 而不是仅仅使用全通道来做到这一点, 或者使用 MRT, 这将强制具有相同的分辨率, 有人可能会选择将帧缓冲区分成较小的"桶", 并使用原子数组来标记它们已被写入(也许写入的确切像素并不像"此桶被触及"那样重要, 以避免在将此存储缓冲区传输到 CPU 后对每个像素进行全面的相同分辨率的 CPU 扫描) "扩展"本身实际上是一个函数(因此不能完全称为扩展), 如果不是作为此实现的一部分, 我还必须编写一个"创建存储缓冲区"扩展, 它允许创建(存储)缓冲区, 但也可以用初始数据填充它(内部调用 sg_make_buffer(), 然后调用 glBufferSubData() 或 memcpy() 来将 MTLBuffer 的原始字节传输到 CPU) 因为使用这种缓冲区时, 重要的是能够预先将其填充到数据中(在上面的示例中, 它将是零, 我们不能让胡言乱语成为默认状态, 特别是当数据未写入时, 因为值取决于一个被评估的着色器, 其像素值结果将取决于许多因素...) 以及 GPU>CPU 读回, 在 OpenGL 中, 要读回它, 你必须指定 GL_SHADER_STORAGE_BUFFER(我应该将此支持整合到我的传输扩展中, 并从这里删除) 扩展本身工作正常, 我的担忧是, OpenGL 方面似乎有些脆弱, 因为我必须内部操作 Sokol 的 gl 缓存, 通过调用 _sg_gl_cache_bind_storage_buffer, Metal 部分则是直接调用 setVertexBuffer() 和 setFragmentBuffer(), 似乎更能抵御底层变化。 一如既往, 感谢 sokol 库!
内容来源: floooh/sokol