2012-01-01 6 views
3

GLSL에는 gl_lightsource와 같이 미리 정의 된 많은 전역 변수가 있습니다. 셰이더가 액세스 할 수 있기 때문에 전역입니다.GLSL 전역 변수

GLSL에서 사용자 정의 전역 변수는 어떻게 정의합니까?

답변

4

GLSL에는 전역 변수가 없습니다. gl_* 변수는 쉐이더에서 파이프 라인의 프로그래밍 할 수없는 요소에 액세스하기 위해 하드 코딩 된 변수입니다 (은 자동으로 컴파일 시간이 추가됨). Core OpenGL 3.0에서는 gl_LightSource을 포함하여 대부분이 제거되었습니다. 이제 사용자는 자신의 행렬 및 라이트를 처리하여 유니폼으로 쉐이더에 전송해야합니다. 남아있는 모든 목록을보고 싶다면 GLSL Reference Pages을 봐야합니다.

원하는 것은 유니폼입니다. 셰이더간에 유니폼을 동기화하려면 유니폼의 위치를 ​​저장하고 모든 프로그램을 반복하여 유니폼을 각 셰이더에 업로드하십시오.

1

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; 
+0

그러나 program2가 foo에 액세스하려고한다면 어떻게 될까요? –

+0

@KevinKostlan : 두 가지 이상의 프로그램에서 동일한 유니폼을 사용하지 못하게하는 것은 없습니다. 모든 사람에게 위의 절차를 따르십시오. –

+0

glUniformX를 한 번 수행 한 다음 모든 셰이더가 처리 할 수있는 카메라 매트릭스를 원했습니다 (시간 절약). 나는 그것이 존재하지 않는다고 생각한다. –