Estaba desarrollando un pequeño motor que funcionaba con una combinación de SDL y OpenGL, y quería usar ese motor para un proyecto escolar, así que necesitaba probar en una PC de la escuela para ver el rendimiento. Esto resultó en un error de compilación del sombreador:

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

Este es mi sombreador de fragmentos, donde ocurrió el error:

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

Lo resolví usando el texture2D, en lugar de texture. Sin embargo, la función anterior no se recomienda en el código más nuevo. Esto me deja con dos preguntas:

  1. ¿Por qué sucedió esto? ¿Podría haber sido debido a que se instalaron controladores más antiguos en estas PC?

  2. ¿Qué debo hacer cuando quiero seguir las nuevas pautas y también para que se pueda ejecutar en máquinas más antiguas? ? Pensé en usar dos sombreadores diferentes y dejar que el programa decida la versión, pero no estoy seguro.

Respuesta

Podría usar una macro:

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

Encontré esta respuesta , que parece tener una compatibilidad incluida que maneja más que solo texture2d.

Respuesta

La PC de tu casa probablemente tenga una versión de sombreado superior a la de la escuela, porque la GPU es mayor. Las versiones anteriores de glsl usaban la función texture2d, mientras que las más nuevas simplemente usan texture.

No es necesario tiene 2 códigos de sombreado diferentes, puede hacerlo dinámico con preprocesadores:

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

Cuando se compile el código, opengl decidirá qué versión usar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *