问题标签 [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 投票
0 回答
592 浏览

rust - 有没有办法将数组传递给 glium 中的着色器?

我尝试使用统一块来做到这一点:

锈:

GLSL:

但我收到以下运行时错误:

在 Err 值上调用 Result::unwrap():UniformBlockLayoutMismatch { name: "MapBlock", err: MemberMismatch { member: "map", err: MemberMismatch { member: "", err: MemberMismatch { member: "position", err : OffsetMismatch { 预期:16,获得:0 } } } } }

每次启动程序时,shader 都会期望不同的尺寸结构,像这样:expected: 160, expected: 32, expected: 48。这可以解决吗?还有其他方法可以将数组传递给着色器吗?

我在用着:

  • Rust 1.28.0 稳定版,
  • 胶质 0.22.0,
  • 代数 0.16.0

完整代码锈:

完整代码frafment.glsl:

完整代码vertex.glsl:

0 投票
0 回答
278 浏览

opengl - 为什么 glium `Headless` 不能像普通窗口上下文一样渲染图像?

我正在开发一个屏幕外渲染程序,我使用 crateglium来做到这一点。我遵循了screenshot.rs的例子,这个例子运行良好。

然后我做了一些改变:

原始代码是

我将这些代码分组为一个函数:

经过这次修改,程序仍然运行良好。所以我继续添加无头上下文:

但这一次,该程序不起作用。运行过程中没有恐慌,但输出的图像是黑色的,并且它的大小不是 128x128 而是 800x600。

我试图删除,libEGL.dll因此由于 crate 的文档glutin,该函数.build_headless将构建一个窗口并将其隐藏,就像我的函数build_display一样。然而,这也失败了。那么是什么原因造成的呢?

0 投票
1 回答
933 浏览

rust - 在 glium 中设置帧重绘率?

我正在尝试使用 rust 中的 glium 制作游戏循环。我的目标是让屏幕每秒重绘 60 次。使用我拥有的当前事件循环代码,只有在窗口大小发生变化时才会重绘框架。我在 glutin docs 中读到,我需要在某个地方调用 request_redraw,但我不确定如何/在哪里。到目前为止,这是我的代码:

0 投票
1 回答
77 浏览

rust - 规避闭包借用的变量生命周期限制

我使用以下代码在render::exec每次发生RedrawRequested事件时运行我的函数(由 Glium 发布):

问题是,我在&font参考中收到以下错误:

font确实是在调用之前创建的event_loop.run,因为它是rusttype::Font我需要的一个结构,以便在我的 Glium 应用程序中呈现文本。我知道,由于这是一个move闭包,因此数据font将在其末尾被释放,因此借用检查器不允许font在闭包之外创建,因为不能确保闭包不会' t 被多次调用(实际上,它多次调用)。

我试图通过删除move关键字来规避这一点,但是我从闭包内部借用的每个变量都会触发以下错误:

我知道,由于借用检查器无法确保这些变量至少与闭包一样长,因此它不允许从前者内部引用后者。

因此,我需要一种方法来确保借用检查器这些变量的持续时间至少与闭包一样长。通常这样做的一种方法是将它们作为参数传递给闭包,但实际上我无法更改传递的参数列表,因为我使用event_loop.run的是具有以下签名的 :

我浏览了 Glutin 文档,但找不到将任何数据存储到EventLoop(这是取消引用EventLoopWindowTarget提供的类型)的方法,也找不到ControlFlow作为参数传递的 。

0 投票
1 回答
76 浏览

winforms - 拖动移动闪烁窗口的位置

我正在实现 .NET 的DragMove方法的 Rust 替代方法,但是结果导致应用程序在两个相对位置之间闪烁。

请参阅截屏视频示例项目

我用来执行拖动移动的代码:

0 投票
0 回答
165 浏览

opengl - 如何在 glium 中填充非 RGB OpenGL 纹理?

我使用 OpenGL 着色器进行从 YUV 到 RGB 的颜色转换。例如,在 YUV420P 上,我创建了 3 个纹理(一个用于 Y,一个用于 U,一个用于 V)并使用textureGLSL 调用来获取每个纹理。然后我使用矩阵乘法来获得 RGB 值。每个纹理都有 format GL_RED,因为它们只存储 1 个组件。

这一切都适用于 C++。现在我正在使用安全的 OpenGL Rust 库 glium。我正在创建这样的纹理:

看到U和纹理的大小V是 Y 纹理的 1/4,正如 YUV420P 所预期的那样。

如您所见,对于我选择的 YUV420P glium::texture::UncompressedFloatFormat::U8,我认为与GL_RED.

问题是我不知道如何用数据填充这个纹理。它的write方法期望可以转换为RawImage2D. 但是,所有填充方法都RawImage2D需要 RGB 图像。

我需要一种方法来仅将 Y 填充到第一个纹理,然后仅将 U 填充到第二个纹理,并且仅将 V 填充到第三个纹理。

0 投票
1 回答
256 浏览

opengl - 如何从 Rust 中的其他线程绘制 OpenGL 三角形

我通过这个例子学习 OpenGL 是 Rust:https ://github.com/glium/glium/blob/84f82d3098fbc75aa22160b47bf0a2bdada01f07/examples/triangle.rs#L141

它使用名为 glutin 的窗口包装器,并像这样绘制一次三角形:

问题是:我如何从其他线程中提取?为了调用draw,我必须与其他线程共享它,但是像program, index_buffer, vertex_buffer,这样display的类型不是Send+Sync

从其他线程中提取在窗口应用程序中至关重要,所以我猜他们想到了它,应该有一种简单的方法来做到这一点,但我迷路了。

0 投票
0 回答
77 浏览

rust - 如何在 glium 中逐行写入像素缓冲区?

将解码图像上传到像素缓冲区时,有时这些行包含一个步幅。也就是说,出于性能原因(对齐),线条大于图像线条。因此,如果我们要上传名为 的图像slice,如果它没有步幅 ( linesize==width),我们要么完全上传它,要么逐行上传:

但是,pixel_buffer.write(s)如果s.len()pixel_buffer的大小不同,则失败。

阅读https://docs.rs/glium/0.30.0/glium/texture/pixel_buffer/struct.PixelBuffer.html,不清楚如何分段编写。看起来map_write可能会这样做:

映射内存中的缓冲区仅用于写入。

但是我该怎么写WriteMapping呢?

PS:我认为这不是解决方案,因为我必须等待 GPU 映射出现。我只想尽快将数据发送到像素缓冲区

0 投票
1 回答
135 浏览

rust - 如何获得 glium 的宽度和高度?

我在 Rust 中使用 glium。我想得到宽度和高度。

我不能很好地书写和理解英语,因为我是日本人。也许我的英语有问题,所以我很抱歉。

0 投票
0 回答
112 浏览

vector - 我如何处理带有胶质(锈)的纹理加载

我想以我对 rust 非常陌生,因为我几天前才拿起它,所以我对所有事情都不是很清楚。但是,我遇到了第一个问题,我真的不知道该怎么办。

基本上,我想做的是使用一个模块来加载我所有的纹理,然后将它们放入一个向量中,这样我就可以从一个地方整齐地访问我的所有纹理。问题是,这实际上不适用于生锈。因为当我尝试访问纹理时,我收到一条错误消息 cannot move out of index of Vec<RawImage2d<'_, u8>>

查找此错误,我明白为什么它会在模糊的意义上发生,并且我已经查看了其他情况下错误的许多解决方案。问题是,如果我理解正确,就没有办法解决这个问题,使其按预期工作。

所以,我需要另一种解决方案,但我很难想出一个。这是我的代码,有什么办法可以使这项工作或任何人可以就如何重做事情提供任何建议?

这是加载资产的模块

主要代码