问题标签 [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.
rust - 避免 glium 中的丢帧
我使用glium作为我的 opengl 绑定,但不可能获得可靠的 60 FPS。
一个最小的测试用例是
我期望 60 FPS,但在我运行它时经常显示 59 FPS(在 OSX 中)。该项目在 github 上可用,以便于编译和运行。
有什么办法可以调整 glium 使其不会掉帧?OSX 会覆盖该vsync
设置,因此无法不等待每帧之间的垂直同步。
glsl - 在 Glium 中使用 UniformBuffer 将任意大小的对象传递给片段着色器
我的问题是在尝试一堆不同的技术时提出的,我对这些技术都没有太多经验。可悲的是,我什至不知道我是否犯了一个愚蠢的逻辑错误,我是否使用错误的glium
板条箱,我是否搞砸了GLSL
等等。无论如何,我设法从头开始了一个新的 Rust 项目,努力展示我的问题的最小示例,并且问题至少在我的计算机上重现。
不过,这个最小的例子最终很难解释,所以我首先做了一个更小的例子,它确实做了我想做的事情,尽管通过修改位并限制为 128 个元素(在 a 中是 4 乘以 32 位GLSL
uvec4
) . 由此,升级到我的问题出现的版本相当简单。
一个工作版本,具有简单uniform
和位移
该程序在屏幕上创建一个矩形,纹理坐标从0.0
到128.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
返回true
3、4、5、6、7 和 8 的倍数。结果与我的假设一致:
这个假设有意义吗?无论如何:看起来问题出在设置数据(在 Rust 端)还是读回数据(在 GLSL 端)?
macros - 如何在 Rust 中导入宏?
我正在努力解决如何从外部 crate 导入宏。在我的 main.rs 中,我正在导入 Glium 板条箱:
在我的主要功能来自的另一个文件中,我从该板条箱中调用其中一个宏:
构建时,我收到错误消息:
rust - 如何使用 cgmath::Matrix 作为 glium 中的统一参数?
我正在尝试将该cgmath
库集成到我的第一次实验中glium
,但我不知道如何将我的Matrix4
对象传递给draw()
调用。
我的uniforms
对象是这样定义的:
这是我的draw
电话:
无法与消息一起编译
我完全是 Rust 的初学者,但我相信我自己无法实现这个特性,因为它和Matrix4
类型都在一个与我分开的板条箱中。
真的没有比手动将矩阵转换为浮点数组更好的选择了吗?
rust - 使用 Glium 进行高效的 2D 渲染
我正在使用 Glium 为我正在编写的模拟器进行渲染。我拼凑了一些可行的东西(基于这个例子),但我怀疑它效率很低。这是相关的功能:
在高层次上,这就是我正在做的事情:
- 借用
NesScreen
其中包含屏幕缓冲区,这是一个数组。 - 将屏幕缓冲区克隆为向量
- 从矢量数据创建纹理并渲染它
我的怀疑是通过克隆整个屏幕缓冲区clone_from_slice
确实效率低下。该RawImage2d::from_raw_rgb_reversed
函数获取传递给它的向量的所有权,因此我不确定如何以避免克隆的方式执行此操作。
所以,两个问题:
这实际上是低效的吗?我没有足够的经验来直观地了解渲染内容。
如果是这样,有没有更有效的方法来做到这一点?我已经对 Glium 进行了相当多的搜索,但对于 2D 渲染并没有太多具体的内容。
rust - 无约束类型参数错误
我正在尝试将 glium 与 cgmath 接口。在这个答案之后,我实现了一个ToArray
特性来将实例转换cgmath::Matrix4
为 glium 可用的格式:
由于我并不总是Matrix4
直接使用,因此我需要对 cgmath 转换类型进行类似的实现。例如cgmath::Decomposed
:
这行得通,但我想避免为所有转换类型重复代码,所以我想我会为任何可以转换为的东西定义一个通用实现Matrix4
:
不幸的是,这不起作用:
我有两个问题:
- 为什么上面的代码不起作用?通过阅读
rustc --explain
输出,我希望充当以及T: Into<cgmath::Matrix4<S>>
的有效约束。S
T
- 我如何为可以转换为的任何东西编写通用实现
Matrix4
?
rust - 为什么从 Rust 和 Glium 调用 XChangeProperty 会产生段错误?
我正在尝试从 Rust 进行 xlib 调用,但我无法弄清楚为什么这段代码会给我一个段错误。
main.rs:
货物.toml:
Valgrind 报告的分段错误是:
从错误消息来看,data
参数 to似乎有问题XChangeProperty
,但我真的不知道它可能有什么问题。
rust - 使用 Conrod 时在“glium”中找不到“glutin”
我正在尝试使用 Conrod将 GUI 添加到我的一个小项目中。我设法解决了 3 个编译错误:
我研究了 Conrod 附带的示例(尤其是text_edit.rs
示例),并成功编译并运行了它们。据我所知,他们使用相同的技术(因为我的代码直接受到他们示例的启发),但不会受到未解决的glutin
.
此外,我似乎glutin
在项目目录本身中找不到任何引用:
作为参考,我Cargo.toml
还包括glutin
作为依赖项:
rust - 使用 Rust 裸机显示的输出
我正在关注有关创建 OS 的 Phil-Opp 教程,并且在成功使 VGA 输出正常工作后,我试图弄清楚如何控制我的显示/屏幕。如何控制显示器?我假设您必须编写驱动程序...或者您是否写入特定的内存位置,例如 VGA?像 SDL2、Glium 或其他东西这样的板条箱可以在“裸机”上工作吗?
opengl - 是从三角形创建圆还是用片段着色器更快地绘制它们?
我使用 Rust 语言和 Glium 库。我想在屏幕上显示大量的圆圈,但我不知道该怎么做。
有一个从三角形创建圆的选项,或者我可以用片段着色器绘制它们,即从每个圆的中心到屏幕上每个点的距离,如果它小于半径,则绘制它在所需的颜色。为清楚起见,这里是我如何绘制一个圆圈的示例:
哪种方法会更快?有没有更好的选择?每个圆圈的大小和颜色会在运行时发生变化。