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:

  1. Perché è successo? Potrebbe essere stato a causa di driver più vecchi installati su questi PC?

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *