по поводу glut... впринципе насколько я понял ОГЛ этими функциями создает окно. А у меня окно делается с помощью WINAPI. Поэтому может быть этот glut и не нужен. Я где то читал, что это устаревший метод. И им сейчас лучше не пользоваться(
Покажи как инициализируешь и где падает.
Исходники у меня на работе. я завтра там буду и скину сюда всю функцию.
вот как инициализирую :
bool CreateOGL()
{
int argc;
char **argv;
/* установим черный фон */
glClearColor (0.0, 0.0, 0.0, 0.0);
/* инициализация viewing values */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
glutInit(&argc, argv);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
glutDisplayFunc(display);
glutMainLoop();
return true;
}
Trojian
Пара идей:
1) glut надо инициализировать до функций OpenGL
2) Попробуй написать int argc = 1; А лучше передавай настоящие argc и argv.
3) Почитай NeHe
И, вообще, ты же писал:
> А у меня окно делается с помощью WINAPI.
Зачем тогда glut?
Trojian
В порядке инициализации отсутствует логика. Запомни: вызывать функции OpenGL можно ТОЛЬКО после создания контекста и установки его активным. И где у тебя окно создается с помощью WinAPI если я вижу glutCreateWindow ("hello");? Выбрасывай GLUT и делай все через WinAPI. Создавай окно, устанавливай формат пикселя, создавай контекст.
eXmire
Хорошо. ды glut a подтёр.Сейчас буду курить в ту сторону.
Есть книга "OpenGL суперкнига". К книге прилагается компакт диск с примерами и исходниками. Первые примеры инициализируются через GLUT. Можеш там и посмотреть как это происходит.
А без GLUT вообще можно произвести инициализацию?
Нужно.
а можно пример? или хотя бы подскажите куда копать?
Trojian
Тебе в 4м посте дали ссылку. Ты походу по этой ссылке не заходил. Почитай.
eXmire
вот сделал: но сама инициализация не особо работает
int window::InitPixelFormat(HDC hdc)
{
int pixelformat;
PIXELFORMATDESCRIPTOR pfd = {0};
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
if (!(pixelformat = ChoosePixelFormat(hdc, &pfd)))
{
//Error: ChoosePixelFormat failed
return 0;
}
if(!SetPixelFormat(hdc, pixelformat, &pfd))
{
//Error: SetPixelFormat failed"
return 0;
}
return 1;
}
void window::InitSettings()
{
}
void window::ReleaseOpenGL()
{
if(hRC)
{
wglMakeCurrent(hDC, 0);
wglDeleteContext(hRC);
hRC = 0;
}
if(hDC)
{
ReleaseDC(hWnd, hDC);
hDC = 0;
}
}
int window::InitOpenGL(HWND hWnd)
{
//hWnd = _hWnd;
hDC = GetDC(hWnd);
if(!InitPixelFormat(hDC))
return 0;
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
InitSettings();
return 1;
}
void window::DrawObjects()
{
glBegin(GL_TRIANGLES);
glColor3ub(255,0,0); // красный
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f( 0.5f, 0.0f, 0.0f);
glColor3ub(0,0,255); // синий
glVertex3f(-0.5f , 0.5f, 0.0f);
glEnd();
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow )
{
WNDCLASSEX wndclass;
wchar_t * class_name = L"WNDCLASS";
wchar_t * window_name = L"MainWindow";
HWND hWnd = NULL;
MSG msg = {0};
// Create and Write to LOG - File
ofstream log("log_window.log");
// Read to Config File
_cfg.ReadToFile();
ZeroMemory(&wndclass,sizeof(wndclass));
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.cbClsExtra = NULL;
wndclass.cbWndExtra = NULL;
wndclass.hbrBackground = (HBRUSH)GetStockObject(2);
wndclass.hCursor = (HCURSOR)LoadCursor(hInst, IDC_ARROW);
wndclass.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon(hInst, IDI_APPLICATION);
wndclass.hInstance = hInst;
wndclass.lpfnWndProc = MainWinProc;
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = class_name;
if(!RegisterClassEx(&wndclass))
{
log << "Register Class...FAIL\n";
MessageBox(hWnd, L"Register Class...FAIL\n", window_name, MB_OK);
}
else
{
log << "Register Class...OK\n";
}
if(!(hWnd = CreateWindowEx(NULL,
class_name,
window_name,
WS_OVERLAPPEDWINDOW,
10,10,
_cfg.Width,
_cfg.Height,
NULL,NULL,
hInst, NULL)))
{
log << "Create Window...FAIL\n";
MessageBox(hWnd,L"Create Window...FAIL", window_name, MB_OK);
}
else
{
log << "Create Window...OK\n";
}
if(!(_window.InitOpenGL(hWnd)))
{
MessageBox(hWnd,L"InitOpenGL..FAIL", window_name, MB_OK);
}
ShowWindow(hWnd, nShow);
UpdateWindow(hWnd);
while( WM_QUIT != msg.message )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
_window.DrawObjects();
Sleep(1);
}
}
_cfg.WriteToFile();// Create and Write to Config File
return msg.wParam;
}
Trojian
Инициализация OpenGL через WinAPI:
http://opengl.org.ru/books/open_gl/chapter7.3.html
С использованием GLUT:
http://opengl.org.ru/books/open_gl/chapter7.7.html
Trojian
> вот сделал: но сама инициализация не особо работает
Как понять "не особо работает"? Напиши, в чем проблема.
Тема в архиве.