PMG

Форумы по созданию игр
Текущее время: 28 мар 2024 23:45

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Глюки с текстурой
СообщениеДобавлено: 16 сен 2007 21:36 
Не в сети
Любитель

Зарегистрирован: 12 мар 2007 01:51
Сообщения: 17
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 );
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 сен 2007 08:43 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
У меня все ok!

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 сен 2007 11:57 
Не в сети
Любитель

Зарегистрирован: 12 мар 2007 01:51
Сообщения: 17
мой ехе тоже ок? у меня все грани стараются выйти на передний план. в результате некорые задние грани оказываются перед передними.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 сен 2007 16:03 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Н-да, этак и по фазе не долго поехать :sheep:

Функция gluPerspective должна выглядеть так:
Код:
gluPerspective(45, (GLfloat)width/(GLfloat)height, 0.1f, 100);
                                                   ~~~ - не 0!!!

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 сен 2007 03:20 
Не в сети
Любитель

Зарегистрирован: 12 мар 2007 01:51
Сообщения: 17
спасибо


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB