2012-09-11 3 views
4

따라서 docs 다음을 시도했지만 질감 2D 배열이 작동하지 않는 것 같습니다.OpenGL 3.2에서 GL_TEXTURE_2D_ARRAY 사용하는 방법

-(GLint)buildTextureArray:(NSArray *)arrayOfImages 
{ 
    GLImage *sample = [GLImage imageWithImageName:[arrayOfImages objectAtIndex:0] shouldFlip:NO]; //Creates a sample to examine texture width and height 
    int width = sample.width, height = sample.height; 
    GLsizei count = (GLsizei)arrayOfImages.count; 

    GLuint texture3D; 
    glGenTextures(1, &texture3D); 
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture3D); 

    glPixelStorei(GL_UNPACK_ROW_LENGTH, width); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    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_WRAP_S,GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_T,GL_REPEAT); 
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, width, height, count, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); 

    int i = 0; 
    for (NSString *name in arrayOfImages) //Loops through everything in arrayOfImages 
    { 
     GLImage *image = [GLImage imageWithImageName:name shouldFlip:NO]; //My own class that loads an image 
     glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, image.width, image.height, 1, GL_RGBA, GL_UNSIGNED_BYTE, image.data); 
     i++; 
    } 
    return texture3D; 
} 

//Setting Uniform elsewhere 
glBindTexture(GL_TEXTURE_2D_ARRAY, textureArray); 
glUniform1i(textures, 0);  


//Fragment Shader 
#version 150 

in vec3 texCoords; 

uniform sampler2DArray textures; 

out vec3 color; 

void main() 
{ 
    color = texture(textures, texCoords.stp, 0).rgb; 
} 

나는 같은 질감의 매개 변수와 함께 개별 텍스처를로드 할 수 있어요,하지만 난 그게 텍스처 2 차원 배열에서 작동하지 않습니다. 내가 얻는 모든 것은 검은 색 질감입니다. 왜 이런 일이 일어나는 걸까요? 사실

+0

밉맵 문제 일 수 있습니다. 1 텍셀이 대략 1 픽셀을 차지하도록 확대하면 텍스처가 보입니까? 또한, 당신의 p 텍스 코드는 0과 arrayOfImages.size-1 사이에 있어야합니다, 유효합니까? – Calvin1602

+0

@ Calvin1602 아니요, 전체 화면이 완전히 검은 색입니다. 예, 현재 테스트 목적으로 내 P 텍스 코드가 모두 0으로 설정되어 있습니다. – TheAmateurProgrammer

+2

'GL_LINEAR_MIPMAP_LINEAR'을 사용한다면 밉맵을 업로드해야합니다. – genpfault

답변

2
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 

귀하의 질감 하지이 밉맵을 가지고있다. 그러니 OpenGL에게 말하지 마라. 또한

, 항상은 질감의 mipmap range parameters (GL_TEXTURE_BASE_LAYER and GL_TEXTURE_MAX_LAYER)을 설정합니다. 또는 더 나은 방법은 texture storage to allocate your texture's storage을 사용하면됩니다.

+0

변경 했는데도 여전히 검은 색 화면이 나타납니다. glPixelStore가 GL_TEXTURE_2D_ARRAY를 지원하지 않기 때문에 가능성이 있습니까? – TheAmateurProgrammer

+1

또한 내 질문에 명시된 바와 같이 OpenGL 3.2에서 작업 중이므로 텍스처 저장이 지원되지 않습니다. – TheAmateurProgrammer

+0

@theAmateurProgrammer 응? 'glPixelStore'는'GL_TEXTURE_2D_ARRAY'에 대해 아무것도 모르기 때문에 * "support"*라는 개념조차 없습니다. 물론 이미 완료 한 GPU에 픽셀 데이터를 업로드하기 위해 제대로 설정해야합니다 (RGBA 데이터를 사용했기 때문에 4의 정렬도 가능했을지라도). 잠깐, 이미지 데이터에는 각 픽셀에 대해 4 개의 부호없는 바이트가 포함되어 있습니다. 맞습니까? –

0

에 대한 2d_array 텍스처 'texcoords의'구성 요소는 0 높이에서 0 깊이 ('레이어'를 나타냄)에서 'w'까지 다양합니다. 이 texcordinates를 변경해보십시오.

관련 문제