gpt4 book ai didi

c++ - OpenGL nvoglv32.dll 错误

转载 作者:行者123 更新时间:2023-11-28 02:45:36 31 4
gpt4 key购买 nike

我的程序编译正常,但当我运行它时,它在 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) 处崩溃,说:

Unhandled exception at 0x50D6C94E (nvoglv32.dll) in Chapter 2.exe: 0xC0000005: Access violation reading location 0x00000000.

还会出现一个页面,说明 nvoglv32.pdb 未加载。我检查我传递的指针和值是否正确,assert 没有得到任何东西。

这是代码

例子.h

#include <windows.h>
#include "Example.h"
#include <iostream>
#include <gl\GLU.h>
#include <gl\glext.h>
#include "BufferUtilities.h"

bool Example::init()
{
if (!start())
{
return false;
}

glEnable(GL_DEPTH_TEST);
glClearColor(0.5f, 0.5f, 0.5f, 0.5f);

GLfloat verticies[] = {
-2.0f, -2.0f, -2.0f,
2.0f, -2.0f, -2.0f,
-2.0f, -2.0f, 2.0f,
2.0f, -2.0f, 2.0f,
};

GLfloat colors[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
};

createArrayBuffer(verticies, &vertexBuffer, GL_STATIC_DRAW);
createArrayBuffer(colors, &colorBuffer, GL_STATIC_DRAW);

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

return true;
}

void Example::render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

bindAndPoint(&colorBuffer, 3);

bindAndPoint(&vertexBuffer, 3);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

BufferUtilities.h

#pragma once

#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <gl\GLEXT.h>
#include <gl\wglext.h>
#include <iostream>
#include <assert.h>

#define BUFFER_OFFSET(i) ((char *)NULL+(i))

static PFNGLGENBUFFERSARBPROC glGenBuffers = NULL;
static PFNGLBINDBUFFERPROC glBindBuffer = NULL;
static PFNGLBUFFERDATAPROC glBufferData = NULL;

inline bool start()
{
glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");

if (!glGenBuffers|| !glBindBuffer || !glBufferData)
{
std::cerr << "Vertex buffer objects are not supported by your graphics card." << std::endl;
return false;
}

return true;
}

inline void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
assert(array != NULL);
assert(buffer != NULL);
assert(usage != NULL);

glGenBuffers(1, buffer);
glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * (sizeof(array) / sizeof(array[0])), &array[0], usage);
}

inline void bindAndPoint(GLuint *buffer, int size)
{
assert(buffer != NULL);
assert(size != NULL);

glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glColorPointer(size, GL_FLOAT, 0, BUFFER_OFFSET(0));
}

最佳答案

来自 Nvidia Open GL 论坛的版主: https://devtalk.nvidia.com/default/topic/720651/access-violation-in-nvoglv32-dll-how-do-i-track-down-the-problem-/

“glDrawArrays 或 glDrawElements 期间的访问冲突通常是由于不正确启用的顶点属性数组造成的。请非常仔细地检查启用的顶点属性的当前状态。如果在绘制调用期间获取超出范围的数据时,不经意地启用而未提供任何或足够的数据,将导致此类错误。

如果不是这样,可能内存消耗有问题。您正在根据 DLL 名称运行 32 位应用程序。同样的事情会发生在 64 位版本中吗?”

发生这种情况的主要原因是您没有正确设置绘图调用。

第二种可能性是在这个 S/O 帖子中找到的场景:Crash at draw call in nvoglv32.dll on new video card

在这个例子中,用户没有正确初始化 Open GL,这是导致问题的原因。

这是困扰您的两个主要问题。从我读到的你的源代码来看,你似乎没有给 Draw Arrays 任何错误的论点,但我会调查以确保你的 VBO 被正确绑定(bind)。

现在,我可能读错了你的代码,但在:

inline void bindAndPoint(GLuint *buffer, int size)
{
assert(buffer != NULL);
assert(size != NULL);

glBindBuffer(GL_ARRAY_BUFFER, *buffer);
glColorPointer(size, GL_FLOAT, 0, BUFFER_OFFSET(0));
}

不应该调用 glVertexAttribPointer 吗?我看到有约束力,但没有指向。

如果您不将顶点属性交给着色器,渲染就会崩溃。

关于c++ - OpenGL nvoglv32.dll 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539951/

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