Maison  >  Article  >  développement back-end  >  Le shader de fragment GLSL ne parvient pas à se compiler sans aucun message

Le shader de fragment GLSL ne parvient pas à se compiler sans aucun message

PHPz
PHPzavant
2024-02-14 12:18:09537parcourir

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

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.

Contenu de la question

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 ?

Solution

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

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

Parce que gl.GetShaderiv()gl.GetShaderiv()gl.COMPILE_STATUS 结果 successgl.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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer