2017-10-18 7 views
-1

RGB를 YCbCr로 변환하는 프로그램을 만들고 싶습니다. 그래서 변환 행렬과 벡터를 균일하게 설정해야합니다. glUniform 번 이상 glGetAttribLocation 번으로 전화하면 -1을 반환합니다. 여기 내 코드가있다.하나 이상의 유니폼이 설정된 후 glGetAttribLocation이 -1을 반환합니다.

조각 쉐이더

#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++ 코드

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

'shaderProgram = * program; '이 제대로 작동하는지 확인 하시겠습니까? 이것은 아마도 복사 불가능해야하는 객체에 대한 복사 할당 호출 인 것 같습니다. 그리고 glGetError를 한번이라도 호출하지 않았기 때문에 오류 코드를 검사 할 수 없습니다. – VTT

+0

'GLenum a = glGetError(); fprintf (stdout, "GL_GET_ERROR % d", a);'코드 1282를 인쇄합니다. –

답변

1

당신은 당신의 쉐이더에서 u_ycbcr_vector 유니폼을 가지고 있고 당신이 그것을 사용하고 있지 않습니다. 이것은 GLSL 컴파일러와 링커에 의해 수행되는 일종의 최적화로 선언 된 유니폼에 대해 유효하지 않은 위치를 던져 버리지 만 사용되지는 않습니다. 따라서 유니폼을 사용하지 않을 경우 유니폼을 쉐이더에서 제거한 다음 다시 시도하십시오.