gpt4 book ai didi

c++ - glGetString(GL_VERSION) 返回 1.1.0,即使卡支持 2.1

转载 作者:太空狗 更新时间:2023-10-29 21:22:30 25 4
gpt4 key购买 nike

我在使用 SDL2 和 OpenGL 时遇到了一个小问题。我一直在尝试让 VBO 正常工作(特别是 ARB 对象),但一直没有成功。通过各种搜索,我发现板载 GL.h 是多么古老,并选择了 glew.h - 从而允许我使用 1.1 以后的函数。

在尝试使用 glGenBuffersARB 时,我发现即使在调用 glewInit 之后,函数指针还是空的。

但是,visualinfo 报告 OpenGL 是 2.1.0,并且可以访问 GL_ARB_vertex_buffer_object - SDL 上下文似乎默认为 Microsoft 的 1.1.0,并且不允许我纠正空指针。

我(遗憾地)在 Acer Aspire 5733 上使用 Intel HD Graphics 芯片组。

如何让 SDL 识别芯片组上的 2.1.0? (或者我的处理方法完全错误?)

编辑

这是请求的代码:

astralmain.cpp(初始化 SDL + OpenGL 上下文)

bool AstralGame::onInit()
{
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

if ((currWindow = SDL_CreateWindow(ASTRAL_TITLE" "ASTRAL_VERSION, 100, 100, 800, 600, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL)) == nullptr)
{
a_ErrorManager::panic("Window couldn't be created\n");
return false;
}
if ((currContext = SDL_GL_CreateContext(currWindow)) == NULL)
{
a_ErrorManager::panic("OpenGl context couldn't be created\n");
}
printf((char*)glGetString(GL_VERSION));
glewExperimental = TRUE;
glewInit();
SDL_GL_SetSwapInterval(1);
textureManager->startUp();
errorManager->startUp();
renderManager->startUp();
if (glGenBuffersARB == nullptr) printf("This entire program will not work!");
cube = new a_GL_Cube(textureManager->getTexture("astral")->texture);
//Start initting GL functions
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_TEXTURE_2D);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
cube->buildVert(1.0f);
return true;

}

a_GL3DPrimitives.cpp(为立方体构建顶点,出现错误)

void a_GL_Cube::buildVert(float size)
{
float pVt[72] = { -size, -size, size, -size, size, size, size, size, size, size, -size, size,
size, -size, size, size, -size, -size, size, size, -size, size, size, size,
size, size, size, -size, size, size, -size, size, -size, size, size, -size,
size, size, -size, size, -size, -size, -size, -size, -size, -size, size, -size,
-size, size, size, -size, size, -size, -size, -size, -size, -size, -size, size,
-size, -size, size, -size, -size, -size, size, -size, -size, size, -size, size };
float pTt[48] = { 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 };

vboVName = 0;
vboTName = 0;

unsigned int* test = &vboVName;
glGenBuffersARB(1, &vboVName); <======= Null Pointer
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVName);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)* 72, pVt, GL_STATIC_DRAW_ARB);

glGenBuffersARB(1, &vboTName);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTName);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)* 48, pTt, GL_STATIC_DRAW_ARB);

delete[] pVt;
delete[] pTt;
}

最佳答案

我认为你误解了 glGetString(GL_VERSION) 的目的

首先,您当然需要创建一个 OpenGL 上下文,然后才能调用 glGetString()。创建 OpenGL 上下文时,您指定要使用的 OpenGL 版本。

然后当您调用 glGetString(GL_VERSION) 时,它将返回当前使用的 OpenGL 上下文的 OpenGL 版本。

额外

我可以看到你标记了你的问题 您可以使用 GLEW 查看您的计算机支持哪些 OpenGL 版本。

std::cout << "OpenGL 2.0: " << ((GLEW_VERSION_2_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 2.1: " << ((GLEW_VERSION_2_1 != 0) ? "Available" : "Unavailable") << std::endl;

std::cout << "OpenGL 3.0: " << ((GLEW_VERSION_3_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.1: " << ((GLEW_VERSION_3_1 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.2: " << ((GLEW_VERSION_3_2 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.3: " << ((GLEW_VERSION_3_3 != 0) ? "Available" : "Unavailable") << std::endl;

std::cout << "OpenGL 4.0: " << ((GLEW_VERSION_4_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.1: " << ((GLEW_VERSION_4_1 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.2: " << ((GLEW_VERSION_4_3 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.3: " << ((GLEW_VERSION_4_3 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.4: " << ((GLEW_VERSION_4_4 != 0) ? "Available" : "Unavailable") << std::endl;

请注意,在执行上述操作之前,您当然需要创建一个 OpenGL 上下文并调用 glewInit()

我不确定以下内容,但如果您执行上述操作并且输出“不可用”,当您确定它可用时,则可能与 OpenGL 版本有关当前 OpenGL 上下文正在使用。

关于c++ - glGetString(GL_VERSION) 返回 1.1.0,即使卡支持 2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451074/

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