OpenGL не показывает / рисует на моей панели C # - PullRequest
1 голос
/ 08 августа 2010

Я делаю базовую программу на C #, которая вызывает C ++ dll.Я даю дескриптор панели для dll, чтобы OpenGL знал, где рисовать.

    [DllImport(@"../../../Debug/Model.DLL")]
    public static extern void startOpenGL(IntPtr hWindow);

Я смешиваю IntPtr hWindow с HWND hWindow.

после того, как я вызываю draw из C #

    [DllImport(@"../../../Debug/Model.DLL")]
    public static extern void draw();

В C ++ у меня есть интерфейс класса, который работает (тестировал его), который вызывает методы моего OpenGLManager.

#pragma once
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "singleton.h"
class OpenGLManager 
{

public:
 static OpenGLManager* instance()
{
    if ( p_theInstance == 0 )
            p_theInstance = new OpenGLManager;
    return p_theInstance;
}
  void init(HWND hWnd);
  void purge();
  void reset();
  void showSomething();
    private:
      HWND mhWnd;
      HDC mhDC;
      HGLRC mhRC;
      static OpenGLManager* p_theInstance;
      OpenGLManager(void);
      ~OpenGLManager(void);
    };

.cpp

#include "OpenGLManager.h"
#include <stdio.h>
OpenGLManager* OpenGLManager::p_theInstance = 0;

OpenGLManager::OpenGLManager(void)
{ 
 reset();
}

OpenGLManager::~OpenGLManager(void)
{
 purge();
}


void OpenGLManager::showSomething()
{
 //MessageBox(NULL,"DRAW","DRAW", MB_OK);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_TRIANGLES);
    glVertex3f(-1.0f, -0.5f, -4.0f);    // lower left vertex
    glVertex3f( 1.0f, -0.5f, -4.0f);    // lower right vertex
    glVertex3f( 0.0f,  0.5f, -4.0f);    // upper vertex
    glEnd();
    glFlush();

}

    void OpenGLManager::init(HWND hWnd)
    {


    // remember the window handle (HWND)
     OpenGLManager::mhWnd = hWnd;

    // get the device context (DC)
    OpenGLManager::mhDC = GetDC( OpenGLManager::mhWnd );

 // set the pixel format for the DC
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory( &pfd, sizeof( pfd ) );
    pfd.nSize = sizeof( pfd );
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
              PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    int format = ChoosePixelFormat( OpenGLManager::mhDC, &pfd );
    SetPixelFormat( OpenGLManager::mhDC, format, &pfd );

    // create the render context (RC)
    OpenGLManager::mhRC = wglCreateContext( OpenGLManager::mhDC );

    // make it the current render context
    wglMakeCurrent( OpenGLManager::mhDC, OpenGLManager::mhRC );

}

    void OpenGLManager::purge()
    {
        if ( OpenGLManager::mhRC )
    {
    wglMakeCurrent( NULL, NULL );
    wglDeleteContext( OpenGLManager::mhRC );
    }
    if ( OpenGLManager::mhWnd && OpenGLManager::mhDC )
    {
        ReleaseDC( OpenGLManager::mhWnd, OpenGLManager::mhDC );
    }
    reset();
}



    void OpenGLManager::reset()
    {
         OpenGLManager::mhWnd = NULL;
         OpenGLManager::mhDC = NULL;
         OpenGLManager::mhRC = NULL;
    }

Я вижу, что метод ShowSomethingчасто вызывается с MessageBoxes, но я ничего не вижу на панели C #.(Извините за странные отступы!)

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Это не совсем ответ на ваш вопрос, но рассматривали ли вы возможность использования Tao Framework ?Они обеспечивают простое в использовании связывание с OpenGL, SDL и другими библиотеками.Я знаю, что он отлично работает и очень близок к функциям OpenGL в C ++, поэтому вы можете использовать его вместо переизобретения колеса.

0 голосов
/ 23 октября 2013

Похоже, вы забыли поменять свои буферы после вызова glFlush ().Используйте вызов функции ниже.

[DllImport("GDI32")]
public static extern void SwapBuffers(IntPtr dc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...