Jeg udviklede en lille motor, der kørte på en kombination af SDL og OpenGL, og jeg vil bruge den motor til et skoleprojekt, så jeg havde brug for at teste det på en skolepc for at se forestillingen. Dette resulterede i en shader-kompileringsfejl:

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

Dette er min fragmentskygge, hvor fejlen opstod:

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

Jeg løste det ved hjælp af texture2D funktion i stedet for texture. Den ældre funktion anbefales dog ikke i nyere kode. Dette efterlader mig med to spørgsmål:

  1. Hvorfor skete dette? Kunne det have været på grund af ældre drivere, der blev installeret på disse pcer?

  2. Hvad skal jeg gøre, når jeg vil følge de nye retningslinjer, og også for at gøre det kørt på ældre maskiner ? Jeg tænkte på at bruge to forskellige skygger, og lade programmet bestemme versionen, men jeg er ikke sikker.

Svar

Du kan bruge en makro:

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

Jeg fandt dette svar , der synes at have en kompatibilitet, der inkluderer mere end bare texture2d.

Svar

Din hjemme-pc har sandsynligvis en højere skyggeversion end skole-pcen, fordi GPUen er ældre. Ældre glsl-versioner brugte texture2d -funktionen, mens nyere simpelthen bruger texture.

Du behøver ikke at har 2 forskellige skyggekoder, kan du gøre det dynamisk med præprocessorer:

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

Når koden bliver kompileret, bestemmer opengl hvilken version der skal bruges.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *