我在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上使用英特尔高清显卡芯片组。
如何让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;
}
答案 0 :(得分:2)
我认为您误解了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()
。
我不确定以下内容,但如果您执行上述操作并输出&#34; Unavailable&#34;,当您确定知道它可用时,那么它可能与当前OpenGL上下文正在使用的OpenGL版本有关。
答案 1 :(得分:1)
要尝试的事情:
删除所有SDL_GL_SetAttribute()
来电。您可能会过度约束像素格式。一次一个地添加它们以找出你超越的位置。
删除only the SDL_GL_CONTEXT_*
calls,因为您没有尝试请求GL 3.x上下文。