Jeg utviklet en liten motor som kjørte på en kombinasjon av SDL og OpenGL, og jeg vil bruke den motoren til et skoleprosjekt, så jeg trengte å teste den på en skole-PC for å se forestillingen. Dette resulterte i en kompileringsfeil for skyggen:
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
Dette er min fragmentskygge, der feilen oppstod:
#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; }
Jeg løste det ved å bruke texture2D
-funksjon, i stedet for texture
. Den eldre funksjonen anbefales imidlertid ikke i nyere kode. Dette etterlater meg med to spørsmål:
-
Hvorfor skjedde dette? Kan det ha vært på grunn av at eldre drivere ble installert på disse PCene?
-
Hva skal jeg gjøre når jeg vil følge de nye retningslinjene, og også for å gjøre det kjørt på eldre maskiner? ? Jeg tenkte å bruke to forskjellige skyggelegger, og la programmet bestemme hvilken versjon, men jeg er ikke sikker.
Svar
Du kan bruke en makro:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Jeg fant dette svaret , som ser ut til å ha en kompatibilitets inkluderer som håndterer mer enn bare texture2d
.
Svar
Hjemme-PC-en din har sannsynligvis en høyere skyggeversjon enn skole-PC-en, fordi GPU er eldre. Eldre glsl-versjoner brukte texture2d
-funksjonen, mens nyere bare bruker texture
.
Du trenger ikke å har to forskjellige skyggekoder, du kan gjøre den dynamisk med forprosessorer:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Når koden blir samlet, bestemmer opengl hvilken versjon du vil bruke.