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;
    }	
  • 相关阅读:
    给你一个网站你是如何来渗透测试的
    web漏洞扫描工具集合
    成都Uber优步司机奖励政策(3月16日)
    北京Uber优步司机奖励政策(3月16日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月16日)
    成都Uber优步司机奖励政策(3月15日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月15日)
    北京Uber优步司机奖励政策(3月15日)
    优步UBER司机全国各地奖励政策汇总 (3月14日-3月20日)
    成都Uber优步司机奖励政策(3月14日)
  • 原文地址:https://www.cnblogs.com/bobzhangfw/p/2193339.html
Copyright © 2011-2022 走看看