zoukankan      html  css  js  c++  java
  • Use OpenGL in CSharp Application

    Introduction

    This is a simple example about using OpenGL in CSharp application.

    The Workflow of Using OpenGL

    1. Create OpenGL with a specific area.
      1. Create a DIB (Device independent bitmap)
      2. Create OpenGL rendering context and set the device
      3. Make the OpenGL render context the current rendering context

      Note: When we create the OpenGL, we don’t need any device handle. We will create a device handle with DIB by ourselves. Then set the created handle to OpenGL. But the graphics on this device handle can't be shown, so we should copy the graphics to the view when we want to show the graphics of the DIB.

    2. Do some initialization for OpenGL.
    3. Draw graphics with OpenGL.
      1. Make the OpenGL rendering context the current rendering context.
      2. Draw graphics with OpenGL.
      3. Swap buffers.
      4. Copy image to the view of control.

      Note: In fact, we draw the graphics to the DIB. Then copy the graphics from the DIB to the specific view area.

    public OpenGLBox()
    {
        InitializeComponent();
    
        // 1.	Create OpenGL with a specific area.
        bool bRet = m_gl.Create(Width, Height);
        Debug.Assert(bRet == true);
    
        // 2.	Do some initialization for OpenGL.
        m_gl.ShadeModel(OpenGL.SMOOTH);
        m_gl.ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        m_gl.ClearDepth(1.0f);
        m_gl.Enable(OpenGL.DEPTH_TEST);
        m_gl.DepthFunc(OpenGL.LEQUAL);
        m_gl.Hint(OpenGL.PERSPECTIVE_CORRECTION_HINT, OpenGL.NICEST);
    }	
    protected override void OnPaint(PaintEventArgs e)
    {
        // 3.	Draw graphics with OpenGL.
    
        // 3.1	Make the OpenGL rendering context 
        // the current rendering context.
        m_gl.MakeCurrent();
    
        // 3.2	Draw graphics with OpenGL.
        if (OpenGLRender != null)
            OpenGLRender(this, e);
    
        // 3.3	Swap buffers.
        m_gl.SwapBuffers();
    
        //	3.4	Copy image to the view of control.
        e.Graphics.DrawImageUnscaled(m_gl.OpenGLBitmap, 0, 0);
    }	
    public virtual unsafe bool Create(int width, int height)
    {
        if (width == 0 || height == 0)
            return false;
    
        //	1.1 Create DIB –device independent bitmap.
        m_DIBSection.Create(width, height, 24);
    
        // 1.2 Create OpenGL rendering context and set the device.
        if (handleRenderContext == IntPtr.Zero)
            handleRenderContext = wglCreateContext(m_DIBSection.HDC);
        handleDeviceContext = m_DIBSection.HDC;
    
        //	1.3	Make the OpenGL render context the current rendering context.
        wglMakeCurrent(m_DIBSection.HDC, handleRenderContext);
                 
        return true;
    }
    
    public DIBSection()
    {
        //	Create a blank DC.
        // Get the device context of the display.
        IntPtr screenDC = GetDC(IntPtr.Zero);
     
        // Create a memory device context 
        // which is compatible to a specific device.
        hDC = CreateCompatibleDC(screenDC);
    }
    
    public virtual unsafe bool Create(int width, int height, uint bitCount)
    {
        this.width = width;
        this.height = height;
      
        // Destroy existing objects.
        Destroy();
    
        // Create a bitmap info structure.
        BITMAPINFO info = new BITMAPINFO();
    
        // Set the data.
        info.biSize = 40;
        info.biBitCount = (Int16)bitCount;
        info.biPlanes = 1;
        info.biWidth = width;
        info.biHeight = height;
     
        // Create the bitmap.
        IntPtr ppvBits;
        hBitmap = CreateDIBSection(hDC, info, DIB_RGB_COLORS,
        out ppvBits, IntPtr.Zero, 0);
    
        SelectObject(hDC, hBitmap);
      
        // Set the OpenGL pixel format.
        SetPixelFormat(bitCount);
    
        return true;
    }	
  • 相关阅读:
    Linux上安装Oracle 10g 装后感
    分享16个javascript&jQuery的MVC教程
    6个出色的基于JQuery的Tab选项卡实例
    8 个高可用的 jQuery 表单验证插件
    6 套多点触摸屏的手势图标集
    PHP V5.3 中的新特性,第 4 部分: 创建并使用 Phar 归档
    精选15个国外最流行的CSS框架
    PHP V5.3 中的新特性,第 1 部分: 对象接口的变化
    分享10个便利的HTML5/CSS3框架
    XAMPP下pear安装
  • 原文地址:https://www.cnblogs.com/bobzhangfw/p/2193339.html
Copyright © 2011-2022 走看看