Heim > Artikel > Backend-Entwicklung > Der GLSL-Fragment-Shader kann ohne Meldung nicht kompiliert werden
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.
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?
Anruf glShaderSource()
仅设置源着色器的代码。它无法编译。之后需要单独调用glCompileShader()
.
gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.CompileShader(fragmentShader)
Ursache gl.GetShaderiv()
gl.GetShaderiv()
与gl.COMPILE_STATUS
结果 success
为 gl.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!