gpt4 book ai didi

c++ - 尝试使用 glDrawArraysInstanced() 时 OpenGL 崩溃

转载 作者:行者123 更新时间:2023-11-28 05:33:26 24 4
gpt4 key购买 nike

加载到 VAO 函数

glGenVertexArrays(1, &VAO);
glGenBuffers(1, &modelVertexVBO);
glGenBuffers(1, &sphereTransformVBO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, modelVertexVBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * (sphereModel->numVertices * 3), &(sphereModel->vertices[0]), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);


glBindBuffer(GL_ARRAY_BUFFER, sphereTransformVBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * (maxSphereStorage * 4 * 4), NULL, GL_STATIC_DRAW);
glVertexAttribPointer(1, 4 * 4, GL_FLOAT, GL_FALSE, 4 * 4 * sizeof(GLfloat), NULL);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribDivisor(sphereTransformVBO, 1);

glBindVertexArray(0);

几何绘图函数:

glBindVertexArray(VAO);
glDrawArraysInstanced(sphereModel->mode, 0, sphereModel->numVertices, sphereCount);

当我尝试运行此代码时,它崩溃并显示以下崩溃说明: Engine.exe 中的 0x0000000068F4EDB4 (nvoglv64.dll) 抛出异常:0xC0000005:访问冲突读取位置 0x0000000000000000。

当我删除第二个 VBO 时,它出于某种原因起作用。

最佳答案

 glVertexAttribPointer(0, 4 * 4, GL_FLOAT, GL_FALSE, 4 * 4 * sizeof(GLfloat), NULL);

您的崩溃是一个简单的复制粘贴错误的结果。您在这里使用属性 0,这意味着您从未为属性 1 调用 glVertexAttribPointer。因此,它使用默认属性状态,从而导致崩溃。

但是,我强烈怀疑您正试图将 4x4 矩阵作为单个属性传递。那行不通; OpenGL 将 give you a GL_INVALID_VALUE error如果您尝试将属性的大小设置为大于 4。

Matrices are treated as arrays of (column) vectors .每个 vector 占用一个单独的属性索引。所以如果你想传递一个矩阵,你将不得不使用 4 个属性索引(从你的着色器提供的那个开始)。而且每个人都必须为其设置除数。

关于c++ - 尝试使用 glDrawArraysInstanced() 时 OpenGL 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38885265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com