【问题标题】:OpenGL: Access Array Texture in GLSLOpenGL:在 GLSL 中访问数组纹理
【发布时间】:2021-01-05 15:40:09
【问题描述】:

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

加载数组纹理:

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);
}

如果您需要更多信息,请在 cmets 中询问,我会添加。

【问题讨论】:

    标签: python opengl glsl textures pyopengl


    【解决方案1】:

    PyOpenGL 仅支持 1.10、1.20、1.30、1.00 ES 和 3.00 ES [...]

    没有。 PyOpenGL 支持从 1.0 到 3.1 的 OpenGL ES 版本以及从 1.1 到 4.4 的所有桌面 OpenGL 版本(请参阅About PyOpenGL)。您混淆了(桌面)OpenGL 和 OpneGL ES。比较 OpenGL specification - Khronos OpenGL registryOpenGL ES Specification - Khronos OpenGL ES Registry
    无论如何,“支持”版本仅指 OpenGL API。 OpenGL context 版本仅取决于显卡。您可以使用当前 OpenGL 上下文支持的任何 GLSL 版本。 PyOpenGL 保证,OpenGL API 的实现最高版本为 4.4,但您也可以使用更高版本。这只是意味着以后添加的 OpenGL 函数可能会从 PyOpenGL API 中丢失。
    在创建 OpenGL 窗口并使上下文成为当前版本后记录当前版本:

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

    OpenGL Shading Language 1.30 不支持顶点着色器输入 Layout Qualifier。你必须切换到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 变量甚至纹理坐标属性中的第三个组件来提供索引。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-20
    • 2013-10-05
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多