c++ opengl-es shader raspberry-pi

c++ OpenGL glGetUniformLocation para Sampler2D devuelve-1 en Raspberry PI pero funciona en Windows



opengl-es shader (1)

Siempre especifique la versión GLSL en la parte superior de sus sombreadores; de lo contrario, tendrá una versión anterior. Debe ser la primera línea. También eliminará la necesidad de verificar la versión en línea.

#version 150 // rest of shader here

Estoy haciendo un programa OpenGL de plataforma cruzada. Sin embargo, he encontrado un problema, donde glGetUniformLocation, que debe devolver la ubicación de una variable uniforme en mi programa de sombreado, devuelve -1, y solo ocurre en Linux (distribución Raspbian, se ejecutó en Raspberry PI) y en Windows el mismo código funciona perfectamente! Aquí está mi código:

Función del programa Load Shader:

int shader, status; programID = glCreateProgram(); // Load vertex shader shader = LoadShaderFromString(GL_VERTEX_SHADER, Tools::GetFileAsString("VertexShader.glsl"), "Unable to compile vertex shader./n"); glAttachShader(programID, shader); // Load pixel shader shader = LoadShaderFromString(GL_FRAGMENT_SHADER, Tools::GetFileAsString("FilterPixelShader.glsl"), "Unable to compile pixel shader./n"); glAttachShader(programID, shader); // Link the program glLinkProgram(programID); glGetProgramiv(programID, GL_LINK_STATUS, &status); if (status == 0) { Log("Unable to link filter shader program./n"); PrintProgramLog(programID); Fail(); // Quits program } // returns -1 here! frameTextureLocation = glGetUniformLocation(programID, "FrameTextureUnit"); if (frameTextureLocation == -1) { int errorCode = glGetError(); Log(string("Error retrieving variable frameTextureLocation from shader program: ")); Log((const char*)glewGetErrorString(errorCode)) Log("!/n"); Fail(); }

LoadShaderFromString:

int Shader::LoadShaderFromString(int type, const string& shaderSource, const string& errorMessage) { int shader, status; const char* programSource; shader = glCreateShader(type); programSource = shaderSource.c_str(); glShaderSource(shader, 1, &programSource, nullptr); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (status == 0) { Log(errorMessage); PrintShaderLog(shader); Fail(); } return shader; }

Por último, el sombreador en sí:

uniform sampler2D FrameTextureUnit; uniform sampler2D BackgroundTextureUnit; #if __VERSION__ >= 130 // Texture coordinate in vec2 texCoord; // Final color out vec4 gl_FragColor; #else // Texture coordinate varying vec2 texCoord; #endif uniform float Tolerance; // Tolerance for color difference uniform vec4 FilterColor; // Color of the filter void main() { vec4 pixel = texture2D(FrameTextureUnit, texCoord); vec4 background = texture2D(BackgroundTextureUnit, texCoord); float difference = abs(background.x - pixel.x) + abs(background.y - pixel.y) + abs(background.z - pixel.z); if (difference > Tolerance) { gl_FragColor = FilterColor; } else { // Y = 0.2126 R + 0.7152 G + 0.0722 B float gray = pixel.x * 0.2126 + pixel.y * 0.7152 + pixel.z * 0.0722; gl_FragColor = vec4(gray, gray, gray, 1); } }

¿Alguien sabe por qué esto podría estar sucediendo? :( Vale la pena agregar que el código de manejo de errores:

int errorCode = glGetError(); Log(string("Error retrieving variable frameTextureLocation from shader program: ")); Log((const char*)glewGetErrorString(errorCode));

Imprime "Error al recuperar la variable frameTextureLocation del programa Shader: no hay error".