问题标签 [glium]

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 投票
1 回答
667 浏览

rust - 避免 glium 中的丢帧

我使用glium作为我的 opengl 绑定,但不可能获得可靠的 60 FPS。

一个最小的测试用例是

我期望 60 FPS,但在我运行它时经常显示 59 FPS(在 OSX 中)。该项目在 github 上可用,以便于编译和运行。

有什么办法可以调整 glium 使其不会掉帧?OSX 会覆盖该vsync设置,因此无法不等待每帧之间的垂直同步。

0 投票
1 回答
676 浏览

glsl - 在 Glium 中使用 UniformBuffer 将任意大小的对象传递给片段着色器

我的问题是在尝试一堆不同的技术时提出的,我对这些技术都没有太多经验。可悲的是,我什至不知道我是否犯了一个愚蠢的逻辑错误,我是否使用错误的glium板条箱,我是否搞砸了GLSL等等。无论如何,我设法从头开始了一个新的 Rust 项目,努力展示我的问题的最小示例,并且问题至少在我的计算机上重现。

不过,这个最小的例子最终很难解释,所以我首先做了一个更小的例子,它确实做了我想做的事情,尽管通过修改位并限制为 128 个元素(在 a 中是 4 乘以 32 位GLSL uvec4) . 由此,升级到我的问题出现的版本相当简单。

一个工作版本,具有简单uniform和位移

该程序在屏幕上创建一个矩形,纹理坐标从0.0128.0水平。该程序包含一个矩形的顶点着色器,以及一个使用纹理坐标在矩形上绘制垂直条纹的片段着色器:如果纹理坐标(钳制为uint)是奇数,则绘制一种颜色,当纹理坐标为偶数时,它会绘制另一种颜色。

但这还不够好...

该程序有效,并显示了具有交替条纹的矩形,但有明显的限制,即限制为 128 个条纹(或 64 个条纹,我猜。其他 64 个是“矩形的背景”)。为了允许任意多的条带(或者,一般来说,将任意多的数据传递给片段着色器),可以使用统一的缓冲区对象,它是 glium 暴露的。glium repo 中最相关的示例遗憾地无法在我的机器上编译:GLSL不支持该版本,buffer关键字是受支持版本中的语法错误,通常不支持计算着色器(在我的机器上使用 glium),以及也不是无头渲染上下文。

一个不太实用的版本,带有缓冲区uniform

因此,由于无法从该示例开始,我不得不使用文档从头开始。对于上面的示例,我想出了以下内容:

我希望这会产生相同的条纹矩形(或者给出一些错误,或者如果我做错了什么会崩溃)。相反,它显示了矩形,最右边的四分之一为纯红色(即,“当片段着色器读取它时,该位似乎已设置”),其余四分之三为深红色(即,“当该位未设置时片段着色器读取它”)。

自原始发布以来的更新

我真的在黑暗中刺伤,所以认为这可能是内存排序、字节顺序、缓冲区溢出/欠载等的低级错误。我尝试了各种方法来填充“相邻”内存位置与易于识别的位模式(例如,每三组中的一位,每四组中的一位,两组后跟两位未设置,等等)。这并没有改变输出。

使内存“靠近”的一种明显方法uint values[128]是将其放入Data结构中,就在前面values(后面values是不允许的,因为Data'svalues: [u32]是动态调整大小的)。如上所述,这不会改变输出。但是,将正确填充uvec4的缓冲区放入uniform_data缓冲区,并使用main类似于第一个示例的函数确实会产生原始结果。这表明glium::uniforms::UniformBuffer<Data> in se 确实有效。

因此,我更新了标题以反映问题似乎出在其他地方。

在伊莱的回答之后

@Eli Friedman 的回答帮助我朝着解决方案前进,但我还没有完全做到。

分配和填充四倍大的缓冲区确实改变了输出,从四分之一填充的矩形变为完全填充的矩形。糟糕,这不是我想要的。不过,我的着色器现在正在读取正确的记忆词。所有这些词都应该用正确的位模式填充。尽管如此,矩形的任何部分都没有条纹。由于bit_should_be_set_at应该设置每隔一个位,我提出了以下假设:

为了检验这个假设,我改为bit_should_be_set_at返回true3、4、5、6、7 和 8 的倍数。结果与我的假设一致:

这个假设有意义吗?无论如何:看起来问题出在设置数据(在 Rust 端)还是读回数据(在 GLSL 端)?

0 投票
2 回答
13312 浏览

macros - 如何在 Rust 中导入宏?

我正在努力解决如何从外部 crate 导入宏。在我的 main.rs 中,我正在导入 Glium 板条箱:

在我的主要功能来自的另一个文件中,我从该板条箱中调用其中一个宏:

构建时,我收到错误消息:

0 投票
1 回答
1332 浏览

rust - 如何使用 cgmath::Matrix 作为 glium 中的统一参数?

我正在尝试将该cgmath库集成到我的第一次实验中glium,但我不知道如何将我的Matrix4对象传递给draw()调用。

我的uniforms对象是这样定义的:

这是我的draw电话:

无法与消息一起编译

我完全是 Rust 的初学者,但我相信我自己无法实现这个特性,因为它和Matrix4类型都在一个与我分开的板条箱中。

真的没有比手动将矩阵转换为浮点数组更好的选择了吗?

0 投票
1 回答
948 浏览

rust - 使用 Glium 进行高效的 2D 渲染

我正在使用 Glium 为我正在编写的模拟器进行渲染。我拼凑了一些可行的东西(基于这个例子),但我怀疑它效率很低。这是相关的功能:

在高层次上,这就是我正在做的事情:

  • 借用NesScreen其中包含屏幕缓冲区,这是一个数组。
  • 将屏幕缓冲区克隆为向量
  • 从矢量数据创建纹理并渲染它

我的怀疑是通过克隆整个屏幕缓冲区clone_from_slice确实效率低下。该RawImage2d::from_raw_rgb_reversed函数获取传递给它的向量的所有权,因此我不确定如何以避免克隆的方式执行此操作。

所以,两个问题:

  • 实际上是低效的吗?我没有足够的经验来直观地了解渲染内容。

  • 如果是这样,有没有更有效的方法来做到这一点?我已经对 Glium 进行了相当多的搜索,但对于 2D 渲染并没有太多具体的内容。

0 投票
1 回答
6366 浏览

rust - 无约束类型参数错误

我正在尝试将 glium 与 cgmath 接口。在这个答案之后,我实现了一个ToArray特性来将实例转换cgmath::Matrix4为 glium 可用的格式:

由于我并不总是Matrix4直接使用,因此我需要对 cgmath 转换类型进行类似的实现。例如cgmath::Decomposed

这行得通,但我想避免为所有转换类型重复代码,所以我想我会为任何可以转换为的东西定义一个通用实现Matrix4

不幸的是,这不起作用:

我有两个问题:

  • 为什么上面的代码不起作用?通过阅读rustc --explain输出,我希望充当以及T: Into<cgmath::Matrix4<S>>的有效约束。ST
  • 我如何为可以转换为的任何东西编写通用实现Matrix4
0 投票
1 回答
304 浏览

rust - 为什么从 Rust 和 Glium 调用 XChangeProperty 会产生段错误?

我正在尝试从 Rust 进行 xlib 调用,但我无法弄清楚为什么这段代码会给我一个段错误。

main.rs:

货物.toml:

Valgrind 报告的分段错误是:

从错误消息来看,data参数 to似乎有问题XChangeProperty,但我真的不知道它可能有什么问题。

0 投票
1 回答
608 浏览

rust - 使用 Conrod 时在“glium”中找不到“glutin”

我正在尝试使用 Conrod将 GUI 添加到我的一个小项目中。我设法解决了 3 个编译错误:

我研究了 Conrod 附带的示例(尤其是text_edit.rs示例),并成功编译并运行了它们。据我所知,他们使用相同的技术(因为我的代码直接受到他们示例的启发),但不会受到未解决的glutin.

此外,我似乎glutin在项目目录本身中找不到任何引用:

作为参考,我Cargo.toml还包括glutin作为依赖项:

0 投票
1 回答
413 浏览

rust - 使用 Rust 裸机显示的输出

我正在关注有关创建 OS 的 Phil-Opp 教程,并且在成功使 VGA 输出正常工作后,我试图弄清楚如何控制我的显示/屏幕。如何控制显示器?我假设您必须编写驱动程序...或者您是否写入特定的内存位置,例如 VGA?像 SDL2、Glium 或其他东西这样的板条箱可以在“裸机”上工作吗?

0 投票
2 回答
1090 浏览

opengl - 是从三角形创建圆还是用片段着色器更快地绘制它们?

我使用 Rust 语言和 Glium 库。我想在屏幕上显示大量的圆圈,但我不知道该怎么做。

有一个从三角形创建圆的选项,或者我可以用片段着色器绘制它们,即从每个圆的中心到屏幕上每个点的距离,如果它小于半径,则绘制它在所需的颜色。为清楚起见,这里是我如何绘制一个圆圈的示例:

哪种方法会更快?有没有更好的选择?每个圆圈的大小和颜色会在运行时发生变化。