2013-04-26 3 views
1

최대 8192 개의 레이어가있는 texture_2d_array를 사용하려고합니다. 그러나 2048 번째 이후의 모든 레이어에는 가비지 데이터가 포함됩니다 (텍스처를 시각화하기 위해 개별 레이어를 쿼드에 매핑하여 테스트 됨). 내 그래픽 카드2048을 넘는 텍스처 레이어에 왜 가비지 데이터가 있습니까?

glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxTexLayers); 

반환 8192 (5770 AMD)는 AMD의 7850er에 대해 동일한와 레이어의 최대 수를 쿼리. 사용 가능한 유일한 그래픽 카드는 2048 개의 레이어를 지원하는 NVidia 480입니다.

    : 나는 밖으로 아이디어입니다

    (이 프로그램의 컷 다운 버전을 찾을 수 있습니다 여기에 https://mega.co.nz/#!FJ0gzIoJ!Kk0q_1xv9c7sCTi68mbKon1gDBUM1dgjrxoBJKTlj6U)

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glGenTextures(1, &tex); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D_ARRAY, tex); 
    
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 7); 
    
    glTexStorage3D(GL_TEXTURE_2D_ARRAY, 8, GL_RGB8, 128, 128, 8192); 
    //glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 128, 128, 8192, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); 
    
    std::vector<char> image = readImage(testImagePath); 
    
    for (unsigned int i = 0; i < 8192; ++i) 
    { 
        glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 128, 128, 1, GL_RGB, GL_UNSIGNED_BYTE, image.data()); 
    } 
    
    GLuint tLoc = glGetUniformLocation (program, "texArray"); 
    glProgramUniform1i (program, tLoc, 0); 
    

    :

    나는 질감을 만들려면 다음 코드를 사용

  1. glTexStorage3D를 glTexImage3D로 변경 - 변경하지 않음
  2. 기본/최대 레벨로 재생 - 변경하지 않음
  3. Min_Filter는 GL_LINEAR 없습니다 - 밉맵 (glGenerateMipmaps)를 생성 변화
  4. - 가령하는 층의 크기를 감소 변경 없음
  5. 을 4x4 - 변경 없음. 4096 - 변화없이
  6. 수 있도록 디버그 컨텍스트 - - AMD의 7850로 전환하지 변화없이
  7. 오류
  8. 등을

그래서 다른 물건을 많이, 그것은을 가진 드라이버 버그가 될 수 드라이버가 GL_MAX_ARRAY_TEXTURE_LAYERS의 잘못된 번호를보고했지만 어쩌면 내가 놓친 뭔가 하나를 생각할 수 있습니다.

EDIT : 그런 질감은 꽤 많은 메모리를 사용한다는 것을 알고 있습니다. 그래도 그래픽 카드에 많은 양의 OpenGL을 사용할 수 있다고하더라도 OpenGL에서 할당 할 수 있다고 보장하지는 않지만 디버그 컨텍스트에 오류가 없습니다. 특히 더 OUT_OF_MEMORY을 사용할 수없고, 또한 이는 단지 5백12킬로바이트

+0

나는이 질문이 귀하의 것으로 가정합니다 : http://devgurus.amd.com/thread/160796? 그렇지 않다면 같은 벽돌 벽에 머리를 부딪히는 다른 사람이 있습니다 ... –

+0

귀하의 가정은 맞습니다;) –

+0

AMD 드라이버 개발자에게이 사실을 알려 주셨으면합니다. –

답변

4

2 일 것이다, 레이어 당 4 × 4의 크기와 그것을 시도 :

1)겠습니까 128 * 128의 데이터 500MBs 이상이어야하는 것은 아닙니다 8192 텍스처? (또는 RGBA 대신 RGB가 400MB 인 경우) 조각화 나 기타 문제로 인해 많은 양의 메모리가 할당되어 있어도 OpenGL에서 할당 할 수없는 수 있습니다.

2) OpenGL에서 최대 값이 8192 (또는 그 이상)라고 말한 것만으로도 모든 경우에 그만큼 많이 사용할 수 있음을 의미하지는 않습니다. 예를 들어, 내 드라이버는 카드가 한면에 8192의 최대 텍스처 크기를 처리 할 수 ​​있다고 주장합니다. 그러나 32 비트 부동 소수점 RGBA 인 4096x4096 이미지를 만들려고하면 268MB 뿐이고 VRAM 기가 있습니다.

glGetError()은 오류를 반환합니까?

+0

답장을 보내 주셔서 감사 드리며 초기 게시물을 약간 연장했습니다.예,이 크기의 RGB8 텍스처는 384MB이지만 텍스처 압축 (DXT1)을 사용하여 크기를 약 64MB로 줄이거 나 더 작은 레이어 (예 : 4x4 (512kb). 나는 1x1x8192xR8의 극단적 인 경우를 아직 시도하지 않았지만 그런 질감은 아주 쓸모가 없다. –

+0

또한 디버그 컨텍스트에 glGetError() 사용했지만 오류가 발생했습니다. –