这是(简单的)实例化着色器,我可以想出,这基本上只是变换了一堆2D原语:Vulkan中的实例化GLSL着色器?
#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)]);
}
如果我尝试用自带的glslangValidator编译这SPIR-V福尔康SDK,我得到:
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?如果是这样,我做错了什么?
我仍然显然需要'#extension GL_ARB_shading_language_420pack:enable',否则我得到'layout(binding = ...)'的编译错误。 GL_KHR_vulkan_glsl的文档使用布局绑定,但似乎没有提到这一点)。无论如何,我的实例着色器现在编译 - 谢谢。 – MuertoExcobito
@MuertoExcobito:您的#version 400声明可能会让您感到困惑。他们真的应该有他们自己的版本号:'#version 100 vulkan',这是GLSL ES拥有'#version 300 es'的方式。 –