#pragma comment(lib,"OpenGL32.lib")
#pragma comment(lib,"Glu32.lib")
#pragma comment(lib,"GlAux.Lib")
#pragma comment(linker,"/ENTRY:My_WinMain")
#pragma comment(linker,"/SUBSYSTEM:WINDOWS")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"GDI32.lib")
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/GLAux.h>
//Constants:
HGLRC glRc=NULL;
HDC dC=NULL;
HWND hW=NULL;
HINSTANCE hI=NULL;
//Bools:
bool keys[256];
bool mini=true;
bool fullScreen=TRUE;
//Functions declare:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//Code:
void ReSizeScene(GLsizei width,GLsizei height)
{
if (height==0)
height++;
glViewport(0,0,height,width);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int GLInit(GLvoid)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return TRUE;
}
int DrawScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
auxSolidCone(1,1);
auxWireCone(1,1);
return TRUE;
}
GLvoid KillGLWindow(GLvoid)
{
if (fullScreen)
{
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}
if (glRc)
{
if (!wglMakeCurrent(NULL,NULL))
{
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(glRc))
{
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
glRc=NULL;
}
if (dC && !ReleaseDC(hW,dC))
{
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
dC=NULL;
}
if (hW && !DestroyWindow(hW))
{
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hW=NULL;
}
if (!UnregisterClass("OpenGL",hI))
{
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hI=NULL;
}
}
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint uI;
WNDCLASS w;
ZeroMemory(&w,sizeof(WNDCLASS));
RECT r;
r.left=(long)0;
r.right=(long)width;
r.top=(long)0;
r.bottom=(long)height;
fullScreen=fullscreenflag;
hI=GetModuleHandle(NULL);
w.hInstance=hI;
w.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
w.lpfnWndProc=(WNDPROC)WndProc;
w.cbClsExtra=0;
w.cbWndExtra=0;
w.hIcon=LoadIcon(NULL, IDI_WINLOGO);
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.lpszClassName="OpenGL";
if (!RegisterClass(&w))
{
MessageBox(NULL,"Error while registering class!","Error!",NULL);
return FALSE;
}
DEVMODE d;
d.dmBitsPerPel=bits;
d.dmSize=sizeof(DEVMODE);
d.dmPelsHeight=height;
d.dmPelsWidth=width;
d.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if (ChangeDisplaySettings(&d,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
MessageBox(NULL,"Can't change video mode!","Error!",NULL);
return FALSE;
}
DWORD dwExStyle=WS_EX_APPWINDOW;
DWORD dwStyle=WS_POPUP;
ShowCursor(FALSE);
if (!CreateWindowEx(dwExStyle,"OpenGl","GLWindow",WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle,0,0,r.right-r.left,r.bottom-r.top,NULL,NULL,hI,NULL))
{
KillGLWindow();
MessageBox(NULL,"ErrorCreatingWindow","Error!",NULL);
return FALSE;
}
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
bits,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
if (!(dC=GetDC(hW)))
{
KillGLWindow();
MessageBox(NULL,"Can't get DC!","Error!",NULL);
return FALSE;
}
if (!(uI=ChoosePixelFormat(dC,&pfd)))
{
KillGLWindow();
MessageBox(NULL,"Can't choose pF!","Error!",NULL);
return FALSE;
}
if (!SetPixelFormat(dC,uI,&pfd))
{
KillGLWindow();
MessageBox(NULL,"Can't set pF!","Error!",NULL);
return FALSE;
}
if (!(glRc=wglCreateContext(dC)))
{
KillGLWindow();
MessageBox(NULL,"Can't create rC!","Error!",NULL);
return FALSE;
}
ShowWindow(hW,SW_SHOW);
SetForegroundWindow(hW);
SetFocus(hW);
ReSizeScene(width,height);
if (!GLInit())
{
KillGLWindow();
MessageBox(NULL,"Can't init OpenGL!","Error!",NULL);
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hW,UINT uI,WPARAM wP,LPARAM lP)
{
switch (uI)
{
case WM_ACTIVATE:
{
if (!HIWORD(wP))
{
mini=TRUE;
}
else
{
mini=FALSE;
}
return 0;
}
case WM_SYSCOMMAND:
{
switch(wP)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break;
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_KEYDOWN:
{
keys[wP]=TRUE;
return 0;
}
case WM_KEYUP:
{
keys[wP]=FALSE;
return 0;
}
case WM_SIZE:
{
ReSizeScene(LOWORD(lP),HIWORD(lP));
return 0;
}
}
return DefWindowProc(hW,uI,wP,lP);
}
int WINAPI My_WinMain()
{
return 0;
}
gluPerspective
Неработает если переназначить точку входа на свою, но с winmain и main ессесно работает.
Вопрос:как сделать,чтобы заработало и какого gluPerspective бращается к main().
Цитата:
Originally posted by Lenin
Недавно начал учить opengl,написал простенький пример,но вот облом-не компилится,точнее не линкуется.Выдает:unresolved external symbol _main referenced in function _mainCRTStartup.Опытным путем выяснил,что проблема в функции gluPerspective.Причем ошибка вылетает только когда линкую с libcmt,а если с msvcrt,то ничего.
Неработает если переназначить точку входа на свою, но с winmain и main ессесно работает.
Вопрос:как сделать,чтобы заработало и какого gluPerspective бращается к main().
Недавно начал учить opengl,написал простенький пример,но вот облом-не компилится,точнее не линкуется.Выдает:unresolved external symbol _main referenced in function _mainCRTStartup.Опытным путем выяснил,что проблема в функции gluPerspective.Причем ошибка вылетает только когда линкую с libcmt,а если с msvcrt,то ничего.
Неработает если переназначить точку входа на свою, но с winmain и main ессесно работает.
Вопрос:как сделать,чтобы заработало и какого gluPerspective бращается к main().
Запомни в OpenGl ошибок быть не может, особенно в документированой части. Это, скорее всего компилятор неправильно идентифицирует место ошибки. Надо код смотреть.
ЗЫ. А на чем пишешь?
Цитата:
Originally posted by Dart Bobr
Запомни в OpenGl ошибок быть не может, особенно в документированой части. Это, скорее всего компилятор неправильно идентифицирует место ошибки. Надо код смотреть.
ЗЫ. А на чем пишешь?
Запомни в OpenGl ошибок быть не может, особенно в документированой части. Это, скорее всего компилятор неправильно идентифицирует место ошибки. Надо код смотреть.
ЗЫ. А на чем пишешь?
Пишу на c/c++,а вот код
Код:
Я думаю проблемы со сменой точки входа,наверно надо что-то в настройках проэкта сменить,а что-не знаю.
А если закоментить gluPerspective?
Ошибка вылетает?
А зачем переназначать точку входа?
ЗЫ. В функции ResizeScene у тебя перепутаны местами параметры функции glViewPort.
Код лучше всегда пиши в аттач к теме.