2013-03-12 4 views
3

Я делаю кроссплатформенную программу 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 из программы шейдера: Нет ошибки».

+0

по какой-то причине genpfault редактируемой мои тегов сообщения поэтому они говорят, что это OpenGL-ES проблема, однако, это не так - это программа OpenGL 2.1. – Sunius

+0

И я отредактировал его, если вы не против. – Sunius

+1

В основном, когда glGetUniformLocation() возвращает -1, ошибок не возникает, и вы объявили форму в шейдере, потому что она была оптимизирована. Но я не понимаю, почему это должно произойти здесь. Возвращает ли glGetUniformLocation (BackgroundTextureUnit) -1? – Dirk

ответ

0

Всегда указывайте GLSL version в верхней части ваших шейдеров, в противном случае это по умолчание очень старой версии. она должна быть первой линией. это также устраняет необходимость в проверке версии встроенных.

#version 150 
// rest of shader here