2011-09-25 2 views
4

텍스처 유닛을 끄거나 최소한 텍스처를 바인딩 할 때 상태 유닛이 변경되지 않도록하려면 어떻게합니까? 나는 쉐이더를 사용하고있어 glDisable이 없다고 생각하지 않는다. 텍스처 2의 생성 있기 때문에 텍스처 유닛의 상태와 관련된 될 것, 이것이 가능하지 않은 것,OpenGL, 텍스처 유닛 glActiveTexture 및 glBindTexture를 비활성화합니다.

Create texture 1 (implies binding it) 
Use texture 1 with texture unit 1 
Create texture 2 (implies binding it) 
Use texture 2 with texture unit 2 

하지만, 주어진 glActiveTexture 의미 : 문제는 일련의 사건은 다음과 같이 보일 수 있다는 것입니다 1, 마지막 단위 인 glActiveTexture를 호출했습니다.

Create texture 1 
Create texture 2 
Use texture 1 with texture unit 1 
Use texture 2 with texture unit 2 
나는 과정의 예를 단순화했습니다

하지만 텍스처를 생성하고 바인딩 부수적 만의 일환으로 텍스처를 결합하더라도 현재 활성화 된 텍스처 유닛에 영향을 미칠 수 있다는 사실을 : 즉, 당신이 작성해야 창조 과정은 나를 다소 불편하게 만듭니다. 물론 여기에 오류가 발생하지 않았다면 현재 glActiveTexture에서 상태 변경을 사용하지 못하게 할 수있는 방법이 있습니까?

도움을 주셔서 감사합니다.

답변

4

이것은 OpenGL에서 함께 생활하는 법을 배우기 만하면됩니다. GL 함수는 현재 상태에만 영향을줍니다. 따라서 객체를 수정하려면 객체를 현재 상태에 바인딩하고 수정해야합니다.

그러나 일반적으로 문제가 발생하지 않아야합니다. 텍스처를 사용할 위치에 바인딩 할 이유가 없습니다. 장면을 실제로 이동하고 렌더링을 위해 텍스처를 바인딩하는 코드는 이 아니며은 텍스처를 생성하지 않아야합니다. 렌더링 코드는 각 렌더링에 필요한 모든 상태를 설정해야합니다 (모든 렌더링 상태가이 렌더링 호출에서 이전에 설정되었음을 알지 못하는 경우 제외). 따라서 각 객체에 필요한 모든 텍스처를 바인딩해야합니다. 따라서 이전에 생성 된 텍스처는 제거됩니다.

일반적으로 생성 후 텍스처 바인딩 해제를 제안합니다 (예 : glBindTexture(..., 0)). 이렇게하면 주변에 달라 붙지 않습니다.

텍스처를 바인딩 할 때 현재 바인딩 된 텍스처를 바인딩 해제합니다. 따라서 텍스처 함수는 새 오브젝트에만 영향을 미칩니다.

그러나 EXT 확장 프로그램에 의존하려면 EXT_direct_state_access가 필요합니다. NVIDIA와 AMD가 지원하므로 널리 사용 가능합니다. 바인딩하지 않고 개체를 수정할 수 있으므로 바인딩하지 않고 텍스처를 만들 수 있습니다.

+0

방금 ​​EXT_direct_state_access가 완성 된 기사가 아닌 것을 읽고 있었기 때문에 나는 그것을 피할 것이라고 생각합니다. 하지만 전체적으로는 텍스처 생성과 바인딩을 그렇게 할 생각은 없지만, 어느 시점에서 검은 색 표면을 얻고이를 추적하는 데 어려움을 겪을 것이라고 생각하게 만듭니다! – Robinson