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:

  1. Proč se to stalo? Mohlo to být kvůli tomu, že na těchto počítačích byly nainstalovány starší ovladače?

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *