使用HLSL→SPIR-V→OpenGL流程时着色器入口点无效问题
OpenGL中使用HLSL转SPIR-V时特化着色器入口点错误问题
我正尝试在OpenGL应用中使用HLSL,利用其可编译为SPIR-V的特性实现跨DirectX等平台的适配。但调用glSpecializeShaderARB时触发错误:"vert" is not a valid entry point for shader。
操作流程:
- 使用shaderc.net将HLSL编译为SPIR-V二进制
- 通过OpenTK的OpenGL绑定创建着色器对象、传入SPIR-V数据
- 调用
SpecializeShaderARB指定入口点为vert
我试过多份着色器源码,其中一份HLSL源码经RenderDoc反编译得到了合法的GLSL,但仍触发该错误。以下是相关内容:
相关OpenTK代码片段
var shader = GL.CreateShader(ShaderType.VertexShader); GL.ShaderBinary(1, ref shader, ShaderBinaryFormat.SpirV, spirvBytes, spirvBytes.Length); GL.SpecializeShaderARB(shader, "vert", 0, IntPtr.Zero, IntPtr.Zero); var compileStatus = GL.GetShader(shader, ShaderParameter.CompileStatus); if (compileStatus == 0) { var errorLog = GL.GetShaderInfoLog(shader); Console.WriteLine($"Shader error: {errorLog}"); }
HLSL顶点着色器源码
struct VSInput { float3 position : POSITION; float2 uv : TEXCOORD0; }; struct PSInput { float4 position : SV_POSITION; float2 uv : TEXCOORD0; }; PSInput vert(VSInput input) { PSInput output; output.position = float4(input.position, 1.0); output.uv = input.uv; return output; }
RenderDoc反编译的GLSL
#version 450 #extension GL_ARB_separate_shader_objects : enable layout(location = 0) in vec3 position; layout(location = 1) in vec2 uv; layout(location = 0) out vec2 uv0; void main() { gl_Position = vec4(position, 1.0); uv0 = uv; }
SPIR-V反汇编关键片段
OpEntryPoint Vertex %vert "vert" %position %uv %uv0 OpName %vert "vert" OpName %VSInput "VSInput" OpMemberName %VSInput 0 "position" OpMemberName %VSInput 1 "uv" OpName %input "input" OpName %PSInput "PSInput" OpMemberName %PSInput 0 "position" OpMemberName %PSInput 1 "uv" OpName %output "output"
内容的提问来源于stack exchange,提问作者khhs
相关产品推荐
相关产品推荐

