GLSL에는 gl_lightsource와 같이 미리 정의 된 많은 전역 변수가 있습니다. 셰이더가 액세스 할 수 있기 때문에 전역입니다.GLSL 전역 변수
GLSL에서 사용자 정의 전역 변수는 어떻게 정의합니까?
GLSL에는 gl_lightsource와 같이 미리 정의 된 많은 전역 변수가 있습니다. 셰이더가 액세스 할 수 있기 때문에 전역입니다.GLSL 전역 변수
GLSL에서 사용자 정의 전역 변수는 어떻게 정의합니까?
GLSL에는 전역 변수가 없습니다. gl_*
변수는 쉐이더에서 파이프 라인의 프로그래밍 할 수없는 요소에 액세스하기 위해 하드 코딩 된 변수입니다 (은 자동으로 컴파일 시간이 추가됨). Core OpenGL 3.0에서는 gl_LightSource
을 포함하여 대부분이 제거되었습니다. 이제 사용자는 자신의 행렬 및 라이트를 처리하여 유니폼으로 쉐이더에 전송해야합니다. 남아있는 모든 목록을보고 싶다면 GLSL Reference Pages을 봐야합니다.
원하는 것은 유니폼입니다. 셰이더간에 유니폼을 동기화하려면 유니폼의 위치를 저장하고 모든 프로그램을 반복하여 유니폼을 각 셰이더에 업로드하십시오.
OpenGL의 전역 셰이더 변수를 "유니폼"이라고합니다. 그들은 읽기 전용이며 glUniformX
호출을 사용할 수 있습니다. 대략, 그것은 (이것은 의사의 더) 다음과 같습니다 쉐이더 내에서
// 1. activate the program
glUseProgram(program)
// 2. get uniform location
foo = glGetUniformLocation(program, "foo")
// 3. bind the value, e.g. a single float
glUniform1f(foo, 42.0)
, 당신은 uniform
저장 한정자, 예를 들어,와 변수를 평가해야
uniform float foo;
균일 버퍼를 사용할 수 있습니다. 다음은 자습서입니다. http://www.lighthouse3d.com/tutorials/glsl-tutorial/uniform-blocks/
그러나 program2가 foo에 액세스하려고한다면 어떻게 될까요? –
@KevinKostlan : 두 가지 이상의 프로그램에서 동일한 유니폼을 사용하지 못하게하는 것은 없습니다. 모든 사람에게 위의 절차를 따르십시오. –
glUniformX를 한 번 수행 한 다음 모든 셰이더가 처리 할 수있는 카메라 매트릭스를 원했습니다 (시간 절약). 나는 그것이 존재하지 않는다고 생각한다. –