Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Подскажите как создать минимальное


Автор: smufa 4.3.2007, 01:36
Подскажите как создать минимальное OpenGL приложение на Visual C++

Автор: evilguard 4.3.2007, 21:26
http://qtprojects.narod.ru/OG.rar

Проект, есть объект, управление мышью, все работает, надо откомпилировать только. С использованием MFC.
Но я связываться не стал, и пишу на QT - чего тебе и советую.

З.Ы. с Уфы чтоли?

Автор: smufa 5.3.2007, 02:31
Не, не с Уфы.
Слишком много всего в этом приложении. Я просто пока не могу разобраться как пользоваться OpenGL посему нуждаюсь в простейшем примере. А QT - это чего?

Автор: evilguard 5.3.2007, 19:37
smufa
тогда бери книжку или ищи в инете консольное opengl приложение на Visual C++.
Насчет QT - если ты движешься в сторону игр, тогда тебе оно не надо.
Если собираешься писать приложения на C++ - то однозначано надо изучать, потому что стандартная библиотека классов Microsoft - отстой. QT - это богатая библиотека для построения пользовательсокго интерфейса.
....
....
Нашел то что тебе нуна) Сам когда начинал opengl изучать немного переделал какой-то примерчик))
http://qtprojects.narod.ru/glaux.rar
Короткий и ясный.

Автор: smufa 5.3.2007, 19:50
Видимо проект был создан на более ранней версии, чем 2005, не подскажешь как запустить?

Автор: Rickert 6.3.2007, 08:51
Не используй glut / glaux / qt - вот тебе первые советы от меня.
А урок по разработке простейшего (и не только) приложения вот - http://pmg.org.ru/nehe/nehe01.htm
Остальные уроки - http://pmg.org.ru/nehe

Автор: smufa 6.3.2007, 22:17
Не конвертировалось, писалось   cannot convert parameter 2 from 'const char [29]' to 'LPCWSTR', скомпилировалось после того как я везде перед тем где это писалось написал (LPCWSTR). Вместо букв появляются квадраты, когда меня, видимо, спрашивают хочу ли я запустить в полноэкранном режиме, если нажимаю "нет", появляется окно с восклицательным знаком. 
Вот мой код http://dump.ru/files/6/655790556/.

Автор: Rickert 7.3.2007, 08:49
Цитата(smufa @  6.3.2007,  22:17 Найти цитируемый пост)
Не конвертировалось, писалось   cannot convert parameter 2 from 'const char [29]' to 'LPCWSTR', 

Если ты явно указывал строка, например:
Код

AfxMessageBox("There is no such thing as magic!");

То надо перед строкой просто добавить L:
Код

AfxMessageBox(L"There is no such thing as magic!");

А если у тебя там указатель на строкой тип, то надо конвертировать из char в wchar_t. Квадраты у тебя есесно будут, потому что под char идёт один байт, а под wchar_t (LPCWSTR = *wchar_t) идёт 2 байта.
Как конвертировать смотри тут - http://forum.vingrad.ru/topic-108918/hl/wchar_t/index.html
Тут пример как конвертить wchar_t в char, но по аналогии можно и обратно провести.

Автор: smufa 7.3.2007, 18:10
Цитата(Rickert @  7.3.2007,  08:49 Найти цитируемый пост)

А если у тебя там указатель на строкой тип, то надо конвертировать из char в wchar_t. Квадраты у тебя есесно будут, потому что под char идёт один байт, а под wchar_t (LPCWSTR = *wchar_t) идёт 2 байта.
Как конвертировать смотри тут - http://forum.vingrad.ru/topic-108918/hl/wchar_t/index.html
Тут пример как конвертить wchar_t в char, но по аналогии можно и обратно провести. 

А попроще нет ничего? А также интересно почему при выборе неполноэкранного режима ничего не появляется кроме окна с сообщением.

Автор: x486 7.3.2007, 21:05
Поробуй этот код

Код

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <math.h>

float R = 0;
float G = 0;
float B = 0;

float Start_R = 0;
float Start_G = 0;
float Start_B = 0;

int WindowPosX = 100;
int WindowPosY = 100;
int WindowWidth = 500;
int WindowHeight = 500;

MSG msg;
HWND hWnd;

HDC       hDC = NULL;
HGLRC     hRC = NULL;

HINSTANCE hInst;

char szClassName[]="WindowClass";

void resize(int width,int height)
{
  glViewport ( 0, 0, width, height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1f,100);
  gluLookAt( 15,15,15, -1,-1,-1, 0,1,0);
  glMatrixMode(GL_MODELVIEW);
}

void ColorChenge(float &_R, float &_G, float &_B, float Step)
  {
    _R+= Step;
    if(_R>=1)
      {
        _R = 0;
        _G += Step*2;
        if(_G>=1)
          {
            _G = 0;
            _R = 0;

            _B += Step*3;
            if(_B>=0)
              {
                _R=0;
                _G=0;
                _B=0;
              }
          }
      }

    glColor3f(R,G,B);
  }

void CoordLines(void)
  {
    glColor3f(0.0,0.0,0.0);

    glBegin(GL_LINES);

      glVertex3f(10,0,0);
      glVertex3f(0,0,0);

      glVertex3f(0,10,0);
      glVertex3f(0,0,0);

      glVertex3f(0,0,10);
      glVertex3f(0,0,0);

    glEnd();

  }

void Sin(void)
  {
    glBegin(GL_LINE_STRIP);
    for(float X = 0; X<= 10; X+=0.01)
      {
        ColorChenge(R,G,B,0.01);
        glVertex3f(X, sin(X)*2 + 3,0);
      }
    glEnd();
  }

void Circle(void)
  {
    float X = 0;
    for(float r = 1; r <= 3; r+= 0.5)
      {
        glBegin(GL_LINE_LOOP);
        for(X = 0; X<= 3.14*2; X+=0.01)
          {
            ColorChenge(R,G,B,0.01);
            glVertex3f(0, sin(X)*r+6, cos(X)*r+6);
          }
        glEnd();
      }
  }

void Spiral(void)
  {
    float r = 0;
    glBegin(GL_LINE_STRIP);
    for(float X=0; X>= -3.14*8; X-=0.01)
      {
        ColorChenge(R,G,B,0.01);
        glVertex3f(sin(X)*r+4, 0, cos(X)*r+4);
        r+=0.001;
      }
    glEnd();
  }

void display(void)
  {
    ColorChenge(Start_R, Start_G, Start_B,0.01);
    R = Start_R;
    G = Start_G;
    B = Start_B;
    glClearColor(0.75f, 0.75f, 0.75f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glLineWidth(1);
    CoordLines();
    Sin();
    Circle();
    Spiral();
    SwapBuffers(hDC);
  }

void GLInit(void)
  {
  }

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
 {
   switch (msg)
    {
      case WM_SIZE:
        resize(LOWORD(lParam),HIWORD(lParam));
      return 0;
      
      case WM_DESTROY:
         PostQuitMessage(0);
      return 0;
      
      case WM_CLOSE:
         PostQuitMessage(0);
      return 0;
      
      case WM_PAINT:
        display();
      return 0;

      default: return DefWindowProc(hWnd, msg, wParam, lParam);
     }// End Switch  
  
    return DefWindowProc(hWnd, msg, wParam, lParam); 
 }


int CreateGLWindow()
 {
   WNDCLASS wc;
   GLuint PixelFormat;
   DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
   DWORD dwStyle = WS_OVERLAPPEDWINDOW;
   RECT WindowRect;

   WindowRect.left=(long)WindowPosX;
   WindowRect.top=(long)WindowPosY;
   WindowRect.right=(long)WindowWidth;
   WindowRect.bottom=(long)WindowHeight;

   wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
   wc.cbClsExtra=0;
   wc.cbWndExtra=0;
   wc.lpfnWndProc=WndProc;
   wc.hInstance=hInst;
   wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor=LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground=(HBRUSH)(COLOR_WINDOW);
   wc.lpszMenuName=NULL;
   wc.lpszClassName=szClassName;

   if(!RegisterClass(&wc))
     {
       MessageBox(NULL,"Регистрация класса провалена :(","ОШИБКА",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
   }

  dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
  dwStyle = WS_OVERLAPPEDWINDOW;

  AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle);

  hWnd = CreateWindowEx(dwExStyle,
                        szClassName,
                        "GL Window",
                        dwStyle |
                        WS_CLIPSIBLINGS |
                        WS_CLIPCHILDREN,
                        WindowRect.left, WindowRect.top,
                        WindowRect.right, WindowRect.bottom,
                        NULL,
                        NULL,
                        hInst,
                        NULL);

  if(!hWnd)
   {
    MessageBox(NULL,"Инициализация провалена :(","ОШИБКА",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
   } 

  static PIXELFORMATDESCRIPTOR pfd=
               {
                sizeof(PIXELFORMATDESCRIPTOR),
                1,
                PFD_DRAW_TO_WINDOW |
                PFD_SUPPORT_OPENGL |
                PFD_DOUBLEBUFFER,
                PFD_TYPE_RGBA,
                32,
                0, 0, 0, 0, 0, 0,
                0,
                0,
                0,
                0, 0, 0, 0,
                32,
                0,
                0,
                PFD_MAIN_PLANE,
                0,
                0, 0, 0
               };

  hDC=GetDC(hWnd);
  PixelFormat=ChoosePixelFormat(hDC,&pfd);
  SetPixelFormat(hDC,PixelFormat,&pfd);   
  hRC=wglCreateContext(hDC);
  wglMakeCurrent(hDC,hRC); 
  ShowWindow(hWnd,SW_SHOW);
  SetForegroundWindow(hWnd);
  SetFocus(hWnd);
  resize(WindowRect.right,WindowRect.bottom);
  GLInit();
  
  return true;
 }


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
    hInst = hInstance;

    CreateGLWindow();

    while(GetMessage(&msg, NULL, 0,0 ))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    return 0;
  }



В принципе всё просто, создаёшь пустое приложение Win32, добавляешь в проект новый модуль. Копируешь туда текст, подключаешь необходимые библиотеки и всё готово … полетели.

Если что будет не понятно, спрашивай, разъясню подробней.

Автор: evilguard 7.3.2007, 23:17
smufa, 
Хрен знает, у меня 2005 студия, открыть dsp файл
Rickert, 
Ну не знаю, сразу человека кидать в выньапи - это зло !

Автор: Rickert 8.3.2007, 13:39
evilguard, а с чего предлогаешь начать? Начинают с основ. Без WinAPI ты никуда не уплывёшь.
Цитата(smufa @  7.3.2007,  18:10 Найти цитируемый пост)
А попроще нет ничего?

Слушай, там простецкий код: выделить память и вызвать одну функцию. Какие проблемы? Это что слишком сложно что-ли? Попробуй без документации разобраться с сетевым проктолом для передачи данных в бесдиковых системах - поймёшь что такое сложно. И то, лично я, как программист, от решения таких задач - только удовольствие получаю. Оргазм программиста...
Цитата

А также интересно почему при выборе неполноэкранного режима ничего не появляется кроме окна с сообщением.

Какое окно с сообщением?

Автор: smufa 11.3.2007, 21:35
Когда компилирую проект, сначала появляется окно в котором, видимо мне предлагается выбрать полноэкранный или оконный режим. Если выбрать оконный то сразу появляется подобное предыдущему окно, с кнопкой ок. после её нажатия приложение завершается. Если выбрать полноэкранный режим, то на секунду появляется чёрный экран, а затем то же окно, что и при выборе оконного режима.

Автор: Rickert 12.3.2007, 05:17
А что написанно-то в этом окне? Или просто опять типа "переключится ли в полноэкранный режим?"?

Автор: ZufuS 12.3.2007, 07:26
--

Автор: Rickert 12.3.2007, 09:55
Смотри в уроке neHe - там все сообщения наверное на русском написаны? Перепечатай их на английском в транслите и скажи что она тебе выдаст.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)