Egy kis motort fejlesztettem ki, amely SDL és OpenGL kombinációjával működött, és ezt a motort egy iskolai projekthez szeretném használni, ezért tesztelnem kellett egy iskolai PC-n, hogy lássa a teljesítményt. Ez egy shader fordítási hibát eredményezett:
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
Ez a töredék árnyékolóm, ahol a hiba történt:
#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; }
Megoldottam a texture2D
függvény a texture
helyett. A régebbi funkció azonban nem ajánlott az újabb kódokban. Így két kérdésem marad:
-
Miért történt ez? Lehetséges, hogy régebbi illesztőprogramokat telepítettek ezekre a számítógépekre?
-
Mit kell tennem, ha követni akarom az új irányelveket, és azt is, hogy futtathatóbbá tegyem régebbi gépeken? ? Gondoltam két különböző shader használatára, és hagyom, hogy a program döntsön a verzióról, de nem vagyok biztos benne.
Válasz
Használhat makrót:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Megtaláltam ezt a választ , amely úgy tűnik, hogy kompatibilis a következõvel: nem csak texture2d
.
Válasz
Az otthoni számítógépén valószínűleg magasabb árnyékoló verzió van, mint az iskolai PC-nél, mert a GPU idősebb. A régebbi glsl verziók a texture2d
függvényt használták, míg az újabbak egyszerűen a texture
funkciót.
Nem kell 2 különböző shader kóddal rendelkezik, azt az előfeldolgozókkal dinamikussá teheti:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Amikor a kód lefordul, az opengl eldönti, hogy melyik verziót használja.