gpt4 book ai didi

c++ - nvolgv32.dll - glDrawElements 问题

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

目前我正在使用 OpenGL 编写图形应用程序,并使用 glDrawElements 绘制 obj 文件。我有一个 Nvidia GeForce GT 740m

问题是这样的:demo.exe 中 0x68FCF460 (nvoglv32.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。 我不知道如何解决这个问题。

这些是我的缓冲区初始化

    // <-- VBOs IBO VAO creation --> //

glGenBuffers(3, obj_vbo);
glGenBuffers(1, &obj_ibo);
glGenVertexArrays(1, &obj_vao);

// <-- IBO --> //

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, obj_triangles.size() * sizeof(GLushort), obj_triangles.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);

// <-- VAO --> //

glBindVertexArray(obj_vao);

glEnableVertexAttribArray(VERTEX_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[VERTEX_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_vertices.size() * sizeof(GLfloat), obj_vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(VERTEX_LAYOUT, 3, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
glBindBuffer(GL_ARRAY_BUFFER, NULL);
glDisableVertexAttribArray(VERTEX_LAYOUT);

glEnableVertexAttribArray(NORMAL_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[NORMAL_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_normals.size() * sizeof(GLfloat), obj_normals.data(), GL_STATIC_DRAW);
glVertexAttribPointer(NORMAL_LAYOUT, 3, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
glBindBuffer(GL_ARRAY_BUFFER, NULL);
glDisableVertexAttribArray(NORMAL_LAYOUT);

glEnableVertexAttribArray(TEXTURE_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[TEXTURE_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_textures.size() * sizeof(GLfloat), obj_textures.data(), GL_STATIC_DRAW);
glVertexAttribPointer(TEXTURE_LAYOUT, 2, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
glBindBuffer(GL_ARRAY_BUFFER, NULL);
glDisableVertexAttribArray(TEXTURE_LAYOUT);

glBindVertexArray(NULL);

// <-- Save and calculate stuffs . . . --> //

obj_triangles_size = (GLuint) obj_triangles.size();

这是绘制方法,其中 VERTEX_LAYOUT = 0,NORMAL_LAYOUT = 1,TEXTURE_LAYOUT = 2

    glBindVertexArray(obj_vao);

glEnableVertexAttribArray(VERTEX_LAYOUT);
glEnableVertexAttribArray(NORMAL_LAYOUT);
glEnableVertexAttribArray(TEXTURE_LAYOUT);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo);
glDrawElements(GL_TRIANGLES, obj_triangles_size, GL_UNSIGNED_SHORT, NULL);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);

glDisableVertexAttribArray(TEXTURE_LAYOUT);
glDisableVertexAttribArray(NORMAL_LAYOUT);
glDisableVertexAttribArray(VERTEX_LAYOUT);

glBindVertexArray(NULL);

如果我在我的 nvidia 面板/管理 3D 设置应用程序上使用选项 (AUTO-SELECT),渲染效果很好,但是当我将该选项切换到高性能 NVIDIA 处理器时它给出了这个问题。

最佳答案

免责声明:

这不是答案,但不可能在评论中对此进行解释。


下面是 VAO 的用途,它们实际上会跟踪您每次绘制时冗余更改的大部分状态。

初始化:

// <-- VBOs IBO VAO creation --> //

glGenBuffers(3, obj_vbo);
glGenBuffers(1, &obj_ibo);
glGenVertexArrays(1, &obj_vao);

// <-- VAO --> //

glBindVertexArray(obj_vao);

// <-- IBO (moved) --> //

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, obj_triangles.size() * sizeof(GLushort), obj_triangles.data(), GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); -- REMOVE

glEnableVertexAttribArray(VERTEX_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[VERTEX_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_vertices.size() * sizeof(GLfloat), obj_vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(VERTEX_LAYOUT, 3, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
//glBindBuffer(GL_ARRAY_BUFFER, NULL); -- REMOVE
//glDisableVertexAttribArray(VERTEX_LAYOUT); -- REMOVE

glEnableVertexAttribArray(NORMAL_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[NORMAL_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_normals.size() * sizeof(GLfloat), obj_normals.data(), GL_STATIC_DRAW);
glVertexAttribPointer(NORMAL_LAYOUT, 3, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
//glBindBuffer(GL_ARRAY_BUFFER, NULL); -- REMOVE
///glDisableVertexAttribArray(NORMAL_LAYOUT); -- REMOVE

glEnableVertexAttribArray(TEXTURE_LAYOUT);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo[TEXTURE_LAYOUT]);
glBufferData(GL_ARRAY_BUFFER, obj_textures.size() * sizeof(GLfloat), obj_textures.data(), GL_STATIC_DRAW);
glVertexAttribPointer(TEXTURE_LAYOUT, 2, GL_FLOAT, GL_FALSE, GL_FALSE, (GLubyte *) NULL);
//glBindBuffer(GL_ARRAY_BUFFER, NULL); -- REMOVE
//glDisableVertexAttribArray(TEXTURE_LAYOUT); -- REMOVE

glBindVertexArray(NULL);

// <-- Save and calculate stuffs . . . --> //

obj_triangles_size = (GLuint) obj_triangles.size();

绘图:

glBindVertexArray(obj_vao);

//glEnableVertexAttribArray(VERTEX_LAYOUT); -- REMOVE
//glEnableVertexAttribArray(NORMAL_LAYOUT); -- REMOVE
//glEnableVertexAttribArray(TEXTURE_LAYOUT); -- REMOVE

//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo); -- REMOVE
glDrawElements(GL_TRIANGLES, obj_triangles_size, GL_UNSIGNED_SHORT, NULL);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); -- REMOVE

//glDisableVertexAttribArray(TEXTURE_LAYOUT); -- REMOVE
//glDisableVertexAttribArray(NORMAL_LAYOUT); -- REMOVE
//glDisableVertexAttribArray(VERTEX_LAYOUT); -- REMOVE

glBindVertexArray(NULL);

关于c++ - nvolgv32.dll - glDrawElements 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24131085/

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