Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 16:53   #1
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию После инициализация контекста opengl в VS, ничего не рисуется

Инициализировал контекст, но не пойму почему не рисуются примитивы например линии или точки.
Код:
#include <Windows.h>
#include "glew.h"
//#include <GL/gl.h>
#include "wglew.h"
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "OpenGL32.Lib")
HWND hWnd;
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
HRESULT InitCompatibleContext()
{
      int iMajorVersion=0;
      int iMinorVersion=0;
 
      HDC hDC = GetDC(hWnd);
 
      // Устанавливаем параметры поверхности контекста
 
      PIXELFORMATDESCRIPTOR pfd;
      memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
      pfd.nSize         = sizeof(PIXELFORMATDESCRIPTOR);
      pfd.nVersion   = 1;
      pfd.dwFlags    = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
      pfd.iPixelType = PFD_TYPE_RGBA;     //тип пикселей
      pfd.cColorBits = 32;                //тип цвета
      pfd.cDepthBits = 24;                //тип z-буфера
      pfd.iLayerType = PFD_MAIN_PLANE;
 
      int iPixelFormat = ChoosePixelFormat(hDC, &pfd);
      if (iPixelFormat == 0) return false;
 
      if(!SetPixelFormat(hDC, iPixelFormat, &pfd)) return false;
 
      // Создаем совместимый контекст
 
      HGLRC hRCCompatible = wglCreateContext(hDC);
      wglMakeCurrent(hDC, hRCCompatible);
 
      bool bResult = true;
 
      if(glewInit() != GLEW_OK)
      {
      MessageBoxA(hWnd, "Couldn't initialize GLEW!", "Fatal Error", MB_ICONERROR);
      bResult = false;
      }
 
      wglMakeCurrent(NULL, NULL);
      wglDeleteContext(hRCCompatible);
 
      return bResult;
}

//------------------------------------------------------------------------------------
// Инициализация OpenGL основного контекста
//------------------------------------------------------------------------------------

HRESULT InitContext()
{
      int iMajorVersion=4;
      int iMinorVersion=0;
 
      HDC hDC = GetDC(hWnd);
      PIXELFORMATDESCRIPTOR pfd;
      ZeroMemory(&pfd,sizeof(pfd)); 
 
      bool bError=false;
 
      // Устанавливаем параметры поверхности контекста
      if(WGLEW_ARB_create_context && WGLEW_ARB_pixel_format)
      {
            const int iPixelFormatAttribList[] =
            {
                  WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
                  WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
                  WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
                  WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, //тип пикселей
                  WGL_COLOR_BITS_ARB, 32,                   //тип цвета
                  WGL_DEPTH_BITS_ARB, 24,                //тип z-буфера
                  WGL_STENCIL_BITS_ARB, 8,
                  0 // End of attributes list
            };
            int iContextAttribs[] =
            {
                  WGL_CONTEXT_MAJOR_VERSION_ARB, iMajorVersion,
                  WGL_CONTEXT_MINOR_VERSION_ARB, iMinorVersion,
                  WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
                  0 // End of attributes list
            };
 
            int iPixelFormat, iNumFormats;
            wglChoosePixelFormatARB(hDC, iPixelFormatAttribList, NULL, 1,
             &iPixelFormat, (UINT*)&iNumFormats);
 
            // PFD seems to be only redundant parameter now
            if(!SetPixelFormat(hDC, iPixelFormat, &pfd))return false; 
 
            // Создаем основной контекст
 
            HGLRC hRC = wglCreateContextAttribsARB(hDC, 0, iContextAttribs);
            // If everything went OK
            if(hRC) wglMakeCurrent(hDC, hRC);
            else bError = true;
 
      }
      else bError = true;
      if(bError) {       }  // Generate error messages
 
   return S_OK;
}


void Render()
{
    //
    // Очистка рендер-таргета
    // 
    HDC hDC = GetDC(hWnd);
 
    // Очистка поверхности цветом
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
   
 
	glBegin(GL_TRIANGLES);
		glColor3f(1.0f, 0.0f, 0.0f);
		glVertex2f(-0.7f, -0.3f);
		glColor3f(1.0f, 0.0f, 1.0f);
		glVertex2f(-0.1f, 0.8f);
		glColor3f(0.0f, 1.0f, 0.2f);
		glVertex2f(-0.05f, -0.1f);
	glEnd();

    // Отображение геометрии на рендер-таргете
    // Вывод содержимого рендер-таргета на экран
    SwapBuffers(hDC);
}
WebbMan вне форума Ответить с цитированием
Старый 22.03.2013, 16:53   #2
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Код:
////////////////////////////////////////////////////////////////////////// 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{

  // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!");

  // регистрация класса
  if (!RegMyWindowClass(hInstance, lpzClass))
    return 1;

  // вычисление координат центра экрана
 // RECT screen_rect;
 // GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана
 // int x = screen_rect.right / 2 - 150;
 // int y = screen_rect.bottom / 2 - 75;

  // создание диалогового окна
  hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"), 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 500, 500, NULL, NULL, 
    hInstance, NULL);

  // если окно не создано, описатель будет равен 0
  if(!hWnd) return 2; 



//  InitWindow( hInstance, nCmdShow );
  InitCompatibleContext();
 InitContext();

 	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

  // цикл сообщений приложения
  MSG msg = {0};    // структура сообщения
  int iGetOk = 0;   // переменная состояния
  while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
  {
    if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
	//Render();
  }

  return msg.wParam;  // возвращаем код завершения программы
}

////////////////////////////////////////////////////////////////////////// 
// функция регистрации класса окон
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)
{
  WNDCLASS wcWindowClass = {0};
  // адрес ф-ции обработки сообщений
  wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
  // стиль окна
  wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wcWindowClass.hInstance = hInst;
  // название класса
  wcWindowClass.lpszClassName = lpzClassName;
  // загрузка курсора
  wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
  return RegisterClass(&wcWindowClass); // регистрация класса
}

////////////////////////////////////////////////////////////////////////// 
// функция обработки сообщений
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // выборка и обработка сообщений
  switch (message)
  {
  case WM_LBUTTONUP:
     // реакция на сообщение
    //MessageBox(hWnd, TEXT("Вы кликнули!"), TEXT("событие"), 0);
	      
            Render();
    break;
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
  default:  
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
WebbMan вне форума Ответить с цитированием
Старый 23.03.2013, 02:54   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вот читаю сейчас "С++. Освой на примерах", где написано, что в функции управление передается первому оператору, и будут читаться строчки кода, пока не встретится оператор return или последний оператор функции. И если я правильно все понял, то у Вас не доходит дело до замены контекста устройства, поэтому и не рисует. В С++ я не горазд, но в delphi с OpenGL хорошо знаком.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 23.03.2013, 17:32   #4
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Цитата:
И если я правильно все понял, то у Вас не доходит дело до замены контекста устройства, поэтому и не рисует.
можете указать где именно?
Я сделал вызов функции Render() по нажатию левой кнопки мыши на окне и в ней в самом конеце вызывается ф-я SwapBuffers(hDC);
WebbMan вне форума Ответить с цитированием
Старый 23.03.2013, 21:13   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

все это конечно, да, но зачем создается core profile context (InitContext)?

в нем нет поддержки glBegin, glColor3f, glVertex2f и другой мурзилки.
f.hump вне форума Ответить с цитированием
Старый 23.03.2013, 22:05   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Я тут пересмотрел код, и понял, что написал хрень.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 24.03.2013, 08:04   #7
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Ой блин не уследил, ф-ии
Цитата:
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRCCompatible);
вызывались сразу после создания контекста, вот что значит скопировать пример из интернета на скорую руку
Цитата:
все это конечно, да, но зачем создается core profile context (InitContext)?
это как я понял создание контекста для opengl > 4, чтобы его новые плюшки поюзать, в общем я эту ф-ю убрал по ненадобности.
WebbMan вне форума Ответить с цитированием
Старый 24.03.2013, 08:05   #8
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Спасибо всем отписавшимся!
WebbMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows7 - "Windows socket error: Требуемый адрес для своего контекста неверен (10049), on API 'connect' BaiAs БД в Delphi 4 06.09.2017 10:12
Инициализация OpenGL kineziz Общие вопросы C/C++ 2 20.04.2012 20:39
Не рисуется битмап Jugger Win Api 2 03.04.2012 15:15
OpenGL определить координаты после translate rotate SAMOUCHKA Qt и кроссплатформенное программирование С/С++ 4 15.03.2012 16:06
В отдельном потоке после ф-ции accept() ничего не выполняется!!! Fissa Общие вопросы .NET 7 25.05.2010 16:23