glGetString(GL_VERSION)返回1.1.0,尽管该卡支持2.1
glGetString(GL_VERSION) returns 1.1.0, even though card supports 2.1
我在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?(或者我的做法完全错了吗?)
编辑
以下是请求的代码:
astralmin.cpp(inits 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 createdn");
return false;
}
if ((currContext = SDL_GL_CreateContext(currWindow)) == NULL)
{
a_ErrorManager::panic("OpenGl context couldn't be createdn");
}
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版本有关
尝试的东西:
-
删除所有
SDL_GL_SetAttribute()
调用。您可能对像素格式进行了过度约束。把它们一次一个地加回来,找出你越界的地方。 -
只删除
SDL_GL_CONTEXT_*
调用,因为您没有尝试请求GL3.x上下文。
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 将 IPv6 支持添加到雨量计
- 为什么C++不支持对未初始化变量进行智能分析?
- LMDB 是否支持随机读取?
- Visual Studio 19-17 库兼容性根据 GL 标志
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?