gpt4 book ai didi

glsl - Vulkan中的实例化GLSL着色器?

转载 作者:行者123 更新时间:2023-12-02 11:25:01 24 4
gpt4 key购买 nike

这是我可以想到的(最简单的)实例化着色器,它基本上只是转换了一堆2D图元:

#version 400
#extension GL_ARB_draw_instanced : enable
#extension GL_ARB_shading_language_420pack : enable
layout(std140, binding = 0) uniform VConstants {
vec4 vfuniforms[48];
};
in vec4 pos;
void main() {

gl_Position = vec4(0.0,0,0.0,1);
gl_Position.x = dot(pos, vfuniforms[int(float(gl_InstanceID) * 2.0)]);
gl_Position.y = dot(pos, vfuniforms[int(float(gl_InstanceID) * 2.0 + 1.0)]);

}

如果我尝试使用Vulkan SDK随附的glslangValidator将其编译为SPIR-V,则会得到:
WARNING: 0:2: '#extension' : extension not supported: GL_ARB_draw_instanced
ERROR: 0:14: 'gl_InstanceID' : undeclared identifier
ERROR: 1 compilation errors. No code generated.

如果删除 #extension GL_ARB_draw_instanced行,仍然会出现 gl_InstanceID错误。是否可以编写实例化GLSL并将其编译为SPIR-V?如果是这样,我做错了什么?

最佳答案

引用编译器用来为Vulkan生成SPIR-V的GLSL形式不使用常规的OpenGL扩展。它遵循GLSL 4.50的规则,但是通过隐式伪扩展GL_KHR_vulkan_glsl的指示来修改/覆盖它们。请注意,您无需使用#extension来启动它;由于您使用的是Vulkan GLSL-to-SPIR-V编译器,因此假定它是事件的。

特别是,此扩展删除了gl_InstanceID(和gl_VertexID)。相反,它将创建自己的变量gl_InstanceIndex。这样做的原因是因为OpenGL太愚蠢了。

请参阅,gl_InstanceID是从instanced drawing command中的第一个实例开始的实例。但是,当添加基本实例渲染(渲染任意范围的实例的功能)时,gl_InstanceID并未更新为匹配。因此,如果您从具有2个实例的5个实例的基本实例开始,则第一个gl_InstanceID仍将为零(其后为1、2、3和4)。因此,基本实例唯一影响的是instanced arrays

自然,Vulkan在这方面不想让OpenGL变得愚蠢,因此它使用了大多数人期望的实例值:用户要求渲染的实际实例索引。但这需要一个新变量,这样用户就不会做您想做的事情:在OpenGL和Vulkan中意外地使用相同的变量,而没有意识到他们具有不同的语义。

您将需要两个着色器,或者检查是否定义了VULKAN,这将适用于使用GL_KHR_vulkan_glsl扩展名的用户。如果是,则使用gl_InstanceIndex;如果不是,则使用gl_InstanceID。另外,您的#extension声明也应包含范围,因为Vulkan GLSL-to-SPIR-V编译器将采用GLSL 4.50,并且不一定提供扩展。

关于glsl - Vulkan中的实例化GLSL着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com