-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);
};
'shaderProgram = * program; '이 제대로 작동하는지 확인 하시겠습니까? 이것은 아마도 복사 불가능해야하는 객체에 대한 복사 할당 호출 인 것 같습니다. 그리고 glGetError를 한번이라도 호출하지 않았기 때문에 오류 코드를 검사 할 수 없습니다. – VTT
'GLenum a = glGetError(); fprintf (stdout, "GL_GET_ERROR % d", a);'코드 1282를 인쇄합니다. –