问题标签 [sharpgl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
660 浏览

c# - SharpGL-DrawArrays 给出 AccessViolationException

我正在使用 SharpGL 示例作为指南在 WPF 中创建一个现代 OpenGL hello world 应用程序。

在 Draw 方法中调用 DrawArrays 时,我似乎遇到了 AccessViolation 异常。检查了互联网 - 他们都认为它可能是底层的 GC 重定位数组。但既然我使用的是 VBO,这不应该发生,对吧?

代码:

XAML:

XAML.cs

}

0 投票
1 回答
3913 浏览

c# - 如何在 OpenGL 中相对于局部或全局轴旋转对象

我问了一个以前被问过一百万次的问题,但是在经历了这些并且还求助于其他网站之后,我仍然没有找到一个好的答案:

如何在全局轴上旋转图形,而不是局部轴?

在opengl中旋转物体

如何像OpenGL中的glRotatef()一样旋转顶点?

在OpenGL中围绕3轴旋转对象

在OpenGL中在自己的轴上旋转对象

是否可以围绕自己的轴而不是围绕基本坐标的轴旋转对象?

OpenGL 旋转 - 局部与全局轴

任务比较简单,我正在做一个带有加速度计和陀螺仪的传感器模块,我需要显示旋转。

我有一个 STL 格式的对象的 3D 模型,我制作了一个 STL 解析器,我可以很好地可视化对象。

当我尝试旋转它时,我会得到各种奇怪的结果。

我正在使用 SharpGL(场景组件)。

我试图编写一个(目前)由 3 个单独的轨迹栏控制的“效果”,但这将是来自传感器的数据。

我想把它作为一种效果来做,因为(理论上)我可以在场景中拥有更多的对象,我只需要旋转一个特定的对象(也出于教育目的,因为我对 OpenGL 比较陌生)。

我尝试使用四元数旋转对象,将它们相乘并生成旋转矩阵,然后应用gl.MultMatrix(transformMatrix.AsColumnMajorArray).

我也尝试过gl.Rotate(angleX, 1, 0, 0)(对于 Y 轴和 Z 轴也是类似的)。

根据四元数乘法或gl.Rotate(...)语句的顺序,我会让对象围绕局部轴(第一)旋转,一些奇怪的东西(第二)和“世界”第三。例如,如果我使用四元数qX*qY*qZ并从中得到旋转矩阵,我会得到(我认为)关于局部 X、“任意”Y 和世界 Z 轴的旋转。

我无法理解的部分是,当我gl.Rotate(dx, 1, 0, 0)在轨迹栏的事件中应用(以及其他用于 Y 和 Z 旋转的)Scroll时,整个场景围绕 X、Y 和 Z 轴并按此顺序旋转,并且完全符合我预期的旋转发生。

我对这种方法的唯一问题是整个场景都在旋转。所以如果我(假设地)想在对象周围画一个房间,整个房间也会旋转,这不是我想要的。

我会发布任何要求的代码,但我觉得太多了,上述链接的代码与我所拥有的相似。

归根结底,我希望我的对象(Polygon用 SharpGL 术语)围绕它自己的轴(或围绕“世界”轴,但要保持一致)旋转。

编辑:

我已将项目放在我的保管箱中:https ://goo.gl/1LzNhn

如果有人想看它,任何帮助将不胜感激。

在 中MainForm,TbRotXYZScroll 函数具有轨迹条代码,而 Rotation 类是问题所在(或者我认为)。

按该顺序将 X、Y 和 Z 旋转 45 度。一切似乎都很好。现在将 X、Y 和 Z 再旋转 30 度左右,试着想象旋转时围绕哪个轴发生旋转......
X 似乎总是世界,Z 似乎总是局部,而 Y 是某种东西介于两者之间(改变旋转顺序会改变这一点)。

进入 TbRotXYZScroll 函数并将方法更改为 2 可以满足我的要求(整个场景的旋转除外)。尝试过的四元数,它们产生完全相同的结果,所以我一定做错了什么......
将其更改为 1 会产生类似的结果,但这只是将旋转应用于多边形(不是渲染的内容,因为它也包括局部坐标轴)。

0 投票
1 回答
284 浏览

c# - WPF 绑定在负载下停止工作

几个星期以来,我一直在努力解决这个问题,所以我认为是时候寻求一些外部帮助了 :-)

我有一个带有主窗口的 WPF 应用程序,其中包括一大堆使用绑定的控件。其中一个控件是 SharpGL 控件,我提到它是因为它可能是相关的。

这些绑定都可以在我的笔记本电脑和其他高规格机器上工作,但在低规格机器上不能可靠地工作(或有时根本不能)(我的笔记本电脑是超线程四核,其中一台失败的测试机器是双核) . 如果我提高笔记本电脑上 SharpGL 控件的帧速率,绑定将停止工作。同样,如果我放慢速度,它们就会开始在双核机器上工作(但是 SharpGL 控制速度太慢,无法满足我的需要)。

可能值得注意的最后一件事是,我可以通过处理 PropertyChanged 事件并手动更新绑定来解决问题,但是我不再进行绑定,这太可怕了!

所以我想我真的有几个问题:

1)有没有人见过这样的问题?关于如何解决它的任何想法?会不会与 SharGL 控件的存在直接相关?2) 控件(在本例中为 SharpGL 控件)是否有可能以某种方式阻止绑定更新所有其他元素的方式失败?3) SharpGL 控件引发并在我的代码中处理的 Draw 事件是否有可能加载 UI 线程,以至于根本没有足够的时间来进行绑定更新?

提前致谢

迈克·纳什

0 投票
0 回答
287 浏览

c# - SharpGL 转 SharpGL.WPF.OpenGLControl.timer_Tick

目前我正在与 SharpGL 和 WPF 合作,以测试它的性能是否不错。测试是加载一个大的 STL 文件 ( https://en.wikipedia.org/wiki/STL_(file_format) ) 并在 SharpGL.WPF.OpenGLControl 上绘制它并旋转、缩放、变换它。当前的结果是,它并不像样,但这可能是因为它不断调用我的 Paint() 方法,而该方法又从方法 SharpGL.WPF.OpenGLControl.timer_Tick 调用。

问题:这个 time_Tick 怎么转?(每次调用 time_Tick 需要 67 毫秒,因为我是在立即模式下绘制的。)

0 投票
1 回答
304 浏览

c# - OpenGL绘制每n个顶点

我正在编写一个包含大型数据集线图的应用程序。

我目前的策略是将每个通道的数据加载到 1D 顶点缓冲区中。

然后我在绘制时使用顶点着色器将我的缓冲区组装成顶点(这样我就可以将我的一个缓冲区重用于多组数据)

这工作得很好,我可以绘制几亿个数据点,而不会太慢。

为了进一步扩展,我想减少实际绘制的点数,尽管简单的减少(即每 n 个点绘制一次)因为没有多少点绘制 1000 个点,这些点都由单个像素表示)

我能想到的一种方法是使用几何着色器并且只发射每 N 个点,但我不确定这是否是最好的攻击计划。

这是推荐的方法吗?

0 投票
0 回答
102 浏览

c# - 读取和写入 GPU,提高速度的技巧和窍门(尤其是在这种情况下)

目前,我的应用程序在 GPU CPU 数据共享方面存在主要瓶颈。

基本上我选择多个项目,每个项目成为一个缓冲区,然后成为一个 2D 纹理(相同大小),它们都在 GPU 上混合在一起。之后,我需要了解有关混合结果的各种信息。在 GPU 上作为(单通道浮动)纹理:

  • 纹理中的最大值和最小值
  • 平均值
  • 总和值

实际上,我以非常缓慢的回合结束了

  • 把数据放到 GPU * N
  • 从 GPU 读取数据
  • 在 CPU 上循环数据以查找值

显然,CPU 配置文件显示了写入和读取这两个主要热点。纹理是 100x100s 而不是 1000x1000s,但有很多。

我目前正在考虑三件事

  1. 结合所有数据并在使用 GPU 之前找出有趣的数据(将其放在 GPU 上似乎毫无意义,并且某些混合很复杂)
  2. 加载数据时将其全部放到 GPU 上(作为纹理级别,因此跳过项目选择的延迟以支持较慢的加载)
  3. 在 GPU 上计算“有趣的数据”,然后让 CPU 回读这些值

在我的机器和我使用过的数据上,将所有数据扔到 GPU 上几乎不会使用 GPU 内存。到目前为止,我看到的最高值是 9000 个 170 X 90 的条目,因为它的单通道浮点数,根据我的数学计算结果是 1/2 GB。这在我的机器上不是问题,但我可以看到它在普通笔记本电脑上是一个问题。我可以让 GPU 从 HDD 进行分页吗?这还值得追求吗?

很抱歉问了这么广泛的问题,但我正在寻找最有成效的途径去追求,每条途径对我来说都是新的领域。分析似乎强调回读是目前最大的问题。我可以通过更改 FBO/纹理设置来改善这一点吗?

目前我在 SharpGL 工作,最好坚持使用 OpenGL 3.3。但是,如果有一条通过视频内存或 GL 版本无法实现的任何特定技术的性能快速改进的途径,我可能会提出一个案例来满足软件系统要求。

0 投票
2 回答
1698 浏览

c# - C#:WinForms/WPF 渲染循环

我想制作一个渲染循环以在 WPF 窗口或 WinForm 上渲染。因此我想使用 SharpGL ( https://sharpgl.codeplex.com/ )。为了制作我的循环,我做了一个线程:

在渲染中,我想将绘制调用发送到 GPU。到目前为止没有问题。但是 Winforms 和 WPF 需要自己的线程和循环。所以我不能像在 Java 中一样使用我之前使用过的 LWJGL ( https://www.lwjgl.org/ ) 创建一个窗口并在上面绘图。我必须启动另一个线程,在应用程序中运行表单(我删除了错误处理以使其简短):

当我的渲染器想要访问我的窗体上的 OpenGL-Control 并使用它时,会发生错误,因为 WinForms(和 WPF)不希望它们的控件被其他线程操作。所以也许调用是一种选择,但这会延迟我的绘制调用并成为瓶颈。计时器也不是一种选择,因为它不准确且不灵活......而且我只是不喜欢它。并且在窗口代码中执行所有操作都是可能的,但我希望应用程序独立于其显示,以便可以更改它。它应该是具有显示而不是显示运行应用程序的应用程序。在 LWJGL 中,我可以创建和初始化一个 Display,然后简单地使用它。唯一需要考虑的是更新它,一切都很好。所以我只想在我的渲染线程中创建一个窗口并绘制。如果我这样做,窗口就会变得无法使用并且变灰,因为它需要这个.Net-Loop。有没有可能意识到这一点,或者有人知道创建 Windows 的另一种方法吗?我可以手动处理窗口循环吗?

欢迎任何想法。

如果有一种方法可以使用 WPF 窗口来做到这一点,那就太棒了。然后我可以有一个 OpenGL 控件和所有 WPF-Stuff 来制作一个编辑器!

0 投票
1 回答
773 浏览

c# - 如何在 SharpGL/WPF 中手动制作渲染触发器

我已经为 WPF 安装了 SharpGL 控件。控件始终处于渲染循环中,我的意思是它以特定间隔渲染。我想要的是一次抽奖。因为我不是在制作游戏,也不需要不断渲染场景。我应该怎么办?

0 投票
0 回答
884 浏览

c# - C#SharpGL 在 SharpGL.SceneGraph.Primitives.Polygon 上使用纹理

我正在为 Visual C# 使用 SharpGL 库。我想向 SharpGL.SceneGraph.Primitives.Polygon 添加纹理。

在加载图像之前我需要做什么?我画我的模型

0 投票
1 回答
798 浏览

c# - 无法在 SharpGL 中渲染简单的透明精灵

我知道如何生成平面并映射纹理。现在,我试图在我的表单上显示一个 alpha 混合的 PNG,就像它是一个精灵一样。

我从谷歌搜索和猜测中得出以下代码:

这是我正在使用的原始源图像:

这是我在表单上渲染此精灵 10 × 10 (100) 次时的输出:

输出一团糟,似乎不尊重图像的 alpha 通道。需要对我的代码进行哪些更改以确保其正确呈现?