2016-12-28 7 views
1

나는이 기능이 있습니다glGetProgramIv는()가 보낸 포인터를 변경하지 않습니다

void GetAllUniforms(unsigned int prog) { 
    int total = -1; 
    glGetProgramiv(prog, GL_LINK_STATUS, &total); 
    printf("total & prog: %d %d\n", total, prog); 
    for(int i=0; i<total; ++i) { 
    int name_len=-1, num=-1; 
    GLenum type = GL_ZERO; 
    char name[100]; 
    glGetActiveUniform(prog, i, sizeof(name)-1, 
     &name_len, &num, &type, name); 
    name[name_len] = 0; 
    unsigned int location = glGetUniformLocation(prog, name); 
    printf("Name: %s/Number: %d/Location: %d\n", name, num, location); 
    } 
} 

그건를 목적으로,이 전이 기능을 실행 말을 잘하게, 그러나, 를 간단하게 모든 유니폼을 취득하여 프린트한다 ? 그것은 나에게 줄 것이다 :

Running newpmo/build/out 
total & prog: -1 1 

활성 유니폼 말도 원인이 내가 Gl_Position를 얻을 수있는 위치 벡터를 곱하여 WorldMatrix를 가지고 있고, 더 디버깅에 내가 발견 한 내 GLSL 쉐이더에서 분명이없는 사용자들은 경우 난이 얻을의 5 가정 해 봅시다 다른 번호로 총을 설정

Running newpmo/build/out 
total & prog: 5 1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 
Name: /Number: -1/Location: -1 

이 glGetProgramiv 실제로 내가 내 주소를 전송하고, 비록 어떤 방식으로 총 영향을 미치지 않는 것을 보여줍니다 원인이 꽤 이상한 프로그램이 제대로 컴파일되고 링크되었습니다!

어떻게 가능합니까?

답변

3

GL_LINK_STATUS은 프로그램이 성공적으로 연결되었는지 여부를 반환합니다. 따라서 해당 행이 올바르게 작동하더라도 결과는 이 아니며 값이 반복되어야합니다. 주어진 일을 감안할 때 쿼리하려는 값은 GL_ACTIVE_UNIFORMS입니다.

그러나 귀하의 원칙 문제. OpenGL 오류가 발생했습니다 (BTW : 항상 OpenGL 오류가 있는지 확인하십시오). 함수가 변수를 설정하지 않는 유일한 이유는 오류가 발생한 경우입니다. 그래서 go fetch the error.

잘못된 열거 형 등을 전달하는 것과 같은 명백한 오류가 아니기 때문에 여기에서 볼 수있는 것이 아닐 수 있습니다. 즉,이 함수에 유효한 프로그램을 전달하지 않습니다. 프로그램 객체 대신 쉐이더 객체를 전달하거나 glCreateProgram에서 가져 오지 않은 값을 전달할 수 있습니다.

+0

내 잘못한 점 Gl_Link_Status, 디버깅을 시도해 봤지만 끝내 버렸어. glactiveuniiforms ... – Whiteclaws

+0

나는이 오류를 발견했다. – Whiteclaws