Я делаю кроссплатформенную программу OpenGL. Тем не менее, я столкнулся с проблемой, когда glGetUniformLocation, которая должна вернуть местоположение единой переменной в моей шейдерной программе, возвращает -1, и это происходит только в Linux (дистрибутив Raspbian, работает на малине PI), а в Windows тот же код работает отлично! Вот мой код:C++ OpenGL glGetUniformLocation для Sampler2D возвращает -1 на Raspberry PI, но работает на Windows
функция загрузки программы 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;
}
Наконец, сам шейдер:
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);
}
}
Кто-нибудь знает, почему это может произойти? :(Стоит добавить, что код обработки ошибок:
int errorCode = glGetError();
Log(string("Error retrieving variable frameTextureLocation from shader program: "));
Log((const char*)glewGetErrorString(errorCode));
Печать «Ошибка не получение переменной frameTextureLocation из программы шейдера: Нет ошибки».
по какой-то причине genpfault редактируемой мои тегов сообщения поэтому они говорят, что это OpenGL-ES проблема, однако, это не так - это программа OpenGL 2.1. – Sunius
И я отредактировал его, если вы не против. – Sunius
В основном, когда glGetUniformLocation() возвращает -1, ошибок не возникает, и вы объявили форму в шейдере, потому что она была оптимизирована. Но я не понимаю, почему это должно произойти здесь. Возвращает ли glGetUniformLocation (BackgroundTextureUnit) -1? – Dirk