2016-07-10 4 views
0

현재 여러 개의 응용 프로그램을 SDL2 렌더링 (내부적으로 OpenGL 사용)에서 "순수한"OpenGL 렌더링으로 마이그레이션하는 중입니다. 이 작업을하는 동안 텍스처를 GPU에 업로드하는 방법을 알아 냈고 모든 텍스처에 인덱스가 있음을 알았습니다.OpenGL + SDL_TTF : 텍스처 인덱스 재활용

텍스트를 렌더링하려면 기본적으로 일부 텍스트를 묘사 한 GPU에 텍스처를 업로드 할 수있는 SDL_TTF 함수를 사용합니다. 마이그레이션하는 대부분의 응용 프로그램은 텍스트가 무겁지는 않지만 가능한 문제점을 발견했습니다.

사용자 텍스트 입력을 허용하고 화면에 넣는 응용 프로그램을 상상해보십시오. 각 키 입력은 모든 텍스트가 입력 된 새로운 텍스처를 생성합니다 (동일한 기능과 관련된 다른 이전 텍스처는 삭제됩니다). 따라서 "Hello"를 쓰려면 "H", "He", "Hel", "Hell"그리고 마침내 "Hello"다섯 가지 텍스처를 얻을 수 있습니다. 마찬가지로, 모든 "이전"텍스처 (이 경우 "H"에서 "Hell"로)가 삭제되고 "Hello"에 대한 메모리 만 남아 있습니다.

텍스트 무거운 응용 프로그램 (예 : 게임의 점수를 매기는 데이 방법을 사용하면 각 프레임에 대해 새 텍스처를 생성 할 정도로 심하게 수행) 많은 텍스처가 업로드되고 삭제되며 텍스처 색인은 계속 성장할 것입니다.

내 주요 질문은 다음과 같습니다. OpenGL에서 이러한 인덱스를 재활용하겠습니까? 그렇지 않으면 숫자가 고갈되고 충돌이 발생합니까?

추신 : 나는 모든 TTF 캐릭터를 아틀라스에 포장하고 필요한 문자를 얻을 가능성을 알고 있습니다. 나는 현재의 접근 방식이 위험하지 않는 한, 지금은 그 모습을보고 싶지 않다. (이 아틀라스는 오래된 비트 맵 글꼴 같은 느낌이다.)

PS2 : 텍스처를 끊임없이 바꿔도 GPU가 현저하게 성능이 저하되는 것은 아니지만 이러한 응용 프로그램은 구형 시스템에서 그래픽 작업에 능숙하지 않고 우수한 성능을 제공합니다.

+0

걱정되는 경우 텍스처 ID/이름을 다시 만들지 않고 텍스처 데이터를 바꾸는 것이 가장 좋은 이유는 무엇입니까? 나는. 'glTexImage'를 다시 사용하거나 나중에 큰 텍스처를 할당하고 나중에 데이터의 일부를 대체 할 수 있습니다. – keltar

+0

예, 예, 그게 내가 앞으로 할 계획입니다. :). 예를 들어, 게임이나 힌트 상자에서 전술 한 스코어 마커와 같이 변경 될 수있는 모든 텍스트는 리소스의 삭제를 관리하는 클래스에 캡슐화됩니다 (일반적으로 수명이 길며 많은 인덱스가 소비되지 않습니다).나는 현재 텍스쳐를 "대체"하기 위해 그것들을 확장 할 수 있었지만 나는 거짓말을하고있는 일부 레거시 코드에 대해 확신 할 수 없었다. 고마워. –

답변

2

OpenGL 개체는 OpenGL 사양에서 "이름"(프로그래밍에서 자주 사용되는 용어는 "핸들"또는 "ID"/ "식별자")이라고합니다. 새 이름이 처음 바운드되면 (glBind…) 해당 OpenGL 객체 (텍스처, 버퍼 등)가 만들어집니다. 일부 OpenGL 함수는 객체를 만들고 그 객체에 이름을 반환합니다 (glCreate…). (유효한) 이름이 삭제 된 후 (glDelete…) 해당 OpenGL 객체는 마지막 내부 참조가 해제되면 할당 해제됩니다. 이름을 삭제 한 후에 OpenGL로 유효하게 재사용 할 수 있습니다. 그 후 다른 객체를 참조하십시오.


바퀴를 재발 명하지 마십시오. OpenGL을 사용한 텍스트 렌더링은 터무니없이 뒤죽박죽이며 완벽한 방법은 아직 없습니다. 그러나 텍스처 생성 및 자원 관리 문제를 해결하는 여러 라이브러리가 있습니다. 호의를 베풀고 그 중 하나를 사용하십시오. https://github.com/rougier/freetype-gl


1 : 귀하의 경우 FreeType에서-GL이 최선의 선택 (IMHO)을 것 나는 현재 대부분의 알려진 문제를 해결하는 새로운 쉐이더 기반 글리프 래스터 라이저에서 일하고 있어요,하지만 아직 아니에요 .

+0

Datenwolf, 게시물 주셔서 감사하지만 정말 인덱스 재활용에 대한 질문에 대답하지 않습니다. 지금 당장은 새로운 라이브러리를 사용하는 것에 대해별로 관심이 없다. 그래, 고마워, 내가 남쪽으로 갈 때 나는 마음 속에 루지애를 유지할 것이다. :) –

+0

@TheMarlboroMan : 적절히'glDeleteTextures'와 사용되지 않은 텍스처 이름의 바인드를 해제하면 (결국에는 일어날 것입니다.) 텍스처 이름이 재활용 될 것입니다. 텍스처 이름은 간격이 없거나 간격이 필요하지 않습니다. – datenwolf

+0

텍스처 클래스 자체의 소멸자에서 glDeleteTextures를 수행하여 파트가 명확 해 지도록합니다. 솔직히 OpenGL에는 "텍스처 이름"기능이 있다는 것을 알지 못하기 때문에 나는 안전하다고 생각합니다. 이 질문을 풀 수 있도록 귀하의 답변을 재활용 정보로 업데이트 하시겠습니까? –