2017-10-18 11 views
-1

Je souhaite créer un programme qui convertit RGB en YCbCr. J'ai donc besoin d'une matrice de transformation et d'un vecteur uniformes. Quand j'appelle glUniform plus d'une fois glGetAttribLocation renvoie -1. Voici mon code.glGetAttribLocation renvoie -1 après la définition de plus d'un uniforme

Fragment Shader

#version 410 
precision highp float; 

uniform sampler2D u_texture; 
uniform mat3 u_ycbcr_matrix; 
uniform mat3 u_ycbcr_vector; 

out vec4 color; 

in vec2 v_coord; 

void main() { 
    color = texture(u_texture, v_coord) + vec4(u_ycbcr_matrix[0], 1); 
} 

C++ Code

void ScreenQuad::createProgram(ShaderProgram * program, string vsPath, string fsPath){ 
shaderProgram = *program; 
shaderProgram.loadVertexShader(vsPath); 
shaderProgram.loadFragmentShader(fsPath); 
shaderProgram.link(); 

GLint attr = glGetAttribLocation(program -> getShaderProgram(), "position"); 
if (attr < 0) { 
    fprintf(stdout, "Nieprawidlowy parametr: position"); 
} 

glVertexAttribPointer(attr, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0); 
glEnableVertexAttribArray(attr); 

shaderProgram.use(); 
program -> setUniforms(); 
glUniform1i(glGetUniformLocation(shaderProgram.getShaderProgram(), "u_texture"), 0); 

int total = -1; 
glGetProgramiv(shaderProgram.getShaderProgram(), GL_ACTIVE_UNIFORMS, &total); 
for(int i=0; i<total; ++i) { 
    int name_len=-1, num=-1; 
    GLenum type = GL_ZERO; 
    char name[100]; 
    glGetActiveUniform(shaderProgram.getShaderProgram(), GLuint(i), sizeof(name)-1, 
         &name_len, &num, &type, name); 
    name[name_len] = 0; 
    GLuint location = glGetUniformLocation(shaderProgram.getShaderProgram(), name); 
    fprintf(stdout, "\n --- %s : %d---", name, location); 
} 

shaderPrograms.push_back(shaderProgram);} 


ShaderProgram RGB2YCbCr::setUniforms() { 
    GLuint program = getShaderProgram(); 
    fprintf(stdout, "\n+++ %d +++ \n", glGetUniformLocation(program, "u_ycbcr_matrix")); 
    glUniformMatrix3fv(glGetUniformLocation(program, "u_ycbcr_matrix"), 1, GL_FALSE, ycbcr_matrix); 

    fprintf(stdout, "\n+++ %d +++ \n", glGetUniformLocation(program, "u_ycbcr_vector")); 
    glUniform3fv(glGetUniformLocation(program, "u_ycbcr_vector"), 1, ycbcr_vector); 
}; 
+4

Êtes-vous sûr que 'shaderProgram = * program;' fonctionne correctement? Cela semble être une invocation d'une copie sur un objet qui devrait probablement être non-copiable. Et vous n'avez même pas appelé 'glGetError' une seule fois pour vérifier le code d'erreur. – VTT

+0

'GLenum a = glGetError(); Fprintf (stdout, "GL_GET_ERROR% d", a); 'imprime le code 1282 –

Répondre

1

Vous avez u_ycbcr_vector uniforme dans votre shader et vous ne l'utilisez pas. C'est une sorte d'optimisation faite par le compilateur et l'éditeur de liens GLSL qui va lancer des emplacements invalides pour les uniformes déclarés mais non utilisés. Supprimez donc cet uniforme du shader si vous ne l'utilisez pas, puis réessayez.