最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • GLSL 片段着色器无法编译且没有任何消息

    glsl 片段着色器无法编译且没有任何消息

    php小编鱼仔发现,GLSL 片段着色器在编译时遇到问题,却没有任何错误消息。这可能让开发者感到困惑,不知道出了什么问题。在解决这个问题之前,首先要明确的是,没有错误消息通常是因为编译器没有产生任何错误信息,或者错误信息被忽略了。接下来,我们需要逐步排查可能的原因,以找到解决办法。

    问题内容

    我正在使用 OpenGl 的 go-gl 绑定。

    我定义了两个着色器的源,如下所示:

    <code>const vertexShaderSource = `#version 460 compatibility
    layout (location = 0) in vec3 aPos;
    void main()
    {
        gl_Position = vec4(aPos, 1.0);
    }` + "x00"
    const fragmentShaderSource = `#version 460 compatibility
    out vec4 FragColor;
    void main()
    {
        FragColor = vec4(0.5f, 0.1f, 0.1f, 1.0f);
    }` + "x00"
    </code>

    顶点着色器的创建和编译没有问题。

    以下是创建和编译片段着色器的代码:

    <code>fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER)
    fragmentShaderSourceC := gl.Str(fragmentShaderSource)
    gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil)
    gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &success)
    if success != gl.TRUE {
        var length int32
        infoLogC := [LOGSIZE]uint8{}
        gl.GetShaderInfoLog(fragmentShader, LOGSIZE, &length, &infoLogC[0])
        infoLog := gl.GoStr(&infoLogC[0])
        fmt.Printf("Got failure from fragment shader: %sn", infoLog)
        fmt.Printf("gl version: %sn", gl.GoStr(gl.GetString(gl.VERSION)))
        fmt.Printf("gl vendor: %sn", gl.GoStr(gl.GetString(gl.VENDOR)))
        return
    }
    </code>

    输出以下内容(令人沮丧的是,没有信息日志消息):

    Got failure from fragment shader: 
    gl version: 4.6 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~23.04.1
    gl vendor: Intel

    我尝试在版本 core/compatibility 之间切换,更改 FragColor 的名称以及 vec4 中的不同值。

    我还尝试注释掉 if 块并继续创建该程序。检查程序的块输出一个错误,这是预期的,因为着色器未编译: error: linking with uncompiled/unspecializedshader

    有关如何编译片段着色器的任何反馈吗?

    解决方法

    调用 glShaderSource() 仅设置源着色器的代码。它无法编译。之后需要单独调用glCompileShader()

    gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil)
    gl.CompileShader(fragmentShader)
    

    原因 gl.GetShaderiv()gl.COMPILE_STATUS 结果 successgl.FALSE。是因为如果上次编译成功, gl.COMPILE_STATUS 只会产生 gl.TRUE 。但是,由于您从未调用过 gl.CompileShader(),因此之前没有成功编译,因此您收到 gl.FALSE。此外,由于到目前为止还没有任何错误,因此信息日志也是空的。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » GLSL 片段着色器无法编译且没有任何消息
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情