我正在研究陶的实验,但我对其看似死气沉沉的状态感到有些偏见.它自2008年以来一直没有更新,看起来他们的网站大致在同一时间停止运作.
有没有人有关于当前情况的任何信息或知道它的稳定性?
我想在视觉上加入两个重叠的圆圈

变

我已经有了部分圆的方法,但现在我需要知道earch圆的重叠角度有多大,我不知道该怎么做.
有人有想法吗?
我即将开始一个新项目.有些决定是我无法控制的:使用WPF和OpenGL是其中的一部分.
但是,我已将OpenGL选项缩小为两个:OpenTK或SharpGL.SharpGL有一个WPF控件,而OpenTK只有一个Windows窗体控件,这使我必须将它嵌入到Windows窗体主机中: - /虽然我不介意空域限制,但我确实希望有不错的性能,因为我正在构建一个实时应用程序.不是游戏,但仍然是实时.
与使用具有"纯"WPF控件的SharpGL相比,我的程序在Windows窗体上使用OpenTK会带来多少性能影响?
渲染框架时,我的C#应用程序中出现了意外的峰值。我在探查器中进行了遍历,发现以下内容:
在上面,增量时间为21毫秒(每秒60帧超过16.6毫秒),并在游戏中造成明显的停顿。甚至比这更糟,因为它仅在它之后才开始渲染(如您之后所看到的实心矩形),所以这21ms是一个谎言,根据该图,它更像是40ms,这太可怕了。
由于我不了解的原因,当打开vsync时,这种巨大差距永远不会发生。对于不熟悉vsync和游戏的用户,您不能在第一人称射击游戏中使用vsync,因为由于它的工作原理,它会削弱输入处理,因此我无法使用vsync,并且必须研究非vsync版本。我需要找到为什么非vsync版本具有这些主要停滞点的原因。
我的问题是,如何知道您从上面看到的图像中导致此延迟的原因?
性能分析器表示,这里有大量等待时间,超过80%的等待时间需要20%的CPU使用率(相比之下,准备渲染数据时需要100%的CPU使用率)。
探查器还显示该循环中没有运行任何渲染代码...这很奇怪,因为渲染器几乎完全控制了性能,因此,如果每秒不对帧进行任何上限,则应该使用纯蓝色淹没整个图形长方形。
问题在于,探查器显示的代码只是调用我在上面选择的区域中的轮询输入和dll:
请注意,的另一个调用DispatchRenderFrame是进行OpenGL调用,当我完全删除它时,它对程序没有影响,因此您可以忽略它。这可能意味着下面看到的用户输入也不会影响微笔画问题...但是我无法删除它,因为它是我用于窗口管理(OpenTK)的库的一部分。
我不确定CLR Worker线程是什么或正在做什么。它也发生在vsync一个(希望平滑分析一个)中,因此即使我不知道它是否是罪魁祸首,我猜也可能不是,但我不确定,因为它显示在“所需的vsync示例”也位于同一常规位置。
是否发生了一些中断,操作系统正在接管但未恢复我的线程,因为它被归类为CPU吞噬?只是一个想法...但是在示例中再次显示了蓝色条,因此我认为该Main线程实际上并未在我突出显示的内容中处于睡眠状态,并且实际上正在运行?
如您所见,我不确定突出显示的时间段是在告诉我什么,这是我需要帮助的地方。我不知道为什么此时代码中的等待百分比如此之高,或者从这里何处去进一步诊断问题。
编辑:我对Stopwatch类进行了一些粗略的剖析,以查看导致尖峰的位置,并且尖峰仅来自计算部分。OpenGL调用均不会导致任何延迟。它纯粹是在执行数学运算和访问数据的功能的函数内部发生的,或者写入预先分配的结构数组中。
额外说明:
这也让我好奇是否有办法让我强制使用,以使C#虚拟机获得尽可能多的CPU使用率?
没有产生垃圾。这不是 GC问题。我不能在申请期间运行GC,所以不会产生垃圾。渲染函数中的所有内容都是堆栈上的所有结构,唯一一次进入堆管理对象的是池化数组,其大小足以容纳所有渲染数据。它在探查器中出现的唯一时间是在开始和结束时,但是在渲染阶段不会运行。
我正在尝试用 SkiaSharp 替换 GDI+,作为数据可视化框架,该框架使用实时不断变化的工程数据呈现多层可平移可缩放图形。
在 GDI+ 中,应用程序执行了以下操作:
直到最终图像呈现的所有事情都是在一个或多个后台线程中完成的。 GUI 线程仅涉及将完成的图像绘制到 PictureBox 中。这很重要,因为还有许多其他 GUI 控件需要保持响应能力。这非常有效,只不过它是基于 CPU 的。小窗口没问题,但在 4K 屏幕上最大化会减慢渲染速度,导致程序几乎无法使用。
我想用 GPU 加速的 SkiaSharp 重新创建这个概念。
我尝试创建数十个不同的测试程序,但不断出现跨线程访问冲突,或者屏幕上没有显示任何内容,或者严重崩溃。让我问一些基本问题,而不是发布代码:
问题:
任何定义方法和注意事项的帮助将不胜感激!
我正在尝试加载并在屏幕上显示纹理,但是我正在接收一个黑色的盒子,它将被显示出来.
两个主要方法是"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) 在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确实抓住了我在透明区域的鼠标点击.我在这做错了什么?任何帮助将非常感激!
我已经按照我在https://learnopengl.com/上找到的指南进行操作,并设法在窗口上渲染了一个三角形,但整个过程对我来说似乎过于复杂。一直在互联网上搜索,发现了很多类似的问题,但它们似乎都过时了,而且没有一个给出满意的答案。
我已经阅读了上面提到的网站上的指南Hello Triangle,其中有一张解释图形管道的图片,由此我了解了为什么在屏幕上绘制三角形这样看似简单的任务需要如此多的步骤。
我还阅读了同一站点的坐标系统指南,它告诉我什么是 OpenGL 使用的“奇怪的(对我来说)坐标”(NDC)以及它为什么使用它。

(这是上面提到的指南中的图片,我认为它对于描述我的问题很有用。)
我想要的只是进行一些 2D 渲染(无 z 轴)并且屏幕尺寸已知(固定),因此我不明白为什么我应该使用标准化坐标系而不是绑定到屏幕的特殊坐标系。
例如:在 320x240 屏幕上,(0,0)代表左上角像素,(319,239)代表右下角像素。它不需要完全像我所描述的那样,其想法是每个整数坐标 = 屏幕上的相应像素。
我知道可以设置这样一个坐标系供我自己使用,但是坐标会四处变换并最终返回到屏幕空间 -这就是我首先拥有的。所有这些对我来说似乎都是浪费工作,而且坐标转换时不会导致精度损失吗?
引用坐标系指南(上图):
- 坐标位于视图空间后,我们希望将它们投影到剪辑坐标。剪辑坐标被处理为 -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) 我正在使用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,我打算使用OpenTK.我想知道OpenTK和"真正的OpenGL"的代码是否相同?我是否必须阅读有关OpenTK的书籍/教程,或者我是否可以阅读有关OpenGL的内容并仍然学会用C#编写代码?