Ich habe eine kleine Engine entwickelt, die auf einer Kombination aus SDL und OpenGL läuft, und ich möchte diese Engine für ein Schulprojekt verwenden, also musste ich sie testen es auf einem Schul-PC, um die Leistung zu sehen. Dies führte zu einem Shader-Kompilierungsfehler:

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

Dies ist mein Fragment-Shader, bei dem der Fehler aufgetreten ist:

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

Ich habe ihn mithilfe der texture2D anstelle von texture. Die ältere Funktion wird jedoch in neuerem Code nicht empfohlen. Dies lässt mich zwei Fragen offen:

  1. Warum ist das passiert? Könnte es daran liegen, dass ältere Treiber auf diesen PCs installiert sind?

  2. Was soll ich tun, wenn ich die neuen Richtlinien befolgen und sie auch auf älteren Computern ausführen möchte? ? Ich habe darüber nachgedacht, zwei verschiedene Shader zu verwenden und das Programm über die Version entscheiden zu lassen, bin mir aber nicht sicher.

Antwort

Sie können ein Makro verwenden:

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

Ich habe diese Antwort gefunden , die ein Kompatibilitäts-Include zu haben scheint, das mehr als nur .

Antwort

Ihr Heim-PC hat wahrscheinlich eine höhere Shader-Version als der Schul-PC, weil die GPU ist älter. Ältere glsl-Versionen verwendeten die Funktion texture2d, während neuere einfach texture verwenden.

Sie müssen nicht Wenn Sie 2 verschiedene Shader-Codes haben, können Sie diese mit Präprozessoren dynamisch gestalten:

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

Wenn der Code kompiliert wird, entscheidet opengl, welche Version verwendet werden soll.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.