日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中使用OpenGL(API)创建OpenGL渲染环境

發布時間:2023/12/18 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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渲染环境的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产酒店自拍 | 国产精品国产三级国产传播 | 女人扒开屁股让我添 | 日韩av一区二区在线 | 国产娇小hdxxxx乱 | 五月天婷婷激情网 | 91av视频在线观看 | 美味的客房沙龙服务 | 一级aa毛片 | 久久高清国产 | 中文字幕在线高清 | 黑人玩弄人妻一区二区三区四 | 亚洲av女人18毛片水真多 | 日日摸夜夜添夜夜 | 无码人妻一区二区三区在线视频 | 五月精品| 亚洲1区 | 亚洲女人网| 野花视频免费在线观看 | 女同性做爰三级 | 黄色大片91 | 亚洲视频一区二区三区 | 青青青手机视频 | 亚洲欧洲精品成人久久奇米网 | 日日噜噜夜夜狠狠久久波多野 | 好吊色综合 | 少妇熟女一区二区 | av一级大片 | 日韩精品一区二区三区免费视频 | 妖精视频一区二区 | 直接看的毛片 | 国产毛片在线 | 直接看毛片 | 欧美性猛交aaaa片黑人 | 国产调教视频 | 欧美亚洲第一页 | 国产一区二区三区色淫影院 | 在线视频一二区 | 蜜桃av在线播放 | 午夜精品一区二区三区三上悠亚 | 最新av导航| 成人免费观看av | 国产精品夜夜 | 欧美放荡性医生videos | 男人狂揉女人下部视频 | 熟妇人妻无乱码中文字幕真矢织江 | 久草福利在线视频 | 久久人妻少妇嫩草av蜜桃 | 欧美久久久久久久久久久久久久 | 欧美亚洲图片小说 | 日本三级视频在线播放 | 久久福利一区 | 91精品视频在线看 | 亚洲自拍中文 | 五月婷婷丁香网 | 黄网站在线免费看 | 黄色一级片毛片 | 日韩视频中文字幕在线观看 | 国产女人18水真多18精品一级做 | 国产女人被狂躁到高潮小说 | 亚洲精品乱码久久久久久蜜桃麻豆 | 成年视频在线观看 | 有码av在线 | 国产男男一区二区三区 | 波多野结衣精品视频 | 久久久久久久一区二区三区 | 九九九视频在线观看 | 久久波多野结衣 | 久久国色 | 日本高清有码视频 | 日韩国产免费 | 日本一区二区三区视频免费看 | 最近中文字幕mv免费高清在线 | 国产肉体xxxx裸体784大胆 | 夫妻精品| 18被视频免费观看视频 | 国产午夜片 | 在线观看三级视频 | 久久久高清免费视频 | 国产电影一区二区三区 | 中文字幕免费在线看线人动作大片 | 97久久人人超碰caoprom欧美 | 女生被男生c | 老师用丝袜脚帮我脚交 | 亚洲毛片在线免费观看 | 爱乃なみ加勒比在线播放 | 香蕉av在线播放 | av午夜精品| 成人av影院在线观看 | 国产精品无码毛片 | 日韩一区视频在线 | 国产一区二区免费在线观看 | 国模无码大尺度一区二区三区 | www国产在线 | www.成人精品| 生活片毛片 | 婷婷丁香亚洲 | 天堂俺去俺来也www久久婷婷 | 日本黄a三级三级三级 |