[英]glVertexAttribPointer trouble (OpenGL 3.x forward-compatible context)
[英]Creating an OpenGL 3.2/3.x context in SDL 1.3
我遇到的問題是SDL表示它不支持OpenGL 3.x上下文。 我正在嘗試遵循本教程: 在SDL(C / SDL)中創建跨平台OpenGL 3.2上下文 。 我在這種情況下使用GLEW,但我也無法使用gl3.h來處理這個問題。 這是我最終得到的代碼:
#include <glew.h>
#include <SDL.h>
int Testing::init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
printSDLError();
system("pause");
return 1; // Error
}
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//set double buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//Create window
window = SDL_CreateWindow("OpenGL 3.2 test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == NULL) return 3; // Error
//Print errors to console if there are any
printSDLError(__LINE__);
//Set up OpenGL context.
glContext = SDL_GL_CreateContext(window);
printSDLError(__LINE__);
if(glContext == NULL)
{
DEBUGLINE("OpenGL context could not be created.");
system("pause");
return 4;
}
//Initialize glew
GLenum err = glewInit();
if(err != GLEW_OK)
{
DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
system("pause");
return 2;
}
return 0; // OK code, no error.
}
報告的唯一問題是在嘗試調用SDL_GL_CreateContext(window)
,其中SDL報告“不支持GL 3.x”。 但是,教程和這個示例包 (我沒有費心去測試)都表示在組合SDL 1.3和OpenGL 3.2方面取得了成功。 我知道SDL 1.3正處於開發階段,但我有點懷疑即使是無意的支持也會被刪除。
仍然創建了一個上下文,GLEW能夠初始化就好了。 (我無法弄清楚我的生活如何看到創建的上下文的版本,因為它應該是核心配置文件,我也不知道如何找到它。根據教程, SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)
實際上沒有做任何事情,在這種情況下,我不知道如何獲得創建的適當上下文或更改默認上下文。)
編輯:經過一些測試得益於Nicol給我的有用功能,我發現,無論我傳遞給SDL_GL_SetAttribute
的參數SDL_GL_SetAttribute
,上下文總是版本1.1。 但是,放入3.0以下的任何版本都不會吐出錯誤,說它不受支持。 所以問題是SDL看到的“核心”版本只有1.1。
為了記錄,我使用的是Visual C ++ 2010 express,GLEW 1.7.0和最新的SDL 1.3版本。 我是相當新的使用所有這三個,我不得不手動構建32位和64位版本的SDL庫,所以有很多可能會出錯。 到目前為止,32位和64位版本的功能完全相同。
編輯:我正在使用帶有最新驅動程序的nVidia 360M GPU,OpenGL Extension Viewer 4.04報告該驅動程序與OpenGL 3.3具有完全兼容性。
任何幫助表示贊賞。
更新 :我設法讓SDL停止對我大喊大叫它不支持3.x上下文。 問題是, SDL_GL_SetAttribute
必須設置BEFORE SDL_Init
被稱為:
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
return 1; // Error
}
不幸的是,GLEW仍然拒絕承認任何高於OpenGL 1.1的東西(只有GLEW_VERSION_1_1返回true),這仍然讓我感到困惑。 glGetString(GL_VERSION)
也報告1.1.0。 似乎我的程序根本不知道任何更高版本,好像我根本沒有安裝它們。
因為我不知道你是否已找到解決方案,這是我的:
我今天和昨天用這些東西掙扎了很多。 無法使用高級GL函數,因此我甚至調試到opengl32.dll只是為了看它真的有效並將調用包裝到特定於硬件的OpenGL DLL(nvoglnt.dll)中。 所以一定有另一個原因。 互聯網上甚至有提示在所有其他庫之前鏈接到opengl32.lib,因為ChoosePixelFormat和其他一些函數被相互覆蓋。
但這也不是原因。 我的解決方案是在這里啟用加速視覺效果:
// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {
fprintf(stderr, "Could not init SDL");
return 1;
}
// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
因為在當前的SDL修訂版(2011年12月15日)中,他在SDL_windowsopengl.c中檢查它
if (_this->gl_config.accelerated >= 0) {
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
WGL_NO_ACCELERATION_ARB);
}
如果您沒有自己定義,則此屬性初始化為-1。
並且:在初始化SDL之前不要設置版本屬性,因為設置屬性需要正確初始化視頻后端!
我希望這有幫助。
我按照本教程。 在windowz和linux上一切正常。 http://people.cs.uct.ac.za/~aflower/tutorials.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.