标签: opentk

陶框架死了吗?

我正在研究陶的实验,但我对其看似死气沉沉的状态感到有些偏见.它自2008年以来一直没有更新,看起来他们的网站大致在同一时间停止运作.

有没有人有关于当前情况的任何信息或知道它的稳定性?

.net c# tao-framework opentk

25
推荐指数
1
解决办法
1万
查看次数

如何加入重叠的圈子?

我想在视觉上加入两个重叠的圆圈

AltText

替代文字

我已经有了部分圆的方法,但现在我需要知道earch圆的重叠角度有多大,我不知道该怎么做.

有人有想法吗?

c# opengl math geometry opentk

21
推荐指数
3
解决办法
2234
查看次数

OpenTK,SharpGL和WPF

我即将开始一个新项目.有些决定是我无法控制的:使用WPF和OpenGL是其中的一部分.

但是,我已将OpenGL选项缩小为两个:OpenTK或SharpGL.SharpGL有一个WPF控件,而OpenTK只有一个Windows窗体控件,这使我必须将它嵌入到Windows窗体主机中: - /虽然我不介意空域限制,但我确实希望有不错的性能,因为我正在构建一个实时应用程序.不是游戏,但仍然是实时.

与使用具有"纯"WPF控件的SharpGL相比,我的程序在Windows窗体上使用OpenTK会带来多少性能影响?

opengl wpf graphics opentk

11
推荐指数
1
解决办法
8995
查看次数

C#性能分析器显示了长时间的暂停,无法从提供的数据中确定它是什么

渲染框架时,我的C#应用​​程序中出现了意外的峰值。我在探查器中进行了遍历,发现以下内容:

  • 当vsync打开时,该程序似乎在交换缓冲区时将控制权交给了OS(或执行了某些操作)...并且在某种程度上保持了渲染的一致性。这很好,因为它使帧平滑且没有怪异的微笔画。下图显示了被认为是完美的流体。这就是我们的情况,“它可以流畅地渲染而不会出现卡顿现象,从而完美地工作”。

VSync影​​像

  • 当vsync关闭并且程序不执行任何操作,只是尽可能快地进行写入而没有任何中断时,即使每秒的帧数更高,似乎仍然存在这些较大的空白,因此什么也不做。我很确定这是我在游戏中注意到的微结点,因为它会导致FPS急剧下降到60fps以下。下图显示了出问题的地方:

微口吃

在上面,增量时间为21毫秒(每秒60帧超过16.6毫秒),并在游戏中造成明显的停顿。甚至比这更糟,因为它仅在它之后才开始渲染(如您之后所看到的实心矩形),所以这21ms是一个谎言,根据该图,它更像是40ms,这太可怕了。

由于我不了解的原因,当打开vsync时,这种巨大差距永远不会发生。对于不熟悉vsync和游戏的用户,您不能在第一人称射击游戏中使用vsync,因为由于它的工作原理,它会削弱输入处理,因此我无法使用vsync,并且必须研究非vsync版本。我需要找到为什么非vsync版本具有这些主要停滞点的原因。

我的问题是,如何知道您从上面看到的图像中导致此延迟的原因?

性能分析器表示,这里有大量等待时间,超过80%的等待时间需要20%的CPU使用率(相比之下,准备渲染数据时需要100%的CPU使用率)。

探查器还显示该循环中没有运行任何渲染代码...这很奇怪,因为渲染器几乎完全控制了性能,因此,如果每秒不对帧进行任何上限,则应该使用纯蓝色淹没整个图形长方形。

问题在于,探查器显示的代码只是调用我在上面选择的区域中的轮询输入和dll:

DLL调用

请注意,的另一个调用DispatchRenderFrame是进行OpenGL调用,当我完全删除它时,它对程序没有影响,因此您可以忽略它。这可能意味着下面看到的用户输入也不会影响微笔画问题...但是我无法删除它,因为它是我用于窗口管理(OpenTK)的库的一部分。

我不确定CLR Worker线程是什么或正在做什么。它也发生在vsync一个(希望平滑分析一个)中,因此即使我不知道它是否是罪魁祸首,我猜也可能不是,但我不确定,因为它显示在“所需的vsync示例”也位于同一常规位置。

是否发生了一些中断,操作系统正在接管但未恢复我的线程,因为它被归类为CPU吞噬?只是一个想法...但是在示例中再次显示了蓝色条,因此我认为该Main线程实际上并未在我突出显示的内容中处于睡眠状态,并且实际上正在运行?

如您所见,我不确定突出显示的时间段是在告诉我什么,这是我需要帮助的地方。我不知道为什么此时代码中的等待百分比如此之高,或者从这里何处去进一步诊断问题。

编辑:我对Stopwatch类进行了一些粗略的剖析,以查看导致尖峰的位置,并且尖峰来自计算部分。OpenGL调用均不会导致任何延迟。它纯粹是在执行数学运算和访问数据的功能的函数内部发生的,或者写入预先分配的结构数组中。


额外说明:

这也让我好奇是否有办法让我强制使用,以使C#虚拟机获得尽可能多的CPU使用率?

没有产生垃圾。这不是 GC问题。我不能在申请期间运行GC,所以不会产生垃圾。渲染函数中的所有内容都是堆栈上的所有结构,唯一一次进入堆管理对象的是池化数组,其大小足以容纳所有渲染数据。它在探查器中出现的唯一时间是在开始和结束时,但是在渲染阶段不会运行。

c# performance opentk

11
推荐指数
1
解决办法
412
查看次数

C# SkiaSharp OpenTK Winform - 如何从后台线程绘制?

我正在尝试用 SkiaSharp 替换 GDI+,作为数据可视化框架,该框架使用实时不断变化的工程数据呈现多层可平移可缩放图形。

在 GDI+ 中,应用程序执行了以下操作:

  • 创建了一组具有透明背景的绘图图层,通常是网格图层、一个或多个数据图层以及用于光标信息和突出显示的覆盖图层,每个图层都由单独的位图支持。
  • 在渲染循环后台线程中,仅使用 GDI+ 重绘每个渲染周期需要更新的图层(位图)。这可能需要数千条计算和转换的线条、矩形和文本来创建热图、波形、直方图、数据标签等。
  • 然后,堆栈中的每个绘图层将由后台线程 BitBlt 转换为复合位图
  • 最终的复合位图将以高达 30fps 的速度绘制到 GUI 线程中的 WinForm PictureBox。

直到最终图像呈现的所有事情都是在一个或多个后台线程中完成的。 GUI 线程仅涉及将完成的图像绘制到 PictureBox 中。这很重要,因为还有许多其他 GUI 控件需要保持响应能力。这非常有效,只不过它是基于 CPU 的。小窗口没问题,但在 4K 屏幕上最大化会减慢渲染速度,导致程序几乎无法使用。

我想用 GPU 加速的 SkiaSharp 重新创建这个概念。

我尝试创建数十个不同的测试程序,但不断出现跨线程访问冲突,或者屏幕上没有显示任何内容,或者严重崩溃。让我问一些基本问题,而不是发布代码:

问题:

  • 您将如何创建这个框架?SkiaSharp 能做到这一点吗?
  • 我的每个图层类都应该维护 SKSurface、SKCanvas、SKImage 或 SKBitmap 吗?- 同样,如果当前周期不需要重绘某个图层,则该图层需要保留先前绘制的内容以在下一个合成图像中使用。
  • GUI 线程上需要 GLControl 和 GRContext 来显示最终的合成图像,但是是否应该有另一个单独的 GRContext 供后台渲染线程使用?- 如何使用 GPU 加速进行创作?
  • 有人可以指出类似概念的可行示例吗?(GPU加速从后台线程到GLControl的渲染)
  • 我应该仅使用隐藏在后台的 SkiaSharp 和带有 PictureBox 的 GDI+ BitBlt 在屏幕上显示合成图像吗?- 这能解决一些线程问题吗?

任何定义方法和注意事项的帮助将不胜感激!

c# multithreading gpu opentk skiasharp

11
推荐指数
1
解决办法
3255
查看次数

OpenGL C#(OpenTK)加载和绘制图像功能不起作用

我正在尝试加载并在屏幕上显示纹理,但是我正在接收一个黑色的盒子,它将被显示出来.

两个主要方法是"LoadTexture"和"Draw Image",我假设其中一个错误.

using System;
using System.Diagnostics;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using System.Drawing;
using System.Drawing.Imaging;

namespace FailRender
{
    public class FailRender: GameWindow
    {
        public FailRender() : base(800, 600, GraphicsMode.Default, "Hoard of Upgrades")
        {
            GL.ClearColor(0, 0.1f, 0.4f, 1);

            texture = LoadTexture("sand.jpg");
        }

        private int texture;

        public int LoadTexture(string file)
        {
            Bitmap bitmap = new Bitmap(file);

            int tex;
            GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

            GL.GenTextures(1, out tex);
            GL.BindTexture(TextureTarget.Texture2D, tex);

            BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, …
Run Code Online (Sandbox Code Playgroud)

c# opengl textures opentk

7
推荐指数
1
解决办法
1万
查看次数

OSX Custom Shaped OpenGL/OpenTK View

OSX上有一个自定义透明窗口,其中有一个管理OpenGL绘图的NSView:

public class MyCustomOpenGLView : NSView
{
    NSOpenGLContext openGLContext;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我设置了以下内容(使用Xamarin):

openGLContext.SurfaceOpaque = false;
Run Code Online (Sandbox Code Playgroud)

这相当于:

GLint opaque = 0;
[[[wnd contentView] openGLContext] setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
Run Code Online (Sandbox Code Playgroud)

我还在管理OpenGL的NSView上设置了"Opaque"属性为false:

    public override bool IsOpaque
    {
        get
        {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这相当于:

@implementation NSOpenGLView (Opaque)
-(BOOL)isOpaque {
    return NO;
}
@end
Run Code Online (Sandbox Code Playgroud)

然后在渲染过程中我将透明色设置为透明:

GL.ClearColor(Color.Transparent);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
// Draw shape here...
Run Code Online (Sandbox Code Playgroud)

视图使用透明背景渲染形状,但我仍然可以单击透明区域.我希望能够点击透明区域.

我尝试重写HitTest方法,NSView确实抓住了我在透明区域的鼠标点击.我在这做错了什么?任何帮助将非常感激!

c# opengl objective-c opentk xamarin

7
推荐指数
0
解决办法
215
查看次数

如何通过 OpenGL 直接使用屏幕空间坐标?

我已经按照我在https://learnopengl.com/上找到的指南进行操作,并设法在窗口上渲染了一个三角形,但整个过程对我来说似乎过于复杂。一直在互联网上搜索,发现了很多类似的问题,但它们似乎都过时了,而且没有一个给出满意的答案。

我已经阅读了上面提到的网站上的指南Hello Triangle,其中有一张解释图形管道的图片,由此我了解了为什么在屏幕上绘制三角形这样看似简单的任务需要如此多的步骤。

我还阅读了同一站点的坐标系统指南,它告诉我什么是 OpenGL 使用的“奇怪的(对我来说)坐标”(NDC)以及它为什么使用它。

C

(这是上面提到的指南中的图片,我认为它对于描述我的问题很有用。)


问题是:我可以直接使用最终的 SCREEN SPACE 坐标吗?

我想要的只是进行一些 2D 渲染(无 z 轴)并且屏幕尺寸已知(固定),因此我不明白为什么我应该使用标准化坐标系而不是绑定到屏幕的特殊坐标系。

例如:在 320x240 屏幕上,(0,0)代表左上角像素,(319,239)代表右下角像素。它不需要完全像我所描述的那样,其想法是每个整数坐标 = 屏幕上的相应像素。

我知道可以设置这样一个坐标系供我自己使用,但是坐标会四处变换并最终返回到屏幕空间 -这就是我首先拥有的。所有这些对我来说似乎都是浪费工作,而且坐标转换时不会导致精度损失吗?


引用坐标系指南(上图):

  1. 坐标位于视图空间后,我们希望将它们投影到剪辑坐标。剪辑坐标被处理为 -1.0 和 1.0 范围,并确定哪些顶点将最终出现在屏幕上。

因此,考虑在 1024x768 屏幕上,我将剪辑坐标定义为 (0,0) 到 (1024,678),其中:

(0,0)--------(1,0)--------(2,0)  
  |            |            |    
  |   First    |            |    
  |   Pixel    |            |    
  |            |            |    
(0,1)--------(1,1)--------(2,1)        . . .
  |            |            |    
  |            |            |    
  |            |            |    
  | …
Run Code Online (Sandbox Code Playgroud)

c# opengl shader glsl opentk

7
推荐指数
1
解决办法
1万
查看次数

如何使用OpenGL创建自定义顶点格式

我正在使用OpenTK编写自己的引擎(基本上只是用于C#的OpenGL绑定,gl*变成GL.*)并且我将存储许多顶点缓冲区,每个顶点缓冲区中有数千个顶点.因此我需要自己的自定义顶点格式,因为带有浮点数的Vec3会占用太多空间.(我在这里谈论数百万个顶点)

我想要做的是用这个布局创建我自己的顶点格式:

Byte 0: Position X
Byte 1: Position Y
Byte 2: Position Z
Byte 3: Texture Coordinate X

Byte 4: Color R
Byte 5: Color G 
Byte 6: Color B
Byte 7: Texture Coordinate Y
Run Code Online (Sandbox Code Playgroud)

以下是顶点C#中的代码:

public struct SmallBlockVertex
{
    public byte PositionX;
    public byte PositionY;
    public byte PositionZ;
    public byte TextureX;

    public byte ColorR;
    public byte ColorG;
    public byte ColorB;
    public byte TextureY;
}
Run Code Online (Sandbox Code Playgroud)

作为每个轴的位置的字节是充足的,因为我只需要32 ^ 3个唯一位置.

我编写了自己的顶点着色器,它将两个vec4作为输入,为每组字节打开.我的顶点着色器是这样的:

attribute vec4 pos_data;
attribute vec4 col_data;

uniform mat4 projection_mat;
uniform …
Run Code Online (Sandbox Code Playgroud)

c# opengl glsl vertices opentk

6
推荐指数
1
解决办法
4006
查看次数

C#.OpenTK与OpenGL相同的代码?

我正在考虑用C#学习OpenGL,我打算使用OpenTK.我想知道OpenTK和"真正的OpenGL"的代码是否相同?我是否必须阅读有关OpenTK的书籍/教程,或者我是否可以阅读有关OpenGL的内容并仍然学会用C#编写代码?

c# opengl opentk

6
推荐指数
1
解决办法
2416
查看次数