2012-06-23 7 views
1

프래그먼트 쉐이더에서 동시에 액세스해야하는 N 텍스처 단위가 있습니다. N은로드되는 데이터에 따라 다릅니다. iOS의 OpenGL ES 2.0의 쉐이더에서 텍스처 유닛의 수를 가변

// illegal syntax? 
uniform sampler2D tex[N]; 

는 또한, sampler2DArray에서 OpenGL ES 2.0에서 지원 보이지 않습니다 그래서, 쉐이더에서, 내가 좋아하는 뭔가를해야합니다.

위의 내용을 달성하는 데 사용할 수있는 다른 트릭이나 GLSL 전 처리기 구조가 있는지 궁금합니다.

또는 셰이더 코드를 동적으로 생성하는 것이 더 좋은 옵션입니까? 나는 다음과 같은 코드를 생성하고, 쉐이더로드 할 수 :

uniform sampler2D tex1; 
... 
uniform sampler2D texN; 

답변

0

당신이 샘플러의 일정한 최대 수를 정의하는 시도 할 수 있습니다, 그리고 런타임에 실제 크기를받을 수 있습니다.

uniform sampler2D tex[MAX_VALUE]; 
uniform int size; 
int main(){ 
    .... 
} 
+0

MAX_VALUE 유형은 무엇입니까? 설정은 어디입니까? 위의 내용이 합법적 인 구문이라고 생각하지 않습니다. –

+0

MAX_VALUE 상수 (16, 32, 64) – labotsirc

+0

N이 데이터에 의존하므로 작동하지 않습니다. 위의 작업을 수행하려면 쉐이더를 동적으로 생성해야합니다. 또한, ES 2.0에서 지원되는 sampler2D의 일정한 배열이 있습니까? 나는 그것을 의심한다. –

0

배열의 크기를 명시 적으로 설정해야합니까? 나의 이해하려면 사용하여 임의의 크기의 sampler2D 년대의 균일 한 배열을 지정할 수 있습니다 : 내 생각

uniform sampler2D tex[]; 

은 일반적으로 당신이하려는 방식으로 작동하지만, 명시 적으로 크기를 설정하지 않고 있습니다. 이 방법을 사용하고 있지만 배열에 하나의 텍스처 만 제공하고 나중에 배열 인덱스 tex [0]을 사용하여 코드를 참조합니다. 아직 거기에 1 개 이상의 텍스처를 넣을 준비가 된 시점까지 모든 것을 빌드하지 않았으므로이 작업을 100 % 수행하지는 않습니다.

저는 OpenGL을 처음 사용하기 때문에 내가 모르는 배열의 크기를 정의 할 때 몇 가지 이점이있을 수 있습니다.

+0

나는 이것이 더 많은 텍스처에 대해 작동하지 않을 것이라고 생각합니다. OpenGL ES 2.0에 있습니까? –

+0

당신이 옳다고 생각합니다. 실수로 비 ES 사양을 읽은 후에 쓰고 싶습니다. – jankins

+0

텍스쳐 배열 자체가 지원되는 것처럼 보이지만 예제 6_3의 iOS 용 OpenGL ES 학습 책에서는 uniform sampler2D u_unit2d [MAX_TEXTURES]; 구문을 사용하여 보여줍니다. #define MAX_TEXTURES 2는 쉐이더의 맨 위에 정의되어 있으므로 여전히 변수가 아닙니다. 뭔가 도움이 될 수있는 Brad Larson은 동적으로 셰이더를 만드는 데 도움이 될 수있는 NSString의 셰이더로드를 지원하기 위해 GPUImage 라이브러리에서 GLProgram을 채택했습니다. – jankins