- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用 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您可以使用 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/
glGetString(GL_VERSION) 是获取系统支持的最大版本,还是当前上下文的版本? 我知道您需要创建上下文才能使 glGetString() 正常工作,因此我想知道它是当前上下文还是可用
我试图了解 glGetString(GL_VERSION) 返回的内容,因为我在使用此函数时得到了奇怪的结果。这是否返回我的 GPU 支持的最大 opengl 版本或当前创建的上下文的 oepngl
我正在使用 SDL2 + GLAD 在 C++ 中创建一个 OpenGL 应用程序。在我的主要功能中,我有以下代码: #include #include #include int main(in
我正在运行 cocos2d-iphone 1.0.0 并关注 this使用 cocos2d 和 ARC 的教程。不幸的是,每当我尝试将 TMX Tiled Map 添加到 CCLayer 时,我都会收
OpenGL 有一些函数,如 glGetString和 glGetShaderInfoLog返回字符串。什么形式的文本编码用于这些? 我假设,鉴于它们作为 GLchar* 返回,它是包含在返回值中的
能否请您解释一下这个用于确定 OpenGL extensions 的简单代码有什么问题? : 字符串扩展 = javax.microedition.khronos.opengles.GL10.glGe
我读了这个页面: http://www.opengl.org/wiki/GlGetString For example, if the extension GL_EXT_pixel_transform
我正在 Fedora 13 上学习 OpenGL 并注意到对 glGetString 的调用导致段错误。我搜索过 Google,但没有找到解决方案。 代码很简单: #include int main
我正在尝试在后台线程中加载纹理以帮助加快我的应用程序。 我们使用的堆栈是 Linux 上的 C/C++,使用 gcc 编译。我们正在使用 OpenGL、GLUT 和 GLEW。我们一直在使用 libS
我的应用程序需要在启动前检查某些 OpenGL ES 功能的可用性。 这是通过以下 Java 代码完成的: String extensions = GLES20.glGetString( GLES20
我在使用 SDL2 和 OpenGL 时遇到了一个小问题。我一直在尝试让 VBO 正常工作(特别是 ARB 对象),但一直没有成功。通过各种搜索,我发现板载 GL.h 是多么古老,并选择了 glew.
我使用的是 Linux Mint 13 XFCE。我的问题是,当我在终端中运行命令时: glxinfo | grep "OpenGL version" 我得到以下输出: OpenGL version
第一次在这里提问,所以如果布局不正确或缺少某些内容,我会尝试解决其他所有问题。 我正在尝试学习 OpenGl,因为我对开发自己的游戏很感兴趣,而且我宁愿创建自己的引擎也不愿创建现有的引擎。我也在使用
我正在尝试制作一个基于 NDK 的 OpenGL 应用程序。在我的代码中的某个时刻,我想检查设备上可用的 OpenGL 版本。 我正在使用以下代码: const char *version = (co
我是一名优秀的程序员,十分优秀!