Tag: opengl

使用C#截取任何外部应用程序

我们有一个C#(WPF)应用程序,我们想在其中截取我们发布的任意应用程序的截图(即我们引用了我们开始的流程)。 应用程序可以最小化或在其他窗口后面,但我们仍然只想要单个应用程序的图像,而不是重叠的像素。 我知道使用BitBlt或PrintWindow的典型P / Invoke解决方案大部分时间都可以工作,但是当处理直接绘制到图形设备的DirectX或OpenGL应用程序时,这些解决方案会失败(我只会得到黑/透明像素)。 我发现这篇文章是关于从C#截取Direct3D应用程序的截图,所以我想我已经涵盖了这个案例。 所以我的问题是: 我如何为OpenGL应用程序执行此操作? 确定适当使用方法(PW / DX / GL)的最简单方法是什么? 有没有一种通用的方法来做到这一点? 对于#2,我是否会降级检查可执行文件加载的模块,看看是否加载了DirectX或OpenGL DLL / Assembly? 这只需要在Windows XP上运行(不是跨平台,如果有的话,不会很快转到Vista / 7)。

使用OpenGL-Control的WPF MVVM WinformsHost

我正在使用MVVM开发WPF应用程序。 在这个应用程序中,我需要一个OpenGL控件(我正在使用OpenTK)。 目前在WPF中获取OpenGL的唯一有用方法是使用WindowsFormsHost。 直到这里,没有问题。 要向我的场景添加内容,我需要在我的视图中访问OpenGL-Control。 当然,我想在ViewModel中添加和编辑内容。 那么,如何在不违反MVVM模式的情况下访问OpenGL-Control? 我正在使用一个可以在View中初始化的场景对象,然后需要以某种方式转移到ViewModel。 我尝试使用WindowsFormsHost的Tag-property但没有成功(比较如下)。 ViewModel中的属性未更新。 有任何想法吗? XAML C# public FancyOpenGlControl() { this.InitializeComponent(); this.glControl = new OpenGLControl(); this.glControl.Dock = DockStyle.Fill; this.WindowsFormsHost.Child = this.glControl; this.glControl.HandleCreated += this.GlControlOnHandleCreated; } private void GlControlOnHandleCreated(object sender, EventArgs eventArgs) { this.WindowsFormsHost.Tag = new Scene(this.glControl); // Doesn’t work. //BindingExpression bindingExpression = this.WindowsFormsHost.GetBindingExpression(TagProperty); //if (bindingExpression != null) //{ // […]

创建和使用我自己的纹理图集的mipmap

我目前正在使用自动mipmap生成(C#+ OpenTK): GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); 我正在使用的纹理平铺成16px²的块。 所以我的问题是: 是否可以使用不会缩小到1×1的mipmap? 创建一个不会将块“模糊”到另一个块的mipmap的最佳方法是什么?

精灵/纹理图集:使用OpenTK进行颜色键的GDI + Bitmap.MakeTransparent

我正在编写一个sprite / texture atlasfunction的支持类,使用C#和OpenTK。 到目前为止,大多数function都正常工作(正交视图上的简单2D图块)。 我的问题涉及调用GDI + Bitmap.MakeTransparent()方法设置颜色(品红色/ 0xFFFF00FF)用作颜色键时的意外显示结果。 看起来我对bitmap.LockBits()和GL.TexImage2D()调用使用了不正确的像素格式参数。 我的代码基于确实有效的示例,但共同的是传递给LockBits()的矩形用于整个图像。 与此过程相关的调用是: Bitmap bitmap = new Bitmap(filename); bitmap.MakeTransparent(Color.Magenta); GL.GenTextures(1, out texture_id); GL.BindTexture(TextureTarget.Texture2D, texture_id); // “rect” is initialized for one of: // – the dimensions of the entire image // (0, 0, bitmap.width, bitmap.height) // – the dimensions for a sub-rectangle within the image (for one […]

设置着色器的矩阵

我想绘制实例立方体。 我可以调用GL.DrawArraysInstanced(PrimitiveType.Triangles, 0, 36, 2); 成功。 我的问题是所有的立方体都是在相同的位置和相同的旋转绘制的。 我怎样才能为每个立方体单独更改? 要创建不同的位置等,我需要每个立方体的矩阵,对吧? 我创造了这个: Matrix4[] Matrices = new Matrix4[]{ Matrix4.Identity, //do nothing Matrix4.Identity * Matrix4.CreateTranslation(1,0,0) //move a little bit }; GL.BindBuffer(BufferTarget.ArrayBuffer, matrixBuffer); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * 16 * Matrices.Length), Matrices, BufferUsageHint.StaticDraw); 这应该创建一个缓冲区,我可以存储我的矩阵。 matrixBuffer是指向我缓冲区的指针。 我不确定大小是否正确,我采用浮动* 4(对于Vector4)* 4(对于4个向量)*数组大小。 绘制循环: GL.BindBuffer(BufferTarget.ArrayBuffer, matrixBuffer); GL.VertexAttribPointer(3, 4, VertexAttribPointerType.Float, false, 0, 0); //GL.VertexAttribDivisor(3, ?); GL.EnableVertexAttribArray(3); GL.DrawArraysInstanced(PrimitiveType.Triangles, 0, […]

有没有想知道什么时候屏幕更新/刷新(OpenGL或DirectX可能?)

我目前有一个用c#编写的应用程序(使用.NET),要求我在用户在屏幕上看到图像时立即启动计时器,直到他们用按键响应。 现在我意识到,考虑到监视器输入滞后和响应时间,键盘物理发送消息所需的时间,处理它的操作系统等,实际上这非常困难。 但我正在尽我所能将其降低到大部分是一个恒定的错误(响应时间结果将用于比较一个用户与下一个用户,因此常量错误不是真正的问题)。 然而,令人烦恼的障碍是由监视器刷新率引起的变量,正如我在调用和完成onPaint消息时收集的那样,这并不意味着图像实际上已经被处理并从图形缓冲区发送了? 不幸的是,时间限制和其他承诺实际上会限制我在c#for Windows中继续执行此任务。 所以我想知道的是,如果可以在屏幕更新时使用OpenGL或DirectX来创建事件,那么在OpenGL或DirectX中处理所有绘图还是更好? 之前给我的另一个建议是关于V-Sync,如果我关闭它是一旦它被绘制后发送的图像? 而不是以与显示器刷新率同步的设定速率发送图像?

VBO在C#中使用交错顶点

我正在尝试使用VBO使用OpenTK在C#中绘制我的模型。 在我的在线研究中,我在许多地方读过,优先考虑使交错数据结构的大小为32字节的精确倍数,因此我编写了以下代码: [Serializable] [StructLayout(LayoutKind.Sequential)] public struct Byte4 { public byte R, G, B, A; public Byte4(byte[] input) { R = input[0]; G = input[1]; B = input[2]; A = input[3]; } public uint ToUInt32() { byte[] temp = new byte[] { this.R, this.G, this.B, this.A }; return BitConverter.ToUInt32(temp, 0); } } [Serializable] [StructLayout(LayoutKind.Sequential)] public struct […]

使用OpenGL时,C ++优于C#有什么优势

我开始对OpenGL感兴趣了,我试图找出在学习过程中使用哪种语言的最佳方向。 我已经非常熟悉C#,从我读过的内容中,我可以利用Tao API与C#代码中的OpenGL接口。 但是,在我看来,在我看来,那些真正专业的OpenGL开发人员也是C ++程序员。 我很好奇在使用OpenGL中的3D图形时,C ++可能比C#有什么优势。 任何输入都会很棒,因为我完全不知所措。

C#:创建图形屏幕保护程序

我正在考虑创建一个屏幕保护程序。 我有完整的东西,它的图形和后端类型已经准备好了。 但我不太确定如何在代码中获取图形。 我想要的是带有一点运动的图像的幻灯片放映(有点像媒体中心的幻灯片放映)以及顶部的一些浮动文本和形状。 形状有些半透明。 我目前在WinForms中制作了一个非常简单的静态幻灯片。 只是一个简单的应用程序,全屏显示一些图像,并假装以一种hackish方式淡入淡出。 但它制作得不是很好,性能也不是很好。 例如,为了防止延迟,我在图像顶部淡入黑色方块,而不是在实际图像中淡入淡出。 也许愚蠢,但它有点工作:p 无论如何,我想做得更好。 但不知道从哪里开始。 WPF是一个很好的解决方案吗? 或者我应该研究DirectX或OpenGL? 这是可以用XNA很好地处理的东西,还是那个游戏太棒了?

WinForms中的C#中的OpenGL

我必须编写一个简单的程序,使用OpenGL和C#在Windows窗体应用程序中绘制内容? 你能给我一些图书馆和/或教程的例子吗? 我发现了这个: http : //sourceforge.net/projects/csgl/files/CsGL/1.4.1/但它是从2002年开始的。有什么新的吗?