2017-05-27 40 views
0

我加载3个纹理到数组如何从纹理数组中选择纹理图层以在OpenGL中进行渲染?

int width = 1024; 
int height = 1024; 
GLuint ID; 
glGenTextures(1, &ID); 
glBindTexture(GL_TEXTURE_2D_ARRAY, ID); 
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, width, height, 3) 
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, data[0]); 
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, data[1]); 
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 2, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, data[2]); 
glBindTexture(GL_TEXTURE_2D_ARRAY, 0); 

如果我使用即时模式,我怎么能告诉我想使用glTexCoord2f(...)从纹理绘制该层后glBindTexture(GL_TEXTURE_2D_ARRAY,ID) ?我必须使用一些特定的方法吗?

回答

2

立即模式不是问题,固定功能管道是 - 纹理数组只能使用着色器进行采样。如果你使用着色器,你可以使用某种方式将所需的图层索引传递给着色器(作为属性 - 通用或内置,统一,使用其他缓冲区对象,从其他东西中调整它,无论如何...)。

如果使用固定功能管道,根本没有办法。您只能切换到三维纹理来模拟阵列纹理,但会受到更严格的尺寸限制,并且在使用滤镜进行采样时会花费更多的开销。

但是,2017年真的没有什么好的理由使用即时模式和/或固定功能管道。这些东西在十年前就被弃用了。

+0

我将在稍后将其更改为VBO,是否有可能使其不带着色器?我从来没有用过它们。 – ground0

+1

@ ground0:“只能使用着色器对纹理数组进行采样”的哪一部分让您觉得可以避免使用着色器? –