Jag utvecklade en liten motor som kördes på en kombination av SDL och OpenGL, och jag vill använda den motorn för ett skolprojekt, så jag behövde testa det på en skoldator för att se föreställningen. Detta resulterade i ett kompileringsfel för skuggning:

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

Detta är min fragmentskuggning, där felet uppstod:

 #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; } 

Jag löste det med hjälp av texture2D -funktion istället för texture. Den äldre funktionen rekommenderas dock inte i nyare kod. Detta ger mig två frågor:

  1. Varför hände detta? Kan det bero på att äldre drivrutiner har installerats på dessa datorer?

  2. Vad ska jag göra när jag vill följa de nya riktlinjerna, och också att göra det körbart på äldre maskiner? ? Jag tänkte på att använda två olika skuggor och låta programmet bestämma versionen, men jag är inte säker.

Svar

Du kan använda ett makro:

#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV); 

Jag hittade det här svaret , som verkar ha en kompatibilitets inkludera som hanterar mer än bara texture2d.

Svar

Din hemdator har förmodligen en högre skuggversion än skoldatorn, eftersom GPU är äldre. Äldre glsl-versioner använde texture2d -funktionen, medan nyare helt enkelt använder texture.

Du behöver inte har två olika skuggkoder, du kan göra den dynamisk med förprocessorer:

#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif 

När koden sammanställs bestämmer opengl vilken version som ska användas.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *