You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mat4实例数组时glDrawElementsInstanced仅显示1/4实例的问题

问题原因及修复方案

你遇到的核心问题是矩阵类型的实例属性没有正确绑定顶点属性:GLSL中的mat4由4个vec4组成,会占用4个连续的顶点属性位置。如果你的绑定步骤只处理了其中一个,那么每个实例会消耗4个属性"槽位",导致调用glDrawElementsInstanced(..., 100)时,实际只有25个实例能获取到完整的矩阵数据(100/4=25);传入400时刚好凑够100个完整矩阵的槽位,所以能显示100个矩形。

正确的实例化矩阵绑定步骤

假设你的变换矩阵数组是glm::mat4 modelMatrices[100]且已填充好每个实例的变换数据,按以下步骤绑定:

  1. 绑定并填充实例VBO
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glBufferData(GL_ARRAY_BUFFER, 100 * sizeof(glm::mat4), modelMatrices, GL_STATIC_DRAW);
  1. 为mat4的4行分别设置顶点属性
    mat4的每一行对应一个vec4属性,需要绑定4个连续的顶点属性位置(比如从索引3开始,假设前面已有位置、颜色等属性),并为每个属性设置实例化步长(glVertexAttribDivisor):
// 矩阵第1行,属性索引3
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)0);
glVertexAttribDivisor(3, 1);

// 矩阵第2行,属性索引4
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(sizeof(glm::vec4)));
glVertexAttribDivisor(4, 1);

// 矩阵第3行,属性索引5
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(2 * sizeof(glm::vec4)));
glVertexAttribDivisor(5, 1);

// 矩阵第4行,属性索引6
glEnableVertexAttribArray(6);
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(3 * sizeof(glm::vec4)));
glVertexAttribDivisor(6, 1);

顶点着色器对应处理

如果在着色器中直接声明mat4类型的实例属性,GLSL会自动占用4个连续的属性位置,无需手动拆分:

#version 330 core
layout (location = 0) in vec2 aPos;
// 直接声明mat4,自动占用location 3-6
layout (location = 3) in mat4 model;

uniform mat4 view;
uniform mat4 projection;

void main() {
    gl_Position = projection * view * model * vec4(aPos, 0.0, 1.0);
}

关键检查点

  • 确保所有4个对应mat4的顶点属性都已启用(glEnableVertexAttribArray),且都设置了glVertexAttribDivisor(attrIndex, 1)(表示该属性按实例更新,而非按顶点)。
  • 顶点属性的stride参数必须设为sizeof(glm::mat4),保证每次实例读取完整的矩阵数据。
  • 最终调用glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, 100)即可渲染100个矩形。

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:15:27