2017-02-21 5 views
0

나는 C에서의 OpenGL 4.5을 사용하여 ++와 GLSL (410)유니폼을 설정하기 전에 왜 셰이더 프로그램을 사용해야합니까?

하고 내가 먼저 glUseProgram와 쉐이더 프로그램을 사용하지 않고 셰이더 프로그램의 균일 변수를 설정하려고 시도했습니다 최근 문제가 건너 왔어요. 나는 내 shader_program에 첨부 된 input_color (출력 색상을 설정할 vec4)이라는 균일 한 변수를 가진 조각 셰이더를 사용했습니다. 나는 do do을 사용해야한다.

// set uniforms 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

이 프로그램으로 그려진 삼각형은 모두 검은 색이었고 예상 한 결과가 아닙니다. 몇 가지 실험을하고 나면 유니폼을 설정하기 전에 프로그램을 사용해야한다는 것을 알게되었습니다.

// set uniforms 
glUseProgram(shader_program); // my change 
GLint input_color = glGetUniformLocation(shader_program, "input_color"); 
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f); 

드로잉은 올바른 색의 삼각형을 만듭니다.

제 질문은 왜 프로그램을 처음 사용해야합니까? 나는 OpenGL이 상태 기계으로 작동하지만,이 경우 왜 현재의 셰이더 프로그램 상태가 필요한지 이해하고 있습니까? 결국, 나는 input_color의 메모리 인덱스를 얻기 위해 glGetUniformLocation에 명시 적으로 shader_program 인덱스를 매개 변수로 전달합니다.

이 답변을 통해 OpenGL의 상태를 더 잘 이해하고 GPU에서 셰이더 프로그램을 나타내는 메모리 블록을 활용하거나 관리하는 방법을 이해할 수 있기를 바랍니다.

+0

"* OpenGL 4.5 in C++ 및 GLSL 410. *"왜 4.5를 GLSL 4.10과 함께 사용합니까? GLSL 4.50을 사용할 수 없습니까? –

+0

내가 사용하고있는 가이드는 약간 날짜가 있기 때문에 4.10을 지정했습니다. 나는 4.50을 사용하기 시작할 것이다. – Rob

답변

3

당신은 꼭 할 필요는 없습니다. GL 4.1 이상은 glProgramUniform()을 제공하며, 수정하려는 프로그램 개체를 사용합니다.

+0

감사합니다 -이 옵션이 존재하는지 몰랐습니다. 'glUniform'은 "in use"를보고 메모리에 프로그램을 위치시키는 방법을 알고있는 반면,'glProgramUniform'는 다른 프로그램 인덱스를위한 매개 변수를 가지고 있다고 말하는 것이 맞습니까? – Rob

+1

예, OpenGL이 항상 (역사적으로) 가지고 있었던 "bind to use"또는 "bind to modify"접근 방식의 요점입니다. 운 좋게도 OpenGL은 객체를 직접 수정하는 함수를 사용하기 위해 멀리 이동하기 시작했습니다. 이는 OpenGL 4.5에서 'ARB_direct_state_access' 확장을 채택하여 완전히 실현되었습니다. https://www.khronos.org/opengl/wiki/Direct_State_Access를 참조하십시오. – peppe