Je développais un petit moteur fonctionnant sur une combinaison de SDL et dOpenGL, et je souhaite utiliser ce moteur pour un projet scolaire, jai donc dû tester sur un PC scolaire pour voir la performance. Cela a entraîné une erreur de compilation du shader:
Shader compile ERROR
DEBUG INFO: ERROR: 0:12: "texture" : no matching overloaded function found (using implicit conversion)
ERROR 0:12: "=" : cannot convert from "const float" to "4-component vector of float"
Failed to load uniform
Voici mon fragment shader, où lerreur sest produite:
#version 130 in vec4 fragmentColor; in vec2 fragmentUV; out vec4 color; uniform float time; uniform sampler2D mySampler; void main(){ vec4 textureColor = texture(mySampler, fragmentUV); color = textureColor * fragmentColor; }
Je lai résolu en utilisant le texture2D
au lieu de texture
. Cependant, lancienne fonction nest pas recommandée dans le code plus récent. Cela me laisse avec deux questions:
-
Pourquoi est-ce arrivé? Est-ce que cela pouvait être dû à linstallation danciens pilotes sur ces PC?
-
Que dois-je faire lorsque je souhaite suivre les nouvelles directives, et aussi pour le rendre exécutable sur des machines plus anciennes ? Jai pensé à utiliser deux shaders différents et à laisser le programme décider de la version, mais je ne suis pas sûr.
Réponse
Vous pouvez utiliser une macro:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Jai trouvé cette réponse , qui semble avoir une compatibilité inclure qui gère plus que simplement texture2d
.
Réponse
Votre PC personnel a probablement une version de shader plus élevée que le PC scolaire, car le GPU est plus vieux. Les anciennes versions de glsl utilisaient la fonction texture2d
, tandis que les plus récentes utilisaient simplement texture
.
Vous navez pas besoin de avoir 2 codes shader différents, vous pouvez le rendre dynamique avec des préprocesseurs:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Lorsque le code sera compilé, opengl décidera de la version à utiliser.