Maison > développement back-end > Golang > 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
Libérer: 2024-02-14 12:18:09
avant
615 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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
Copier après la connexion

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(). < /p>

gl.ShaderSource(fragmentShader, 1, &fragmentShaderSourceC, nil)
gl.CompileShader(fragmentShader)
Copier après la connexion

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal