Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Vista SP1 + C++/CLI - проблема с OpenGL


Автор: NightmareZ 12.4.2008, 15:23
Функция 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 - всё работает, как и должно.

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

Автор: NightmareZ 12.4.2008, 19:58
Цитата(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 17.4.2008, 11:10
Не, ну это невозможно  :'( 
Дрова стоят. Все игры работают. Мои проги, юзающие 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.................

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

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

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

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

Автор: NightmareZ 29.4.2009, 03:46
Опять такая же фигня.
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, 23:22
Убиться тапком. 
Нужно вместо 
Код

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

писать
Код

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

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