Maison > Article > développement back-end > Le shader de fragment GLSL ne parvient pas à se compiler sans aucun message
L'éditeur php Yuzai a découvert que le shader de fragment GLSL rencontrait des problèmes lors de la compilation, mais il n'y avait aucun message d'erreur. Cela peut laisser les développeurs confus quant à ce qui n’a pas fonctionné. Avant de résoudre ce problème, la première chose à clarifier est qu'aucun message d'erreur n'est généralement dû au fait que le compilateur n'a généré aucun message d'erreur ou que le message d'erreur a été ignoré. Ensuite, nous devons analyser étape par étape les causes possibles pour trouver une solution.
J'utilise les liaisons go-gl pour OpenGl.
J'ai défini les sources des deux shaders comme suit :
<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>
Les Vertex shaders sont créés et compilés sans problème.
Voici le code pour créer et compiler le fragment shader :
<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>
Affiche ce qui suit (frustrant, aucun message de journal d'information) :
Got failure from fragment shader: gl version: 4.6 (Compatibility Profile) Mesa 23.0.4-0ubuntu1~23.04.1 gl vendor: Intel
J'ai essayé différentes valeurs en version core
/compatibility
之间切换,更改 FragColor
的名称以及 vec4
.
J'ai aussi essayé de commenter if
块并继续创建该程序。检查程序的块输出一个错误,这是预期的,因为着色器未编译: error: linking with uncompiled/unspecializedshader
Des retours sur la façon de compiler le fragment shader ?
Appelez glShaderSource()
仅设置源着色器的代码。它无法编译。之后需要单独调用glCompileShader()
.
gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil) gl.CompileShader(fragmentShader)
Parce que gl.GetShaderiv()
gl.GetShaderiv()
与gl.COMPILE_STATUS
结果 success
为 gl.FALSE
。是因为如果上次编译成功, gl.COMPILE_STATUS
只会产生 gl.TRUE
。但是,由于您从未调用过 gl.CompileShader()
,因此之前没有成功编译,因此您收到 gl.FALSE
et gl.COMPILE_STATUS
entraînent que success
est gl.FALSE
. En effet, gl.COMPILE_STATUS
ne produira gl.TRUE
que si la dernière compilation a réussi. Cependant, comme vous n'avez jamais appelé gl.CompileShader()
, aucune compilation n'a réussi auparavant, vous recevez donc gl.FALSE
. De plus, le journal d'informations est vide puisqu'il n'y a eu aucune erreur jusqu'à présent.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!