Heim  >  Artikel  >  Backend-Entwicklung  >  Der GLSL-Fragment-Shader kann ohne Meldung nicht kompiliert werden

Der GLSL-Fragment-Shader kann ohne Meldung nicht kompiliert werden

PHPz
PHPznach vorne
2024-02-14 12:18:09537Durchsuche

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

php-Editor Yuzai stellte fest, dass der GLSL-Fragment-Shader beim Kompilieren auf Probleme gestoßen ist, es gab jedoch keine Fehlermeldung. Dies kann dazu führen, dass Entwickler nicht wissen, was schief gelaufen ist. Bevor Sie dieses Problem lösen, müssen Sie zunächst klarstellen, dass das Fehlen einer Fehlermeldung normalerweise darauf zurückzuführen ist, dass der Compiler keine Fehlermeldung generiert hat oder die Fehlermeldung ignoriert wurde. Als nächstes müssen wir die möglichen Ursachen Schritt für Schritt untersuchen, um eine Lösung zu finden.

Frageninhalt

Ich verwende die Go-GL-Bindungen für OpenGl.

Ich habe die Quellen für beide Shader wie folgt definiert:

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

Vertex-Shader werden ohne Probleme erstellt und kompiliert.

Hier ist der Code zum Erstellen und Kompilieren des Fragment-Shaders:

<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: %s\n", infoLog)
    fmt.Printf("gl version: %s\n", gl.GoStr(gl.GetString(gl.VERSION)))
    fmt.Printf("gl vendor: %s\n", gl.GoStr(gl.GetString(gl.VENDOR)))
    return
}
</code>

Gibt Folgendes aus (frustrierenderweise keine informative Protokollmeldung):

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

Ich habe verschiedene Werte in der Version ausprobiert core/compatibility 之间切换,更改 FragColor 的名称以及 vec4.

Ich habe auch versucht, es zu kommentieren if 块并继续创建该程序。检查程序的块输出一个错误,这是预期的,因为着色器未编译: error: linking with uncompiled/unspecializedshader

Gibt es Feedback zum Kompilieren des Fragment-Shaders?

Lösung

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

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

Ursache gl.GetShaderiv()gl.GetShaderiv()gl.COMPILE_STATUS 结果 successgl.FALSE。是因为如果上次编译成功, gl.COMPILE_STATUS 只会产生 gl.TRUE 。但是,由于您从未调用过 gl.CompileShader(),因此之前没有成功编译,因此您收到 gl.FALSE und gl.COMPILE_STATUS führen dazu, dass success gl.FALSE ist. Dies liegt daran, dass gl.COMPILE_STATUS nur dann gl.TRUE erzeugt, wenn die letzte Kompilierung erfolgreich war. Da Sie jedoch nie gl.CompileShader() aufgerufen haben, gab es zuvor keine erfolgreiche Kompilierung, sodass Sie gl.FALSE erhalten. Außerdem ist das Infolog leer, da bisher keine Fehler aufgetreten sind.

Das obige ist der detaillierte Inhalt vonDer GLSL-Fragment-Shader kann ohne Meldung nicht kompiliert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen