我正在开发一个项目,我需要使用纹理数组来应用纹理。我问了很多关于这个的问题,但没有一个得到我完全满意的答案(访问更高版本的 GLSL、OpenGL:在 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 中的对象?
如有必要,我很乐意提供任何其他信息。
所以我问了这个问题:优化均匀传输,并建议使用均匀缓冲区。我做了一些研究并尝试实现它,但在从着色器加载统一块的格式时遇到了问题。在我的项目中,我有一个着色器类,它加载所有制服、顶点属性并将它们存储在着色器中,以便用户可以轻松更改值,而无需再次从着色器查询制服的位置。我正在尝试对统一块执行相同的操作,但我现在不知道如何检索我需要的所有数据。
这是我试图从着色器获取的数据类型:
我的主要问题是最后一个。例如,这是我的统一块:
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)