我正在做一个项目,我需要使用纹理阵列来应用纹理。关于这一点,我问了很多问题,没有一个我得到的答案是我完全满意的(Get access to later versions of GLSL、OpenGL: Access Array Texture in GLSL和OpenGL: How would I implement texture arrays?),所以我问了一个更广泛的问题,希望能得到回答。无论如何,我将如何在OpenGL(更具体地说是PyOpenGL,但如果你用C++来回答它就行了)中对对象进行纹理处理。我已经有一种方法来加载纹理数组,但没有一种方法来应用它。这是预期的结果:
来自opengl-tutorial的图像
这是我目前所拥有的加载数组纹理的方法:
def load_texture_array(path,width,height):
teximg = pygame.image.load(path)
texels = teximg.get_buffer().raw
texture = GLuint(0)
layerCount = 6
mipLevelCount = 1
glGenTextures(1, texture)
glBindTexture(GL_TEXTURE_2D_ARRAY, texture)
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount)
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
TLDR:如何使用纹理数组将纹理应用到OpenGL中的对象?
如有必要,我很乐意提供任何其他信息。
1条答案
按热度按时间ivqmmu1c1#
如果要将2D Array Texture用于立方体,则6边的6个纹理中的每个纹理的大小必须相同。您可以通过三维纹理坐标来查找纹理。纹理坐标的第三个分量是2D纹理阵列中的2D纹理的索引。
因此,6个边的纹理坐标为
获取顶点着色器中的3维纹理坐标属性,并将其传递给片段着色器:
使用3维纹理坐标在片段着色器中查找
sampler2DArray
:创建
GL_TEXTURE_2D_ARRAY
并使用glTexSubImage3D
将6个二维图像加载到2D Array Texture的6个平面。下面的image_planes
是包含6个二维图像平面的列表:另请参见PyGame和OpenGL 4。
最小示例: