我正在查看VC++ 6.00程序的源代码.我需要将此源转换为C#但我无法理解此示例中的(void*)是什么?
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGBA8,
IMAGE_WIDTH,
IMAGE_HEIGHT,
0,
PIXEL_FORMAT,
GL_UNSIGNED_BYTE,
(void*)imageData
);
Run Code Online (Sandbox Code Playgroud)
在此代码中,imagedata是一个指针字节*imageData
Sam*_*ell 19
通常,void*将转换为IntPtrC#代码.
使用更多信息进行编辑:IntPtr在.NET/C#中,通常表现得像一个不透明的句柄.你不能直接取消引用它,从它获取"大小"信息(例如你指向的数组的大小),它不会试图告诉你它指向的数据类型 - 或者即使它是指针.当你将C/C++代码翻译成C#并且你看void*,C#代码应该被编写,IntPtr直到你更清楚你正在处理什么.
pinvoke.net网站有两个条目glTexImage2D,具体取决于图像数据的存储位置.如果图像数据存储在byte[].NET/C#中的托管中,则调用通过的版本byte[].如果图像数据存储在非托管内存中,并且只有IntPtrC#代码中的数据,则调用通过的版本IntPtr.
[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
uint target,
int level,
int internalformat,
int width,
int height,
int border,
uint format,
uint type,
byte[] pixels);
[DllImport(LIBRARY_OPENGL)] protected static extern void glTexImage2D (
uint target,
int level,
int internalformat,
int width,
int height,
int border,
uint format,
uint type,
IntPtr pixels);
Run Code Online (Sandbox Code Playgroud)
它最典型的是IntPtr在C#中.
以下是如何从C#调用此函数的示例:
Bitmap bitmap = new Bitmap("blah");
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, 4, bitmap.Width, bitmap.Height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, bitmap.Scan0);
if(bitmap != null) {
bitmap.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.gamedev.net/topic/193827-how-to-use-glglteximage2d--using-csgl-library-in-c/
如果您拥有的是byte[]包含有效图像的图像,则可以将其加载到位图中:
public static Bitmap BytesToBitmap(byte[] byteArray)
{
using (MemoryStream ms = new MemoryStream(byteArray))
{
Bitmap img = (Bitmap)Image.FromStream(ms);
return img;
}
}
Run Code Online (Sandbox Code Playgroud)
如果给你的麻烦,或者你的数据不是东西,在Win32库可以处理,你可以使用元帅给你一个IntPtr从byte[]直接.
IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);
// Call your function here, passing unmanagedPointer to it
Marshal.FreeHGlobal(unmanagedPointer);
Run Code Online (Sandbox Code Playgroud)
它正在转换imageData为类型(void*),所以基本上告诉编译器获取这个值并将其视为一个(void*)
根据我的经验,void*是一个指向非特定类型的指针。
至于将示例转换为 C#,那么您实际上不必太担心 C++ 中的内容如何转换。只需确保将正确的类型传递给相应的 C# 函数即可。
| 归档时间: |
|
| 查看次数: |
15655 次 |
| 最近记录: |