You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:47:41