C#中使用OpenGL(API)创建OpenGL渲染环境
在C#中調用1.1版本的OpenGL函數,但是光有OpenGL函數還不能繪制圖形,就像一個畫家,他即使擁有繪畫的技巧,還有畫筆和顏料,如果沒有畫布,他也沒有地方畫畫。有了畫布,畫家還需要畫板把畫布支起來才能畫。OpenGL渲染環境就類似于畫布和畫板,只有創建了渲染環境,使用OpenGL函數才會起作用。它不是OpenGL的一部分,而是隸屬于操作系統,所以不同的操作系統,創建OpenGL渲染環境的方法也不同。由于是在C#中使用OpenGL,所以本文將使用winAPI創建OpenGL渲染環境。
C# OpenGL接口源碼、C# OpenGL編程例子可在百度網盤下載:鏈接:https://pan.baidu.com/s/1dnIo1s-l6aqlE3IgaMJA5g?
提取碼:wc0x
一、選擇顯示窗口
顯示窗口就類似于畫家的畫板,它的作用就是支撐畫布,使得我們能夠看到畫布上的圖畫。在使用C/C++語言開發OpenGL程序,都需要自己創建顯示窗口,當然,glut、glfw等庫提供了在Windows系統中創建窗口的函數,這使得創建窗口變得很方便。然而,用C#語言開發OpenGL程序的時候,完全沒有必要自己創建顯示窗口,因為C#本身提供了大量可視控件,這些可視控件都有一個窗口,我們只需選擇一個控件作為顯示窗口即可。
上圖展現的是在文本框、圖片框和按鈕上繪制三角形。只要控件是可視的(像Timer這類控件是非可視控件),它都可以作為顯示窗口。只要你愿意,你可以把圖形繪制在窗體(Form)、圖片框(pictureBox)、標簽(Label)…甚至是文本框(TextBox)。本文選擇PictureBox控件作為顯示窗口。
二、用到的winAPI函數
創建OpenGL渲染環境需要用到五個windows API。
1.取得設備上下文(DC,Device Context)
HDC GetDC(HWND hWnd);
1
參數是窗口句柄,返回值是設備上下文句柄。
2.選擇像素格式
int ChoosePixelFormat(HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd);
1
第一個參數是設備上下文句柄,第二個參數是像素格式描述器(Pixel Format Descriptor),返回值是一個整型,如果成功則返回像素格式索引號,否則返回0;
其中,PIXELFORMATDESCRIPTOR類型是一個結構體,其C語言描述如下:
typedef struct tagPIXELFORMATDESCRIPTOR
{
? ? WORD ?nSize;//該結構體占用存儲空間的大小
? ? WORD ?nVersion;//版本號
? ? DWORD dwFlags;//格式屬性
? ? BYTE ?iPixelType;//顏色模式
? ? BYTE ?cColorBits;//顏色比特位數
? ? BYTE ?cRedBits;//紅色分量比特位數
? ? BYTE ?cRedShift;//紅色分量偏移量
? ? BYTE ?cGreenBits;//綠色分量比特位數
? ? BYTE ?cGreenShift;//綠色分量偏移量
? ? BYTE ?cBlueBits;//藍色分量比特位數
? ? BYTE ?cBlueShift;//藍色分量偏移量
? ? BYTE ?cAlphaBits;//alpha分量比特位數
? ? BYTE ?cAlphaShift;//alpha分量偏移量
? ? BYTE ?cAccumBits;//累積緩沖區一個像素占用比特位數
? ? BYTE ?cAccumRedBits;//累積緩沖區紅色分量的比特位數
? ? BYTE ?cAccumGreenBits;//累積緩沖區綠色分量的比特位數
? ? BYTE ?cAccumBlueBits;//累積緩沖區藍色分量的比特位數
? ? BYTE ?cAccumAlphaBits;//累積緩沖區alpha分量的比特位數
? ? BYTE ?cDepthBits;//深度緩沖區中一個像素占用的比特位數
? ? BYTE ?cStencilBits;//模板緩沖區中一個像素占用的比特位數
? ? BYTE ?cAuxBuffers;//輔助緩沖區
? ? BYTE ?iLayerType;//用于早期的OpenGL,現已忽略
? ? BYTE ?bReserved;//指定表層與底層的平面數目
? ? DWORD dwLayerMask;//用于早期的OpenGL,現已忽略
? ? DWORD dwVisibleMask;//指定一個底層平面的透明顏色或索引
? ? DWORD dwDamageMask;//用于早期的OpenGL,現已忽略
} PIXELFORMATDESCRIPTOR
3.設置像素格式
BOOL ?SetPixelFormat(HDC hdc,int format, CONST PIXELFORMATDESCRIPTOR * ppfd);
1
第一個參數是設備上下文句柄,通過GetDC獲得;第二個參數是像素格式索引號,通過ChoosePixelFormat獲得;第三個是像素格式描述器,需要用戶自行設置;如果設置成功則返回true,否則返回false。
4.創建OpenGL渲染上下文
HGLRC wglCreateContext( HDC hdc );
1
參數是設備上下文句柄(HDC),返回值是OpenGL渲染上下文句柄(HGLRC)。HGLRC與HDC具有一樣的像素格式。
5.指定OpenGL當前渲染上下文
BOOL wglMakeCurrent( HDC hdc, HGLRC hglrc);
1
第一個參數是設備上下文句柄,第二個參數是OpenGL渲染上下文句柄,如果成功則返回true,否則返回false。
三、C#語言聲明windows API
windows API都是用C語言寫的,在C#中調用winAPI需要先對這些外部函數進行聲明。
1.數據類型的變換
凡是句柄類型,在C#中都用IntPtr類型表示。如HWND類型、HDC類型、HGLRC類型都統一用IntPtr類型表示。對于PIXELFORMATDESCRIPTOR 類型,其C#版的結構體聲明如下:
? ? [StructLayout(LayoutKind.Sequential,Pack =1)]
? ? public struct PIXELFORMATDESCRIPTOR
? ? {
? ? ? ? public ushort nSize;
? ? ? ? public ushort nVersion;
? ? ? ? public uint dwFlags;
? ? ? ? public byte iPixelType;
? ? ? ? public byte cColorBits;
? ? ? ? public byte cRedBits;
? ? ? ? public byte cRedShift;
? ? ? ? public byte cGreenBits;
? ? ? ? public byte cGreenShift;
? ? ? ? public byte cBlueBits;
? ? ? ? public byte cBlueShift;
? ? ? ? public byte cAlphaBits;
? ? ? ? public byte cAlphaShift;
? ? ? ? public byte cAccumBits;
? ? ? ? public byte cAccumRedBits;
? ? ? ? public byte cAccumGreenBits;
? ? ? ? public byte cAccumBlueBits;
? ? ? ? public byte cAccumAlphaBits;
? ? ? ? public byte cDepthBits;
? ? ? ? public byte cStencilBits;
? ? ? ? public byte cAuxBuffers;
? ? ? ? public byte iLayerType;
? ? ? ? public byte bReserved;
? ? ? ? public uint dwLayerMask;
? ? ? ? public uint dwVisibleMask;
? ? ? ? public uint dwDamageMask;
? ? };
2.C#方法聲明
? ? ? ? [DllImport("user32.dll", ExactSpelling = false, EntryPoint = "GetDC", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern IntPtr GetDC(IntPtr hwnd);
? ? ? ??
? ? ? ? [DllImport("gdi32.dll", ExactSpelling = false, EntryPoint = "ChoosePixelFormat", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern int ChoosePixelFormat(IntPtr hdc, IntPtr ppfd);
? ? ? ??
? ? ? ? [DllImport("gdi32.dll", ExactSpelling = false, EntryPoint = "SetPixelFormat", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern bool SetPixelFormat(IntPtr hdc, int format, IntPtr ppfd);
? ? ? ??
? ? ? ? [DllImport("opengl32.dll", ExactSpelling = false, EntryPoint = "wglCreateContext", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern IntPtr wglCreateContext(IntPtr hdc);
? ? ? ??
? ? ? ? [DllImport("opengl32.dll", ExactSpelling = false, EntryPoint = "wglMakeCurrent", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern bool wglMakeCurrent(IntPtr hdc, IntPtr hglrc);
四、創建OpenGL渲染環境
下面通過C#代碼來說明如何創建OpenGL渲染環境。
要調用windows API需要先引用名稱空間:
using System.Runtime.InteropServices;
1
由于還會用到不安全代碼,所以還要在“項目->屬性”中勾選允許不安全代碼。
示例代碼:
? ? ? ? ? ? IntPtr hWnd=pictureBox1.Handle;//圖片框的窗口句柄
? ? ? ? ? ? IntPtr hdc =GetDC(hWnd);//取得設備上下文
? ? ? ? ? ? PIXELFORMATDESCRIPTOR pfd;//定義一個像素格式描述器
? ? ? ? ? ??
? ? ? ? ? ? //設置像素格式
? ? ? ? ? ? pfd.nSize = 40;
? ? ? ? ? ? pfd.nVersion = 1;
? ? ? ? ? ? pfd.dwFlags = PFD.PFD_DRAW_TO_WINDOW | PFD.PFD_SUPPORT_OPENGL | PFD.PFD_DOUBLEBUFFER;
? ? ? ? ? ? pfd.iPixelType = (byte)PFD.PFD_TYPE_RGBA;
? ? ? ? ? ? pfd.cColorBits = 32;
? ? ? ? ? ? pfd.cRedBits = 0;
? ? ? ? ? ? pfd.cRedShift = 0;
? ? ? ? ? ? pfd.cGreenBits = 0;
? ? ? ? ? ? pfd.cGreenShift = 0;
? ? ? ? ? ? pfd.cBlueBits = 0;
? ? ? ? ? ? pfd.cBlueShift = 0;
? ? ? ? ? ? pfd.cAlphaBits = 0;
? ? ? ? ? ? pfd.cAlphaShift = 0;
? ? ? ? ? ? pfd.cAccumBits = 0;
? ? ? ? ? ? pfd.cAccumRedBits = 0;
? ? ? ? ? ? pfd.cAccumGreenBits = 0;
? ? ? ? ? ? pfd.cAccumBlueBits = 0;
? ? ? ? ? ? pfd.cAccumAlphaBits = 0;
? ? ? ? ? ? pfd.cDepthBits = 16;
? ? ? ? ? ? pfd.cStencilBits = 0;
? ? ? ? ? ? pfd.cAuxBuffers = 0;
? ? ? ? ? ? pfd.iLayerType = (byte)PFD.PFD_MAIN_PLANE;
? ? ? ? ? ? pfd.bReserved = 0;
? ? ? ? ? ? pfd.dwLayerMask = 0;
? ? ? ? ? ? pfd.dwVisibleMask = 0;
? ? ? ? ? ? pfd.dwDamageMask = 0;
? ? ? ? ? ? int pixelFormat;
? ??
? ? ? ? ? ? unsafe
? ? ? ? ? ? {
? ? ? ? ? ? ? ? PIXELFORMATDESCRIPTOR* ppfd=&pfd;
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? pixelFormat =ChoosePixelFormat(hdc,(IntPtr)ppfd);//選擇像素格式
? ? ? ? ? ? ? ?SetPixelFormat(hdc, pixelFormat, (IntPtr)ppfd);//設置像素格式
? ? ? ? ? ? ? ? IntPtr hglrc;
? ? ? ? ? ? ? ? hglrc =wglCreateContext(hdc);//建立OpenGL渲染上下文
? ? ? ? ? ? ? ?wglMakeCurrent(hdc, hglrc);//激活當前渲染上下文
? ? ? ? ? ? }
通過以上一小段代碼,OpenGL渲染環境的搭建就完成了。為驗證正確性,做了一個實驗,該實驗是在pictureBox上繪制圖形,結果如下圖:
結語
之前的一些文章已經探討過OpenGL常量、1.1版本的OpenGL,還有參數傳遞問題。本文著重介紹了如何在C#中創建OpenGL渲染環境,到目前為止,已經可以利用1.1版本的OpenGL進行圖形繪制。下一步是探討如何在C#中調用高版本的OpenGL。欲知道更詳細的操作,可以瀏覽我的源碼。
————————————————
版權聲明:本文為CSDN博主「shifenglv」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_28249373/article/details/78835336
之前的文章介紹了如何在C#中調用1.1版本的OpenGL函數,但是光有OpenGL函數還不能繪制圖形,就像一個畫家,他即使擁有繪畫的技巧,還有畫筆和顏料,如果沒有畫布,他也沒有地方畫畫。有了畫布,畫家還需要畫板把畫布支起來才能畫。OpenGL渲染環境就類似于畫布和畫板,只有創建了渲染環境,使用OpenGL函數才會起作用。它不是OpenGL的一部分,而是隸屬于操作系統,所以不同的操作系統,創建OpenGL渲染環境的方法也不同。由于是在C#中使用OpenGL,所以本文將使用winAPI創建OpenGL渲染環境。
C# OpenGL接口源碼、C# OpenGL編程例子可在百度網盤下載:鏈接:https://pan.baidu.com/s/1dnIo1s-l6aqlE3IgaMJA5g?
提取碼:wc0x
一、選擇顯示窗口
顯示窗口就類似于畫家的畫板,它的作用就是支撐畫布,使得我們能夠看到畫布上的圖畫。在使用C/C++語言開發OpenGL程序,都需要自己創建顯示窗口,當然,glut、glfw等庫提供了在Windows系統中創建窗口的函數,這使得創建窗口變得很方便。然而,用C#語言開發OpenGL程序的時候,完全沒有必要自己創建顯示窗口,因為C#本身提供了大量可視控件,這些可視控件都有一個窗口,我們只需選擇一個控件作為顯示窗口即可。
上圖展現的是在文本框、圖片框和按鈕上繪制三角形。只要控件是可視的(像Timer這類控件是非可視控件),它都可以作為顯示窗口。只要你愿意,你可以把圖形繪制在窗體(Form)、圖片框(pictureBox)、標簽(Label)…甚至是文本框(TextBox)。本文選擇PictureBox控件作為顯示窗口。
二、用到的winAPI函數
創建OpenGL渲染環境需要用到五個windows API。
1.取得設備上下文(DC,Device Context)
HDC GetDC(HWND hWnd);
1
參數是窗口句柄,返回值是設備上下文句柄。
2.選擇像素格式
int ChoosePixelFormat(HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd);
1
第一個參數是設備上下文句柄,第二個參數是像素格式描述器(Pixel Format Descriptor),返回值是一個整型,如果成功則返回像素格式索引號,否則返回0;
其中,PIXELFORMATDESCRIPTOR類型是一個結構體,其C語言描述如下:
typedef struct tagPIXELFORMATDESCRIPTOR
{
? ? WORD ?nSize;//該結構體占用存儲空間的大小
? ? WORD ?nVersion;//版本號
? ? DWORD dwFlags;//格式屬性
? ? BYTE ?iPixelType;//顏色模式
? ? BYTE ?cColorBits;//顏色比特位數
? ? BYTE ?cRedBits;//紅色分量比特位數
? ? BYTE ?cRedShift;//紅色分量偏移量
? ? BYTE ?cGreenBits;//綠色分量比特位數
? ? BYTE ?cGreenShift;//綠色分量偏移量
? ? BYTE ?cBlueBits;//藍色分量比特位數
? ? BYTE ?cBlueShift;//藍色分量偏移量
? ? BYTE ?cAlphaBits;//alpha分量比特位數
? ? BYTE ?cAlphaShift;//alpha分量偏移量
? ? BYTE ?cAccumBits;//累積緩沖區一個像素占用比特位數
? ? BYTE ?cAccumRedBits;//累積緩沖區紅色分量的比特位數
? ? BYTE ?cAccumGreenBits;//累積緩沖區綠色分量的比特位數
? ? BYTE ?cAccumBlueBits;//累積緩沖區藍色分量的比特位數
? ? BYTE ?cAccumAlphaBits;//累積緩沖區alpha分量的比特位數
? ? BYTE ?cDepthBits;//深度緩沖區中一個像素占用的比特位數
? ? BYTE ?cStencilBits;//模板緩沖區中一個像素占用的比特位數
? ? BYTE ?cAuxBuffers;//輔助緩沖區
? ? BYTE ?iLayerType;//用于早期的OpenGL,現已忽略
? ? BYTE ?bReserved;//指定表層與底層的平面數目
? ? DWORD dwLayerMask;//用于早期的OpenGL,現已忽略
? ? DWORD dwVisibleMask;//指定一個底層平面的透明顏色或索引
? ? DWORD dwDamageMask;//用于早期的OpenGL,現已忽略
} PIXELFORMATDESCRIPTOR
3.設置像素格式
BOOL ?SetPixelFormat(HDC hdc,int format, CONST PIXELFORMATDESCRIPTOR * ppfd);
1
第一個參數是設備上下文句柄,通過GetDC獲得;第二個參數是像素格式索引號,通過ChoosePixelFormat獲得;第三個是像素格式描述器,需要用戶自行設置;如果設置成功則返回true,否則返回false。
4.創建OpenGL渲染上下文
HGLRC wglCreateContext( HDC hdc );
1
參數是設備上下文句柄(HDC),返回值是OpenGL渲染上下文句柄(HGLRC)。HGLRC與HDC具有一樣的像素格式。
5.指定OpenGL當前渲染上下文
BOOL wglMakeCurrent( HDC hdc, HGLRC hglrc);
1
第一個參數是設備上下文句柄,第二個參數是OpenGL渲染上下文句柄,如果成功則返回true,否則返回false。
三、C#語言聲明windows API
windows API都是用C語言寫的,在C#中調用winAPI需要先對這些外部函數進行聲明。
1.數據類型的變換
凡是句柄類型,在C#中都用IntPtr類型表示。如HWND類型、HDC類型、HGLRC類型都統一用IntPtr類型表示。對于PIXELFORMATDESCRIPTOR 類型,其C#版的結構體聲明如下:
? ? [StructLayout(LayoutKind.Sequential,Pack =1)]
? ? public struct PIXELFORMATDESCRIPTOR
? ? {
? ? ? ? public ushort nSize;
? ? ? ? public ushort nVersion;
? ? ? ? public uint dwFlags;
? ? ? ? public byte iPixelType;
? ? ? ? public byte cColorBits;
? ? ? ? public byte cRedBits;
? ? ? ? public byte cRedShift;
? ? ? ? public byte cGreenBits;
? ? ? ? public byte cGreenShift;
? ? ? ? public byte cBlueBits;
? ? ? ? public byte cBlueShift;
? ? ? ? public byte cAlphaBits;
? ? ? ? public byte cAlphaShift;
? ? ? ? public byte cAccumBits;
? ? ? ? public byte cAccumRedBits;
? ? ? ? public byte cAccumGreenBits;
? ? ? ? public byte cAccumBlueBits;
? ? ? ? public byte cAccumAlphaBits;
? ? ? ? public byte cDepthBits;
? ? ? ? public byte cStencilBits;
? ? ? ? public byte cAuxBuffers;
? ? ? ? public byte iLayerType;
? ? ? ? public byte bReserved;
? ? ? ? public uint dwLayerMask;
? ? ? ? public uint dwVisibleMask;
? ? ? ? public uint dwDamageMask;
? ? };
2.C#方法聲明
? ? ? ? [DllImport("user32.dll", ExactSpelling = false, EntryPoint = "GetDC", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern IntPtr GetDC(IntPtr hwnd);
? ? ? ??
? ? ? ? [DllImport("gdi32.dll", ExactSpelling = false, EntryPoint = "ChoosePixelFormat", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern int ChoosePixelFormat(IntPtr hdc, IntPtr ppfd);
? ? ? ??
? ? ? ? [DllImport("gdi32.dll", ExactSpelling = false, EntryPoint = "SetPixelFormat", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern bool SetPixelFormat(IntPtr hdc, int format, IntPtr ppfd);
? ? ? ??
? ? ? ? [DllImport("opengl32.dll", ExactSpelling = false, EntryPoint = "wglCreateContext", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern IntPtr wglCreateContext(IntPtr hdc);
? ? ? ??
? ? ? ? [DllImport("opengl32.dll", ExactSpelling = false, EntryPoint = "wglMakeCurrent", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
? ? ? ? internal static extern bool wglMakeCurrent(IntPtr hdc, IntPtr hglrc);
四、創建OpenGL渲染環境
下面通過C#代碼來說明如何創建OpenGL渲染環境。
要調用windows API需要先引用名稱空間:
using System.Runtime.InteropServices;
1
由于還會用到不安全代碼,所以還要在“項目->屬性”中勾選允許不安全代碼。
示例代碼:
? ? ? ? ? ? IntPtr hWnd=pictureBox1.Handle;//圖片框的窗口句柄
? ? ? ? ? ? IntPtr hdc =GetDC(hWnd);//取得設備上下文
? ? ? ? ? ? PIXELFORMATDESCRIPTOR pfd;//定義一個像素格式描述器
? ? ? ? ? ??
? ? ? ? ? ? //設置像素格式
? ? ? ? ? ? pfd.nSize = 40;
? ? ? ? ? ? pfd.nVersion = 1;
? ? ? ? ? ? pfd.dwFlags = PFD.PFD_DRAW_TO_WINDOW | PFD.PFD_SUPPORT_OPENGL | PFD.PFD_DOUBLEBUFFER;
? ? ? ? ? ? pfd.iPixelType = (byte)PFD.PFD_TYPE_RGBA;
? ? ? ? ? ? pfd.cColorBits = 32;
? ? ? ? ? ? pfd.cRedBits = 0;
? ? ? ? ? ? pfd.cRedShift = 0;
? ? ? ? ? ? pfd.cGreenBits = 0;
? ? ? ? ? ? pfd.cGreenShift = 0;
? ? ? ? ? ? pfd.cBlueBits = 0;
? ? ? ? ? ? pfd.cBlueShift = 0;
? ? ? ? ? ? pfd.cAlphaBits = 0;
? ? ? ? ? ? pfd.cAlphaShift = 0;
? ? ? ? ? ? pfd.cAccumBits = 0;
? ? ? ? ? ? pfd.cAccumRedBits = 0;
? ? ? ? ? ? pfd.cAccumGreenBits = 0;
? ? ? ? ? ? pfd.cAccumBlueBits = 0;
? ? ? ? ? ? pfd.cAccumAlphaBits = 0;
? ? ? ? ? ? pfd.cDepthBits = 16;
? ? ? ? ? ? pfd.cStencilBits = 0;
? ? ? ? ? ? pfd.cAuxBuffers = 0;
? ? ? ? ? ? pfd.iLayerType = (byte)PFD.PFD_MAIN_PLANE;
? ? ? ? ? ? pfd.bReserved = 0;
? ? ? ? ? ? pfd.dwLayerMask = 0;
? ? ? ? ? ? pfd.dwVisibleMask = 0;
? ? ? ? ? ? pfd.dwDamageMask = 0;
? ? ? ? ? ? int pixelFormat;
? ??
? ? ? ? ? ? unsafe
? ? ? ? ? ? {
? ? ? ? ? ? ? ? PIXELFORMATDESCRIPTOR* ppfd=&pfd;
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? pixelFormat =ChoosePixelFormat(hdc,(IntPtr)ppfd);//選擇像素格式
? ? ? ? ? ? ? ?SetPixelFormat(hdc, pixelFormat, (IntPtr)ppfd);//設置像素格式
? ? ? ? ? ? ? ? IntPtr hglrc;
? ? ? ? ? ? ? ? hglrc =wglCreateContext(hdc);//建立OpenGL渲染上下文
? ? ? ? ? ? ? ?wglMakeCurrent(hdc, hglrc);//激活當前渲染上下文
? ? ? ? ? ? }
?
總結
以上是生活随笔為你收集整理的C#中使用OpenGL(API)创建OpenGL渲染环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决:mysql 连接报错 Authen
- 下一篇: 查看 linux 硬件信息:内存、分区、