Vyvíjel jsem malý engine běžící na kombinaci SDL a OpenGL a chci ho použít pro školní projekt, takže jsem potřeboval otestovat na školním počítači, abyste viděli výkon. Výsledkem byla chyba kompilace shaderu:
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
Toto je můj shader fragmentů, kde došlo k chybě:
#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; }
Vyřešil jsem to pomocí texture2D
funkce namísto texture
. Starší funkce se však v novějším kódu nedoporučuje. Zbývají mi tedy dvě otázky:
-
Proč se to stalo? Mohlo to být kvůli tomu, že na těchto počítačích byly nainstalovány starší ovladače?
-
Co mám dělat, když se chci řídit novými pokyny a také zajistit, aby byl provozovatelný na starších počítačích ? Přemýšlel jsem o použití dvou různých shaderů a nechal program rozhodnout o verzi, ale nejsem si jistý.
Odpověď
Můžete použít makro:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Našel jsem tuto odpověď , která zřejmě obsahuje kompatibilitu, která zvládá víc než jen texture2d
.
Odpověď
Váš domácí počítač má pravděpodobně vyšší verzi shaderu než školní počítač, protože GPU je starší. Starší verze glsl používaly funkci texture2d
, zatímco novější jednoduše používají texture
.
Není třeba mají 2 různé shaderové kódy, můžete je dynamizovat pomocí preprocesorů:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Když se kód zkompiluje, opengl rozhodne, kterou verzi použít.