OpenGL nvoglv32.dll错误

时间:2014-07-02 19:57:47

标签: c++ opengl

我的程序编译得很好但是当我运行它时,它崩溃了glDrawArrays(GL_TRIANGLE_STRIP,0,4)说:

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

还会出现一个页面,表示未加载nvoglv32.pdb。我检查了我传递的指针和值是否正确,断言没有接收任何东西。

这是代码

example.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));
}

1 个答案:

答案 0 :(得分:2)

来自Nvidia开放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被正确绑定。

现在,我可能会错误地阅读您的代码,但是:

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进行一些调用吗?我看到绑定,但没有指向。

如果您未将“顶点属性”赋予着色器,则渲染将崩溃。