2011-03-03 7 views
3

내 최초의 게임 엔진 압연 해요 : D를. 지금 텍스쳐 리소스 매니저에서 일하고 있는데, 제대로하고 싶습니다. 의 OpenGL 텍스처 관리

는 그냥 드라이버가 지원하는 ActiveTexture 유닛을 모두 채울 수있는 방법에 나쁜가요? 대안은 glBindTexture 호출을 희생하면서 실제로 필요한 경우에만 이러한 슬롯을 보존하고 텍스처 만 설정하는 것입니다.

+1

'슬롯'은 무엇을 의미합니까? 필요에 따라 메모리에 많은 텍스처를 유지하고 필요할 경우에만 바인딩 (이상적)하여 정확한 텍스처가 이미 바인드 된 경우 호출을 피하십시오. –

+0

아 죄송합니다. 슬롯이란 의미하는 단위를 의미합니다. glActiveTexture (...) 호출로 선택한 것과 마찬가지로). – Hannesh

답변

5

당신이 당신의 질문을하는 방법 당신이 텍스처 객체, 즉 질감 저장 사이의 오해에서 고통을 생각하고 텍스처 유닛, 즉 멀티 텍스처링 뒤에 기계.

OpenGL은 텍스처 객체와 텍스처 유닛을 가지고있다. 텍스처 객체는 데이터를 보유하고, 텍스처 유닛은 바인딩 된 텍스처 객체의 데이터를 렌더링 프로세스에 매핑합니다.

는 일반적으로 하나의 텍스처 객체로 장면에 필요한 모든 텍스처를 업로드합니다. 또한 공통 재질 설정을 사용하는 각 렌더 배치에 대해 렌더링 프로세스에서 텍스처를 올바른 텍스처 단위에 바인딩합니다.

+0

질문이 불분명하면 죄송합니다. 텍스처와 텍스처 단위의 차이점을 이해합니다. GL_MAX_TEXTURE_UNITS가 내가 가지고있는 텍스처의 수보다 크면 모든 텍스처를 텍스처 단위로 매핑 할 수 있으며 그리는 동안 glBindTexture 호출을 사용하지 않아도됩니까? – Hannesh

+1

물론이 작업을 수행 할 수 있지만 이점은 무엇이라고 생각하십니까? 모든 텍스처를 텍스처 단위에 바인딩하면 GPU 샘플이 만들어집니다. 비활성화 된 단일 텍스처 단위가 아니라면 un/binding으로 추가 비용이 발생하지 않습니다. 텍스처를 바인딩하거나 텍스처 단위를 활성화하는 것은 캐시 무효화에 기인합니다. 렌더링 성능을 향상시키는 훨씬 더 나은 방법은 재질 및 텍스처 상태를 사용하여 드로잉 작업을 정렬하고 상태 스위치를 최소화하는 것입니다. 그리고 텍스쳐 유닛을 디스 에이블하거나 인 에이블하는 것은 또한 비용이 든다. – datenwolf

+0

@ datenwolf : 여기에 염료/그림 유추와 함께 여기에 대한 대답은 http://stackoverflow.com/questions/8866904/need-help-understanding-the-differences-and-relationship-between-glactivetexture (다시 작성)로 만들었습니다. OpenGL에서 텍스처 관리를 이해합니다 :) 고마워요! – legends2k

2

나는 당신이 당신이 VRAM 사용을 최소화하는 접근 방식을 고려해야 할 GPU에 즉 텍스처 톤, 업로드를 사용하려고하는 경우주의해야하는 것이 생각합니다. 난 당신을 대신하여 benifit 수 있습니다 생각 어떤 경우입니다 DXT1/DXT5 압축 당신은 당신의 텍스처를 압축하고 CompressedTexture2D, 당신은 GPU에 업로드 모든 텍스처가 1 걸릴 것이 방법을 사용하여 업로드 할 수는 ANSI C로 작성되는 stb_dxt/8 정상적인 공간.

런타임에 모든 텍스처를 압축하면 게임로드가 느려지므로 DDS 텍스처를 사용하는 것이 좋습니다. nvidia-texture 도구를 사용하여 텍스처 압축을 외부 적으로 관리 할 수 ​​있습니다.