OpenGL:在 GLSL 中访问数组纹理

OpenGL: Access Array Texture in GLSL

当我 运行 遇到问题时,我正试图在 PyOpenGL 中对立方体进行纹理处理。 PyOpenGL 仅支持 1.10、1.20、1.30、1.00 ES 和 3.00 ES。我至少需要 1.40 版本,因为在 1.40 中引入了 layout,我需要使用 layout 来获取纹理坐标。我正在尝试使用数组纹理对立方体的每一面进行不同的纹理处理。如果需要,这里是我的一些代码片段。

加载数组纹理:

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)

我的顶点着色器:

#version 130
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 color;
out vec2 TexCoord;

void main() {
    gl_Position = vec4(aPos, 1.0);
    color = aColor;
    TexCoord = aTexCoord;
}

我的片段着色器:

#version 130
out vec4 FragColor;

in vec3 color;
in vec2 TexCoord;

uniform sampler2D texture;

void main()
{
    FragColor = texture(texture, TexCoord);
}

如果您需要更多信息,请在评论中提问,我会添加。

PyOpenGL only supports 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES [...]

没有。 PyOpenGL 支持从 1.0 到 3.1 的 OpenGL ES 版本和从 1.1 到 4.4 的所有桌面 OpenGL 版本(参见 About PyOpenGL). You confused (desktop) OpenGL and OpneGL ES. Compare OpenGL specification - Khronos OpenGL registry and OpenGL ES Specification - Khronos OpenGL ES Registry
无论如何,“支持”版本仅指 OpenGL API。 OpenGL context 版本仅取决于显卡。您可以使用当前 OpenGL 上下文支持的任何 GLSL 版本。 PyOpenGL 保证 OpenGL API 实现到版本 4.4,但您也可以使用更高版本。这只是意味着 PyOpenGL 中可能缺少后来添加的 OpenGL 函数 API.
创建 OpenGL window 并使上下文成为当前版本后记录当前版本:

print(glGetString(GL_VENDOR))
print(glGetString(GL_RENDERER))
print(glGetString(GL_VERSION))
print(glGetString(GL_SHADING_LANGUAGE_VERSION))

顶点着色器输入 Layout Qualifier are not supported in OpenGL Shading Language 1.30. You have to switch to OpenGL Shading Language 1.40:

#version 130

#version 140

无论如何你在你的问题中提到过 - “我至少需要 1.40 版,因为在 1.40 中引入了布局 [...]”


glsl 采样器类型必须与纹理目标匹配。 (浮点数)GL_TEXTURE_2D_ARRAY 的正确采样器类型是 sampler2Darray(参见 Sampler types):

uniform sampler2D texture;

uniform sampler2Darray texture;

对于 2 维阵列纹理,需要 3 维纹理坐标(参见 texture):

FragColor = texture(texture, TexCoord);

FragColor = texture(texture, vec3(TexCoord.st, index));

index 是数组中寻址纹理的索引。您可以通过 Uniform 变量甚至纹理坐标属性中的第三个组件提供索引。