Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Vista SP1 + C++/CLI - проблема с OpenGL 
V
    Опции темы
NightmareZ
Дата 12.4.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Функция wglCreateContext(dc) возвращает ноль. Не могу понять, почему.

Код

namespace Render
{
  public ref class Render : IDisposable
  {
  private:
    HWND Handle;
    HDC dc;
    HGLRC hrc;
  public:
    Render(IntPtr Handle)
    {
      this->Handle = (HWND)Handle.ToPointer();

      if (!(dc = GetDC(this->Handle)))
      {
        throw gcnew Exception();
      }

      PIXELFORMATDESCRIPTOR pfd;
      ZeroMemory(&pfd, sizeof(pfd));
      pfd.dwFlags =
        PFD_SUPPORT_OPENGL |
        PFD_DRAW_TO_WINDOW |
        PFD_DOUBLEBUFFER;
      pfd.nSize = sizeof(pfd);
      pfd.nVersion = 1;

      SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd);

      if (!(hrc = wglCreateContext(dc)))
      {
        throw gcnew Exception();
      }

      wglMakeCurrent(dc, hrc);

      glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
    }

    ~Render()
    {
      wglMakeCurrent(0, 0);
      wglDeleteContext(hrc);
      //ReleaseDC(Handle, dc);
    }

    void BeginScene()
    {
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
      glTranslatef(x, y, z);
      glRotatef(rx, 1.0f, 0.0f, 0.0f);
      glRotatef(ry, 0.0f, 1.0f, 0.0f);
      glRotatef(rz, 0.0f, 1.0f, 1.0f);
    }

    void EndScene()
    {
      SwapBuffers(dc);
    }

    void Resize(int Width, int Height)
    {
      if (Width <= 0)
      {
        Width = 0;
      }

      if (Height <= 0)
      {
        Height = 0;
      }

      glViewport(0, 0, Width, Height);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluPerspective(45.0f, (float)Width / Height, 1.0f, 1000.0f);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
    }
  };
}


Только что идентичный код написал на C#, но с использованием Tao Framework - всё работает, как и должно.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
mr.DUDA
Дата 12.4.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Могу предположить, что OpenGL на висте работает не так как под XP. Неплохо было бы покопаться в исходниках Tao Framework, может функция wglCreateContext там как-то по-другому объявлена и т.п.


--------------------
user posted image
PM MAIL WWW   Вверх
NightmareZ
Дата 12.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Цитата(mr.DUDA @ 12.4.2008,  16:47)
Могу предположить, что OpenGL на висте работает не так как под XP. Неплохо было бы покопаться в исходниках Tao Framework, может функция wglCreateContext там как-то по-другому объявлена и т.п.

Код

[DllImport(WGL_NATIVE_LIBRARY, SetLastError=true), SuppressUnmanagedCodeSecurity]
public static extern IntPtr wglCreateContext(IntPtr deviceContext);


Ничего необычного.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
NightmareZ
Дата 17.4.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Не, ну это невозможно  :'( 
Дрова стоят. Все игры работают. Мои проги, юзающие OpenGL - работают.... на C#, на C++, на Delphi. 
Создаю форму на C++/CLI, подключаю к ней то, что нужно для юзания OpenGL: #include <windows.h>
Код

#include <gl\gl.h>
#include <gl\glu.h>

#pragma comment (lib, "OpenGL32.lib")
#pragma comment (lib, "Glu32.lib")

#pragma comment (lib, "User32.lib")
#pragma comment (lib, "Gdi32.lib")

пишу самый тупой код в обработчике события Click формы, дабы перекрасить с помощью опенгл окно: 
Код

HWND h = (HWND)this->Handle.ToPointer();

HDC dc = GetDC(h);

if (dc == 0)
{
    throw gcnew ApplicationException("DC == 0");
}

PIXELFORMATDESCRIPTOR pfd = {0};
pfd.dwFlags =
    PFD_DRAW_TO_WINDOW |
    PFD_DOUBLEBUFFER |
    PFD_SUPPORT_OPENGL;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;

SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd);

HGLRC hrc = wglCreateContext(dc);

if (hrc == 0)
{
    throw gcnew ApplicationException("HRC == 0");
}

wglMakeCurrent(dc, hrc);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Запускаю, hrc == 0      :-(((((((((( 
Я даже предположить не могу, почему так...........

Добавлено через 35 секунд
По дефолту компилируется с опцией: 
Common Language Runtime support: Pure MSIL Common Language Runtime Support (/clr:pure) 

Переключаю на Common Language Runtime Support (/clr)  - теперь hrc не равно нулю!!!! Но окно всё-равно не перекрашивается....

Добавлено через 55 секунд
Попробывал работать с Tao Framework на C++/CLI.... та же беда.... 
Проблема именно с C++/CLI.................


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
mr.DUDA
Дата 17.4.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



NightmareZ, как крайний случай, можно было бы вынести OpenGL-часть приложения в отдельную Win32 DLL и работать через [DllImport].


--------------------
user posted image
PM MAIL WWW   Вверх
NightmareZ
Дата 17.4.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Цитата(mr.DUDA @ 17.4.2008,  12:59)
NightmareZ, как крайний случай, можно было бы вынести OpenGL-часть приложения в отдельную Win32 DLL и работать через [DllImport].

Это решит мою проблему в данный момент. Но, спустя какое-то время, проблема опять даст о себе знать.... посему, я хочу выяснить причину.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
jonie
Дата 18.4.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



может GetLastError прольет свет ?
т.к. судя по объявлению нечто типа unmanaged кода дергается...
хотя нишарю)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
NightmareZ
Дата 29.4.2009, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Опять такая же фигня.
C# + Tao Framework.
Интересно, что с Mesa3D работает нормально. Может дело в дровах?

Код

public Render(IntPtr handle)
{
    if (handle == IntPtr.Zero)
        throw new InvalidHandleException();

    _handle = handle;

    if ((_dc = User.GetDC(_handle)) == IntPtr.Zero)
        throw new InvalidDeviceContextException();

    var pfd = new Gdi.PIXELFORMATDESCRIPTOR
        {
            nVersion = 1,
            nSize = (short)Marshal.SizeOf(typeof(Gdi.PIXELFORMATDESCRIPTOR)),
            dwFlags = Gdi.PFD_SUPPORT_OPENGL |
                Gdi.PFD_DRAW_TO_WINDOW |
                Gdi.PFD_DOUBLEBUFFER
        };

    int pf;

    if ((pf = Wgl.wglChoosePixelFormat(_dc, ref pfd)) == 0)
        throw new InvalidPixelFormatException();

    if (!Wgl.wglSetPixelFormat(_dc, pf, ref pfd))
        throw new CantSetPixelFormatException();

    if ((_hrc = Wgl.wglCreateContext(_dc)) == IntPtr.Zero)
        throw new InvalidRenderingContextException();

    Wgl.wglMakeCurrent(_dc, _hrc);
}


Это сообщение отредактировал(а) NightmareZ - 29.4.2009, 03:47


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
NightmareZ
Дата 29.4.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 1
Всего: 13



Убиться тапком. 
Нужно вместо 
Код

Wgl.wglSetPixelFormat(_dc, pf, ref pfd);

писать
Код

Gdi.SetPixelFormat(_dc, pf, ref pfd);



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.