Stavo sviluppando un piccolo motore in esecuzione su una combinazione di SDL e OpenGL e desidero utilizzarlo per un progetto scolastico, quindi ho dovuto testare su un PC della scuola per vedere le prestazioni. Ciò ha comportato un errore di compilazione dello shader:
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
Questo è il mio fragment shader, dove si è verificato lerrore:
#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; }
Lho risolto utilizzando texture2D
, invece di texture
. Tuttavia, la funzione precedente non è consigliata nel codice più recente. Questo mi lascia con due domande:
-
Perché è successo? Potrebbe essere stato a causa di driver più vecchi installati su questi PC?
-
Cosa devo fare quando voglio seguire le nuove linee guida e anche per renderlo eseguibile su macchine meno recenti ? Ho pensato di utilizzare due diversi shader e lasciare che il programma decida la versione, ma non ne sono sicuro.
Risposta
Potresti usare una macro:
#if __VERSION__ < 130 #define TEXTURE2D texture2D #else #define TEXTURE2D texture #endif ... vec4 textureColor = TEXTURE2D(mySampler, fragmentUV);
Ho trovato questa risposta , che sembra avere uninclusione di compatibilità che gestisce più del semplice texture2d
.
Risposta
Il tuo PC di casa probabilmente ha una versione shader più alta rispetto al PC della scuola, perché la GPU è più vecchio. Le versioni glsl precedenti utilizzavano la funzione texture2d
, mentre quelle più recenti usano semplicemente texture
.
Non è necessario hanno 2 diversi codici shader, puoi renderlo dinamico con i preprocessori:
#if __VERSION__ > 120 color = texture(sampler, texCoord); #else color = texture2D(sampler, texCoord); #endif
Quando il codice viene compilato, opengl deciderà quale versione usare.