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:

  1. Miért történt ez? Lehetséges, hogy régebbi illesztőprogramokat telepítettek ezekre a számítógépekre?

  2. 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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük