gpt4 book ai didi

c++ - 使用 glCreateBuffers 时出现访问冲突错误

转载 作者:行者123 更新时间:2023-11-27 23:50:44 25 4
gpt4 key购买 nike

我正在尝试运行 OpenGL Red book examples .我能够在 MS VS 2017 中编译项目。但是,当我执行一些示例时,它会抛出以下异常。

Exception thrown at 0x00000000 in Project_1_1.exe: 0xC0000005: Access violation executing location 0x00000000. occurred

行发生这种情况:

glCreateBuffers( NumBuffers, Buffers );

通过阅读论坛,我了解到如果 GPU 支持 OpenGL 4.5,glCreateBuffers 就可以工作。我尝试使用 glGenBuffers 并且确实有效。

我运行了 glewinfo,它告诉我缺少 GL_VERSION_4_5 和 GL_ARB_direct_state_access。所以看来我的 GPU 不支持 OpenGL 4.5。

但是,我有带更新驱动程序的 Nvidia GTX 1050,根据文档,它应该支持 OpenGL 4.5。 Steam 中的系统信息显示 4.5 OpenGL 支持。当我在 Linux 中编译时,这些代码工作正常。我需要使用 OpenGL 4.5。

相关详情:

  1. Windows 10
  2. 配备 i7 7700 HQ 的戴尔 XPS 15
  3. 英伟达 GTX 1050
  4. Visual Studio 2017

我是第一次在 Windows 上编译代码,所以我可能遗漏了一些明显的东西。这些代码适用于 Ubuntu 16.04。

编辑(添加代码)代码的相关部分来自 this repository :

//////////////////////////////////////////////////////////////////////////////
//
// Triangles.cpp
//
//////////////////////////////////////////////////////////////////////////////

#include "vgl.h"
#include "LoadShaders.h"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];

const GLuint NumVertices = 6;

//----------------------------------------------------------------------------
//
// init
//

void
init( void )
{
glGenVertexArrays( NumVAOs, VAOs );
glBindVertexArray( VAOs[Triangles] );

GLfloat vertices[NumVertices][2] = {
{ -0.90f, -0.90f }, { 0.85f, -0.90f }, { -0.90f, 0.85f }, // Triangle 1
{ 0.90f, -0.85f }, { 0.90f, 0.90f }, { -0.85f, 0.90f } // Triangle 2
};

glCreateBuffers( NumBuffers, Buffers );
glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);

ShaderInfo shaders[] =
{
{ GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
{ GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
{ GL_NONE, NULL }
};

GLuint program = LoadShaders( shaders );
glUseProgram( program );

glVertexAttribPointer( vPosition, 2, GL_FLOAT,
GL_FALSE, 0, BUFFER_OFFSET(0) );
glEnableVertexAttribArray( vPosition );
}


//----------------------------------------------------------------------------
//
// display
//

void
display( void )
{
static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };

glClearBufferfv(GL_COLOR, 0, black);

glBindVertexArray( VAOs[Triangles] );
glDrawArrays( GL_TRIANGLES, 0, NumVertices );
}

//----------------------------------------------------------------------------
//
// main
//

#ifdef _WIN32
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
#else
int
main( int argc, char** argv )
#endif
{
glfwInit();

GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);

glfwMakeContextCurrent(window);

int api, major, minor, revision, profile;

api = glfwGetWindowAttrib(window, GLFW_CLIENT_API);
major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);
minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);
revision = glfwGetWindowAttrib(window, GLFW_CONTEXT_REVISION);
profile = glfwGetWindowAttrib(window, GLFW_OPENGL_PROFILE);

gl3wInit();

init();

while (!glfwWindowShouldClose(window))
{
display();
glfwSwapBuffers(window);
glfwPollEvents();
}

glfwDestroyWindow(window);

glfwTerminate();
}

最佳答案

如果您确定您的显卡支持 OpenGL 4.5,则应检查几项:

  • 确保您的应用程序实际请求 OpenGL 4.5 上下文(例如,为此设置正确的 glfwWindowHint)
  • 确保应用程序使用正确的卡。对于同时配备专用 GPU(AMD 或 NVidia)和英特尔集成 GPU 的笔记本电脑来说,这尤其是一个问题。此设置应位于 Nvidia 控制面板或 AMD 等效面板中的某处。

关于c++ - 使用 glCreateBuffers 时出现访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46633617/

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