2014-12-08 2 views
2

OpenGL에서 밉맵을 사용하고 싶을 때마다 최고 해상도 비트 맵을 밉맵 레벨 0으로 업로드 한 다음 높은 밉맵 레벨에서 낮은 해상도 비트 맵을 업로드해야합니다.opengl : 텍스처에 고해상도 밉맵 추가

저해상도 밉맵뿐만 아니라 고해상도 밉맵을 추가 할 수 있기를 원했을 것입니다. 현재 내가 아는 유일한 하드웨어 방법은 새로운 밉맵 텍스처를 시작하고 이전에 업로드 한 모든 비트 맵을 다시 업로드하는 것입니다.

다른 하드웨어 방법은 없나요?

편집 : 텍스처 생성시 모든 텍스처 밉맵 레벨에 대해 메모리를 할당 할 OpenGL은 사실을 변경하지 마십시오 GL_TEXTURE_BASE_LEVEL 및 GL_TEXTURE_MAX_LEVEL 나타납니다
, 그것은 알고 불가능하기 때문에 따라서이 경우에 사용 할 수없는 텍스처 것이다 더 높은 해상도의 밉맵이 필요하고 그렇지 않은 경우에는 극단적 인 메모리 낭비가 발생할 수 있습니다.

하드웨어에서 이것을 수행하는 유일한 방법은 새로 생성 된 고해상도 밉맵을 밉맵 레벨 0에서 다시 생성 한 다음 이전의 모든 저해상도 밉맵을 낮은 밉맵 레벨로 복사하는 것입니다.

필자가 아는 한, 유일한 방법은 이전에 생성 된 밉맵 레벨을 메모리에 다시 저장하는 것입니다 (이 많은 메모리를 낭비하지 않아도 됨). 모든 밉맵 레벨을 재생성합니다 너무 느리다) gltexsubimage2d를 사용하여 이전 텍스처 밉맵 레벨을 시스템 메모리에 복사 한 다음 새로운 텍스처에 업로드 (느리게 진행됨)하거나 이전 텍스처에서 새로운 텍스처로 바로 복사합니다.

그래서 텍스처의 선택된 밉맵을 "glcopytexture (texture_id_1, texture_mipmap_1, texture_id_2, texture_mipmap_2);"와 같은 다른 텍스처의 밉맵으로 복사하는 방법이 있습니까?

EDIT2 :이 정확히 본 계약의 요건 (https://www.opengl.org/wiki/Texture_Storage#Texture_copy)하지만 하나는 최대 10 세 컴퓨터의 지원입니다하지
그것은 다소 최근의 확장이 보인다 (확장 ~ 2012 년 ~ 2009되었다 코어) .

+1

일반적으로 드라이버가 전체 텍스처를 다시 할당해야 함을 의미합니다 저해상도 밉맵을 만들 때 더 높은 해상도를 고려하지 않았습니다. –

+0

이 시점에서이 이전 설명이 텍스처 메모리를 낭비하지 않는 유일한 하드웨어 대답 일 가능성이 높습니다. 나는 발견 된 정보로 초기 질문에 후속 질문을 추가하고있다. – Marladu

+0

@Marladu : 실제로, 현대 GPU에는 다른 가능성, 특히 [GL_ARB_sparse_texture] (https://www.opengl.org/registry/specs/ARB/sparse_texture.txt)가 있습니다. 물론 이것은 10 살짜리 시스템에 대해 원하는 것이 아닙니다. – derhass

답변

1

텍스처를 사용하려면 전체 밉맵 체인을 업로드 할 필요가 없습니다. GL_TEXTURE_BASE_LEVELGL_TEXTURE_MAX_LEVEL을 설정하여 사용되는 수준 범위를 제어 할 수 있습니다.

처음에 텍스처를 만들 때 기본 레벨의 크기 [1]를 결정해야합니다. 그러나 가장 낮은 수준의 데이터로드를 지연하거나 전혀로드하지 않을 수 있습니다.

예를 들어 전체 해상도에서 최대 1024x1024 크기의 텍스처를 원하지만 레벨 0과 1이 필요하지 않다는 것을 알고 있다면 사용되는 객체가 카메라에서 멀리 떨어져 있기 때문입니다.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 0); 
glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 
glGenerateMipmap(GL_TEXTURE_2D); 

내가 설정 생각하지 않는다 : 나중에 당신이 지금 0 수준으로 텍스처 모든 방법이 필요하다고 결정하는 경우,

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 2); 
glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 
glGenerateMipmap(GL_TEXTURE_2D); 

다음 : 당신과 레벨 2에서 시작하는 텍스처를 만들 수 있습니다 GL_TEXTURE_MIN_LOD이 필요하지만 해를 끼칠 수는 없습니다. 두 코드 시퀀스에서 물론 glGenerateMipmap()을 호출하는 대신 하나의 밉맵을 하나씩 제공 할 수 있습니다.

주주의 사항은 0보다 큰 레벨의 데이터를 지정할 수 있어야한다는 것입니다.따라서 런타임에 자신 만의 밉맵을 생성하거나 밉맵을 포함하는 사전 구운 리소스를 가져야합니다.

또한 구현은 레벨에 데이터를 지정하지 않은 경우에도 레벨 0까지 전체 텍스처를 할당하기로 결정할 수 있습니다. 그래서 당신은 기억을 이런 식으로 저장 할지도 모릅니다. 의지 할 수있는 유일한 것은 초기 텍스처 업로드를 가속화한다는 것입니다.

[1] 주어진 레벨의 상위 레벨에 대해 기본 레벨에 대해 유효한 크기가 여러 개 있기 때문에 이것은 엄격하게 적용되지 않습니다. 예를 들어, 레벨 2가 크기 16이면 레벨 1은 크기 32 또는 33이 될 수 있고 레벨 0은 64, 65, 66 또는 67이 될 수 있습니다.

+0

그건 재미있는 슈퍼, 나는 이것에 대해 몰랐어요, 고마워! 그러나 사용되지 않은 밉맵에 대한 메모리가 여전히 할당 될 가능성은 어느 정도입니까? 문제는 어떤 텍스처에 어떤 밉맵 레벨이 필요한지 사전에 알 수 없으며 향상시키고 싶을 수있는 텍스쳐가 많이 있습니다 (텍스처 밉맵은 즉석에서 생성됩니다). 내가 작업하고있는 응용 프로그램의 예제는 32x32 이하의 텍스처 1000 개, 64x64 이상의 약 100 개이지만, 32x32 이상을 필요로하는 할당 시간을 알지 못하기 때문에 설명 할 내용을 수행해야합니다 모든. – Marladu

+0

읽기 : https://www.khronos.org/opengles/sdk/docs/man3/docbook4/xhtml/glTexParameter.xml GL_TEXTURE_MIN_LOD를 사용할 필요가 없다고 생각하게되었습니다. – Marladu

+0

내 2 대의 가정용 컴퓨터에서 gDEBugger를 사용하면 OpenGL이이 대답에서 제안 된 방법으로 준비된 텍스처의 사용되지 않은 밉맵 레벨에 대한 메모리를 할당하지 않음을 확인할 수 있습니다. http://stackoverflow.com/questions/27352305/ gDEBugger를 사용하지 않고 이것을 찾아내는 방법을 알아보기 위해이 테스트를보다 광범위하게 배포하고 결과를 확인/거부합니다.이 답변의 방법은 다음과 같습니다. 내가 찾고있는 대답. – Marladu

관련 문제