| PMG https://forum.pmg.org.ru/ |
|
| Глюки с текстурой https://forum.pmg.org.ru/viewtopic.php?f=1&t=4238 |
Страница 1 из 1 |
| Автор: | xuf [ 16 сен 2007 21:36 ] |
| Заголовок сообщения: | Глюки с текстурой |
http://dump.ru/files/j/j709468950/ Код: #include "stdafx.h"
HGLRC hRC=NULL; HDC hDC=NULL; HWND hWnd=NULL; HINSTANCE hInstance; bool keys[256]; bool active=true; bool fullscreen=true; GLfloat xrot; GLfloat yrot; GLfloat zrot; GLuint texture[1]; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void DrawGLScene(); GLvoid KillGLWindow(); BOOL CreateGLWindow(LPCWSTR title, int width, int height, int bits, bool fullscreenflag); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); GLvoid LoadGLTextures() { AUX_RGBImageRec *texture1; texture1 = auxDIBImageLoad(L"1.bmp"); glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; BOOL done = false; //if(MessageBox(NULL, L"Хотите ли Вы запустить приложение в полноэкранном режиме?", // L"Запустить в полноэкранном режиме?", MB_YESNO | MB_ICONQUESTION) == IDNO) //{ // fullscreen = false; //} if(!CreateGLWindow(L"NeHe OpenGL окно", 1024, 768, 32, false)) { return 0; } while(!done) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) done = true; else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { if(active) { if(keys[VK_ESCAPE]) { done = true; } else { DrawGLScene(); SwapBuffers(hDC); } } if(keys[VK_F1]) { keys[VK_F1] = false; KillGLWindow(); fullscreen = !fullscreen; if(!CreateGLWindow(L"NeHe OpenGL структура", 1024, 768, 32, fullscreen)) return 0; } } } KillGLWindow(); return (int)msg.wParam; } GLvoid ReSizeGLScene(GLsizei width, GLsizei height) { LoadGLTextures(); glEnable(GL_TEXTURE_2D); if( height == 0 ) height = 1; glViewport(0, 0, width, height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective(45, (GLfloat)width/(GLfloat)height, 0, 100); gluLookAt(0,0,5, 0,0,0, 0,1,0); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } int InitGL() { 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; } void DrawGLScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); glRotatef(xrot,1.0f,0.0f,0.0f); // Вращение по оси X glRotatef(yrot,0.0f,1.0f,0.0f); // Вращение по оси Y glRotatef(zrot,0.0f,0.0f,1.0f); // Вращение по оси Z glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); // Передняя грань glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ лево glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Низ право glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Верх право glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх лево // Задняя грань glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ право glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Верх право glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Верх лево glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Низ лево // Верхняя грань glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Верх лево glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Низ лево glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Низ право glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Верх право // Нижняя грань glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Верх право glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Верх лево glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Низ лево glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право // Правая грань glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Низ право glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Верх право glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Верх лево glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Низ лево // Левая грань glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Верх лево glEnd(); xrot+=0.3f; // Ось вращения X yrot+=0.2f; // Ось вращения Y zrot+=0.4f; // Ось вращения Z } GLvoid KillGLWindow() { if(fullscreen) { ChangeDisplaySettings(NULL, 0); ShowCursor(true); } if(hRC) { if(!wglMakeCurrent(NULL, NULL)) { MessageBox(NULL, L"Release Of DC And RC Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); } if(!wglDeleteContext(hRC)) { MessageBox(NULL, L"Release Rendering Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); } hRC = NULL; } if(hDC && !ReleaseDC(hWnd, hDC)) { MessageBox(NULL, L"Release Device Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); hDC=NULL; } if(hWnd && !DestroyWindow(hWnd)) { MessageBox(NULL, L"Could Not Release hWnd.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); hWnd = NULL; } if(!UnregisterClass(L"OpenGL", hInstance)) { MessageBox(NULL, L"Could Not Unregister Class.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION); hInstance = NULL; } } BOOL CreateGLWindow(LPCWSTR title, int width, int height, int bits, bool fullscreenflag) { GLuint PixelFormat; WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect = { 0, 0, width, height }; fullscreen = fullscreenflag; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = L"OpenGL"; if(!RegisterClass(&wc)) { MessageBox( NULL, L"Failed To Register The Window Class.", L"ERROR", MB_OK | MB_ICONEXCLAMATION ); return false; } if(fullscreen) { DEVMODE dmScreenSettings; memset(&dmScreenSettings, 0, sizeof dmScreenSettings); dmScreenSettings.dmSize = sizeof dmScreenSettings; dmScreenSettings.dmPelsWidth = width; dmScreenSettings.dmPelsHeight = height; dmScreenSettings.dmBitsPerPel = bits; dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; if(ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { if(MessageBox(NULL, L"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?", L"NeHe GL", MB_YESNO | MB_ICONEXCLAMATION) == IDYES) { fullscreen = false; } else { MessageBox(NULL, L"Program Will Now Close.", L"ERROR", MB_OK | MB_ICONSTOP); return false; } } } if(fullscreen) { dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; ShowCursor(false); } else { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW; } AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle); if(!(hWnd = CreateWindowEx(dwExStyle, L"OpenGL", title, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, 0, 0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top, NULL, NULL, hInstance, NULL))) { KillGLWindow(); MessageBox(NULL, L"Window Creation Error.", L"ERROR", MB_OK | MB_ICONEXCLAMATION); 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, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; if(!(hDC = GetDC(hWnd))) { KillGLWindow(); MessageBox( NULL, L"Can't Create A GL Device Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION ); return false; } if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) { KillGLWindow(); MessageBox( NULL, L"Can't Find A Suitable PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION ); return false; } if(!SetPixelFormat(hDC, PixelFormat, &pfd)) { KillGLWindow(); MessageBox(NULL, L"Can't Set The PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION); return false; } if(!(hRC = wglCreateContext(hDC))) { KillGLWindow(); MessageBox(NULL, L"Can't Create A GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION); return false; } if(!wglMakeCurrent(hDC, hRC)) { KillGLWindow(); MessageBox(NULL, L"Can't Activate The GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION); return false; } ShowWindow(hWnd, SW_SHOW); SetForegroundWindow(hWnd); SetFocus(hWnd); ReSizeGLScene(width, height); if(!InitGL()) { KillGLWindow(); MessageBox(NULL, L"Initialization Failed.", L"ERROR", MB_OK | MB_ICONEXCLAMATION); return false; } return true; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_ACTIVATE: if(!HIWORD(wParam)) active = true; else active = false; return 0; case WM_SYSCOMMAND: switch(wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; break; } break; case WM_CLOSE: PostQuitMessage(0); return 0; case WM_KEYDOWN: keys[wParam] = true; return 0; case WM_KEYUP: keys[wParam] = false; return 0; case WM_SIZE: ReSizeGLScene(LOWORD(lParam), HIWORD(lParam)); return 0; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); } |
|
| Автор: | MagicWolf [ 17 сен 2007 08:43 ] |
| Заголовок сообщения: | |
У меня все ok! |
|
| Автор: | xuf [ 17 сен 2007 11:57 ] |
| Заголовок сообщения: | |
мой ехе тоже ок? у меня все грани стараются выйти на передний план. в результате некорые задние грани оказываются перед передними. |
|
| Автор: | MagicWolf [ 17 сен 2007 16:03 ] |
| Заголовок сообщения: | |
Н-да, этак и по фазе не долго поехать
Функция gluPerspective должна выглядеть так: Код: gluPerspective(45, (GLfloat)width/(GLfloat)height, 0.1f, 100);
~~~ - не 0!!! |
|
| Автор: | xuf [ 18 сен 2007 03:20 ] |
| Заголовок сообщения: | |
спасибо |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|