2012-09-11 53 views
4

所以我試着跟着docs,但我似乎無法得到紋理二維數組的工作。如何在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; 
} 

我能夠加載單個紋理與質地相同的參數,但我不能讓它與質感二維數組工作。我得到的只是一個黑色的紋理。這是爲什麼發生?

+0

可能是一個mipmaps問題..如果您縮放以使1個紋理大約需要1個像素,您會看到紋理嗎?另外,你的p tex座標應該在0到arrayOfImages.size-1之間,是否有效? – Calvin1602

+0

@ Calvin1602不,我的整個屏幕完全是黑色的,是的,爲了當前的測試目的,我的p tex座標全部設置爲0。 – TheAmateurProgrammer

+2

如果你打算使用'GL_LINEAR_MIPMAP_LINEAR'確保你上傳了一些mipmap。 – 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

for 2d_array texcoords紋理的'v'分量從0-高度變化,'w'從0-深度變化(因爲它表示層)。嘗試改變這些texcordinates。