2013-04-18 2 views
0

OpenGL에서 텍스처가 다른 여러 오브젝트를 그리는 일반적인 방법은 glBindTexture을 사용하여 한 번에 하나의 텍스처를 간단히 바인드하고이를 사용하는 오브젝트를 그린 다음 바인딩하는 것입니다. 다른 질감과 동일합니까?다른 텍스처로 여러 오브젝트 그리기

즉, 특정 시간에 하나의 텍스처 만 "활성"상태가 될 수 있으며 이는 glBindTexture을 사용하여 바인딩 된 마지막 텍스처입니다. 이 올바른지?

답변

9

glBindTexture를 사용하여 한 번에 하나의 텍스처를 바인딩하고이를 사용하는 객체를 그린 다음 다른 텍스처를 바인딩하고 동일한 작업을 수행 하시겠습니까? 즉

는 단 하나의 질감이 두 문장은 같은 것이 아니다 특정 시간

에 그리기위한 "활성"이 될 수 있습니다.

한 번의 렌더링 작업으로 언제든지 세트 만 사용할 수 있습니다. 이 세트는 현재 다양한 텍스처 이미지 단위에 바인딩 된 텍스처로 정의됩니다. 사용 가능한 텍스처 이미지 단위 수는 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS을 통해 쿼리 할 수 ​​있습니다.

이렇게 하나의 렌더링 명령에 대해 여러 텍스처를 "활성화"할 수 있습니다.

그러나, 그 하지 텍스처의 무리를 결합하고 각 객체 어디 다음, 여러 개체를 렌더링과 같은 일 만에 바인딩 텍스처의 (귀하의 경우, 또는 1) 일부를 사용합니다. 너 일 수는 있겠지만 실제로는별로 중요하지 않다.

GLSL 샘플러와 텍스처 이미지 단위 간의 연결은 프로그램 개체 상태의 일부입니다. the value you set on the sampler uniform입니다. 그러므로, 당신이 제안한 것을하기 위해, 많은 수의 텍스처를 묶고, 그 중 하나를 유니폼으로 설정하고, 렌더링하고, 유니폼을 다음으로 설정하거나 렌더링 등을해야합니다.

그 텍스처들을 묶는 데 드는 모든 비용. 당신은 여전히 ​​유니폼을 바꾸는 데 드는 오버 헤드를 모두 감수하고 있습니다. 실제로 일반적인 방법 (바인딩, 렌더링, 바인딩, 렌더링)이 균일 한 상태 변경을 포함하지 않으므로 효율성이 떨어질 수 있습니다.

더하기, 이상한 것입니다. 일반적으로 균일 한 샘플러 상태를 동적으로 변경해서는 안됩니다. 간단한 규칙을 정의합니다 (확산 텍스처는 유닛 0, 유닛 1의 반사 등). 모든 GL 3.x 급 하드웨어는 48 개 이상의 텍스처 이미지 단위 (스테이지 당 16 개)를 제공해야하므로 사용자가 다 떨어지는 것과 같지는 않습니다.

당신이 말하는 것과 완전히 다른 것이 아닌 일을하는 메커니즘이 있습니다. 예를 들어, array textures을 활용할 수 있지만 명시 적 셰이더 논리 및 지원이 필요합니다. 당신이 오직 하나만 바인딩하기 때문에 "텍스처 묶음 묶기"방법보다 더 빠를 것입니다. 또한 유니폼을 바꾸려면 샘플러 유니폼이 아닌 일반 데이터 유니폼을 사용하는 것이 더 빠를 것입니다.

배열 텍스처 메커니즘을 사용하면 동일한 개체를 약간 다른 매개 변수로 렌더링한다고 가정 할 때 instancing을 활용할 수도 있습니다.

관련 문제