小编Use*_*-92的帖子

OpenGL 中的纹理数组

我正在开发一个项目,我需要使用纹理数组来应用纹理。我问了很多关于这个的问题,但没有一个得到我完全满意的答案(访问更高版本的 GLSLOpenGL:在 GLSL 中访问数组纹理OpenGL:如何实现纹理数组?)所以我我正在问一个更广泛的问题,希望得到答复。无论如何,我将如何在 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)
Run Code Online (Sandbox Code Playgroud)

TLDR:如何使用纹理数组将纹理应用于 OpenGL 中的对象?

如有必要,我很乐意提供任何其他信息。

python opengl textures pygame pyopengl

5
推荐指数
1
解决办法
6066
查看次数

获取制服块中制服的名称

所以我问了这个问题:优化均匀传输,并建议使用均匀缓冲区。我做了一些研究并尝试实现它,但在从着色器加载统一块的格式时遇到了问题。在我的项目中,我有一个着色器类,它加载所有制服、顶点属性并将它们存储在着色器中,以便用户可以轻松更改值,而无需再次从着色器查询制服的位置。我正在尝试对统一块执行相同的操作,但我现在不知道如何检索我需要的所有数据。

这是我试图从着色器获取的数据类型:

  1. 统一区块名称
  2. 统一块大小
  3. 统一块索引
  4. 制服区所有制服的名称

我的主要问题是最后一个。例如,这是我的统一块:

uniform MatBlock{
    vec4 MatColor;
    int MatRoughness;
} material;
Run Code Online (Sandbox Code Playgroud)

我希望能够获得制服名称的映射,因此{"MatColor":0, "MatRoughness":16},第二个值是制服的偏移量。这样可以轻松获取和设置偏移量。我的目标是能够做类似的事情uniformbuffer->PushData(0.3f, sizeof(float), "MaterialBlock", "MatRoughness");,所以这会将 UBO 中的 MatRoughness 设置为 0.3。我已经有了获取列表中前 3 项的代码(代码位于下面),但我不知道如何获取名称。

glGetProgramiv(shader, GL_ACTIVE_UNIFORM_BLOCKS, &numblocks);        
for(unsigned int i = 0; i < numblocks; i++){
    // Get the name of the uniform block
    int namelen;
    glGetActiveUniformBlockiv(shader, i, GL_UNIFORM_BLOCK_NAME_LENGTH, &namelen); 
    char blockname[namelen];
    glGetActiveUniformBlockName(shader, i, namelen, NULL, blockname);
                 
    // Add Block Binding
    unsigned int index = glGetUniformBlockIndex(shader, blockname);
    glUniformBlockBinding(shader, index, i);

    // …
Run Code Online (Sandbox Code Playgroud)

c++ opengl buffer glsl

1
推荐指数
1
解决办法
480
查看次数

标签 统计

opengl ×2

buffer ×1

c++ ×1

glsl ×1

pygame ×1

pyopengl ×1

python ×1

textures ×1