protected virtual void InitializeGL() { m_uint_HWND = (uint)p.Handle.ToInt32(); m_uint_DC = WGL.GetDC(m_uint_HWND); // Not doing the following WGL.wglSwapBuffers() on the DC will // result in a failure to subsequently create the RC. WGL.wglSwapBuffers(m_uint_DC); WGL.PIXELFORMATDESCRIPTOR pfd = new WGL.PIXELFORMATDESCRIPTOR(); WGL.ZeroPixelDescriptor(ref pfd); pfd.nVersion = 1; pfd.dwFlags = (WGL.PFD_DRAW_TO_WINDOW | WGL.PFD_SUPPORT_OPENGL | WGL.PFD_DOUBLEBUFFER); pfd.iPixelType = (byte)(WGL.PFD_TYPE_RGBA); pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = (byte)(WGL.PFD_MAIN_PLANE); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //for Stencil support pfd.cStencilBits = 32; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! int pixelFormatIndex = 0; pixelFormatIndex = WGL.ChoosePixelFormat(m_uint_DC, ref pfd); if (pixelFormatIndex == 0) { MessageBox.Show("Unable to retrieve pixel format"); return; } if (WGL.SetPixelFormat(m_uint_DC, pixelFormatIndex, ref pfd) == 0) { MessageBox.Show("Unable to set pixel format"); return; } //Create rendering context m_uint_RC = WGL.wglCreateContext(m_uint_DC); if (m_uint_RC == 0) { MessageBox.Show("Unable to get rendering context"); return; } if (WGL.wglMakeCurrent(m_uint_DC, m_uint_RC) == 0) { MessageBox.Show("Unable to make rendering context current"); return; } initRenderingGL(); }
/// <summary> /// Event handler called when the form is loaded. It retrieves the controls /// window handle and device context and creates the rendering context. /// </summary> protected virtual void InitializeGL(object sender, EventArgs e) { m_uint_HWND = (uint)this.Handle.ToInt32(); m_uint_DC = WGL.GetDC(m_uint_HWND); // CAUTION: Not doing the following WGL.wglSwapBuffers() on the DC will // result in a failure to subsequently create the RC. WGL.wglSwapBuffers(m_uint_DC); //Get the pixel format WGL.PIXELFORMATDESCRIPTOR pfd = new WGL.PIXELFORMATDESCRIPTOR(); WGL.ZeroPixelDescriptor(ref pfd); pfd.nVersion = 1; pfd.dwFlags = (WGL.PFD_DRAW_TO_WINDOW | WGL.PFD_SUPPORT_OPENGL | WGL.PFD_DOUBLEBUFFER); pfd.iPixelType = (byte)(WGL.PFD_TYPE_RGBA); pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = (byte)(WGL.PFD_MAIN_PLANE); int pixelFormatIndex = 0; pixelFormatIndex = WGL.ChoosePixelFormat(m_uint_DC, ref pfd); if (pixelFormatIndex == 0) { MessageBox.Show("Unable to retrieve pixel format"); return; } if (WGL.SetPixelFormat(m_uint_DC, pixelFormatIndex, ref pfd) == 0) { MessageBox.Show("Unable to set pixel format"); return; } //Create rendering context m_uint_RC = WGL.wglCreateContext(m_uint_DC); if (m_uint_RC == 0) { MessageBox.Show("Unable to get rendering context"); return; } if (WGL.wglMakeCurrent(m_uint_DC, m_uint_RC) == 0) { MessageBox.Show("Unable to make rendering context current"); return; } //Set up OpenGL related characteristics ResizeGL(null, null); GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GL.glEnable(GL.GL_DEPTH_TEST); GL.glDepthFunc(GL.GL_LEQUAL); //GL.glEnable(GL.GL_CULL_FACE); GL.glCullFace(GL.GL_BACK); }
// ############################################################################ // ############################################################################ // ############################################################################ // ############################################################################ // ============================================================================ // The following can be used as an example of how to initialize OpenGL // rendering. A System.Windows.Forms object can use a window handle acquired // from (uint)((this.Handle).ToInt32()) as the "HWND" parameter. // // Here is a crude illustration of the use of WGL.DemoInitOpenGL() by a Form: // // // ---------------------------------------------------------------------- // public static uint m_uint_HWND = 0; // public static uint m_uint_DC = 0; // public static uint m_uint_RC = 0; // // protected override void OnPaintBackground( PaintEventArgs e ) // { // // This overrides the System.Windows.Forms.Control protected method // // "OnPaintBackground()" so that we don't clear the client area of // // this form window -- so the OpenGL doesn't flicker on each frame. // } // // protected override void OnPaint( System.Windows.Forms.PaintEventArgs e ) // { // if (0 == m_uint_RC) // { // m_uint_HWND = (uint)((this.Handle).ToInt32()); // WGL.DemoInitOpenGL( m_uint_HWND, ref m_uint_DC, ref m_uint_RC ); // } // if (0 != m_uint_RC) // { // WGL.DemoOpenGLDraw( this.Size.Width, this.Size.Height, m_uint_DC ); // } // System.Threading.Thread.Sleep( 10 ); // 10 msec --> 100 frames per second, max. // Invalidate(false); // Force OnPaint() to get called again. // } // // ---------------------------------------------------------------------- // // ============================================================================ public static void DemoInitOpenGL ( uint uint_HWND, // in ref uint ref_uint_DC, // out ref uint ref_uint_RC // out ) { ref_uint_DC = WGL.GetDC(uint_HWND); // CAUTION: Not doing the following WGL.wglSwapBuffers() on the DC will // result in a failure to subsequently create the RC. WGL.wglSwapBuffers(ref_uint_DC); WGL.DemoCreateRenderingContext(ref ref_uint_DC, ref ref_uint_RC); if (0 == ref_uint_RC) { WGL.MessageBox(0, "Failed to create OpenGL Rendering Context (RC)", "WGL.DemoInitOpenGL() : ERROR", MB_OK); return; } }