Ik was een kleine motor aan het ontwikkelen die draait op een combinatie van SDL en OpenGL, en ik wil die motor gebruiken voor een schoolproject, dus ik moest testen het op een school-pc om de uitvoering te zien. Dit resulteerde in een compileerfout van de arcering:
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
Dit is mijn fragmentshader, waar de fout optrad:
#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; }
Ik heb het opgelost door de texture2D
-functie, in plaats van texture
. De oudere functie wordt echter niet aanbevolen in nieuwere code. Dit laat me met twee vragen:
-
Waarom is dit gebeurd? Zou het komen doordat oudere stuurprogrammas op deze pcs zijn geïnstalleerd?
-
Wat moet ik doen als ik de nieuwe richtlijnen wil volgen, en ook om het op oudere machines bruikbaar te maken ? Ik dacht erover om twee verschillende shader, s te gebruiken en het programma te laten beslissen over de versie, maar ik weet het niet zeker.
Antwoord
Je zou een macro kunnen gebruiken:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Ik heb dit antwoord gevonden, dat een compatibiliteitsonderdeel lijkt te hebben dat meer verwerkt dan alleen texture2d
.
Answer
Uw thuis-pc heeft waarschijnlijk een hogere shader-versie dan de school-pc, omdat de GPU is ouder. Oudere glsl-versies gebruikten de texture2d
-functie, terwijl nieuwere eenvoudig texture
gebruiken.
U hoeft niet 2 verschillende arceringcodes hebben, je kunt het dynamisch maken met preprocessors:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Wanneer de code wordt gecompileerd, zal opengl beslissen welke versie te gebruiken.