如何实现无顶点输入属性的顶点着色器?顶点从存储缓冲读取
从Storage Buffer读取顶点的顶点输入流配置方案
核心逻辑
要完全绕开顶点输入流读取数据,核心是让顶点着色器不依赖任何顶点输入属性,转而通过顶点ID来遍历Storage Buffer里的顶点数据。
顶点缓冲的绑定要求
不需要绑定真实的顶点缓冲,但部分API(比如Vulkan)强制要求顶点输入状态必须有绑定项,这时候可以用一个虚拟缓冲——也就是个空的、大小为0的缓冲对象,绑定到顶点输入绑定点上,只是为了满足API的状态校验,不会实际读取数据。
顶点描述参数的具体设置
针对你列出的三个参数:
description.binding:随便指定一个绑定索引(比如0),只要和后续绑定虚拟缓冲时用的索引一致就行。description.stride:设为0,因为没有实际的顶点数据从输入流走,不需要设置步长。description.inputRate:设为VERTEX_INPUT_RATE_VERTEX(对应Vulkan的VK_VERTEX_INPUT_RATE_VERTEX),这个参数是告诉GPU每个顶点对应一次着色器调用,符合我们用顶点ID遍历的逻辑。
额外关键操作
- 顶点着色器调整:在着色器里用
gl_VertexID(OpenGL)或gl_VertexIndex(Vulkan SPIR-V)拿到当前顶点的索引,用这个索引去Storage Buffer里取对应的顶点数据。 - 绘制调用设置:用
glDrawArrays(OpenGL)或者vkCmdDraw(Vulkan)时,传入的顶点数就是你Storage Buffer里存的顶点总数,不用管索引缓冲那一套。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

