我正在构建一个渲染引擎,我想要的一件事是处理任意网格数据的管理,无论表示如何。
我的想法是,定义一个特征来强制执行函数签名,然后当我处理所有 GPU 内容时,用户可以处理序列化。这就是我所创造的特质:
pub enum GpuAttributeData
{
OwnedData(Vec<Vec<i8>>, Vec<u32>),
}
pub trait GpuSerializable
{
fn serialize(&self) -> GpuAttributeData;
}
Run Code Online (Sandbox Code Playgroud)
非常简单,给我几个数组。
当我测试板条箱内的东西时,它起作用了,但我将示例移到了板条箱外,即我在示例中包含以下代码片段:
impl <const N : usize> GpuSerializable for [Vertex; N]
{
fn serialize(&self) -> GpuAttributeData
{
let size = size_of::<Vertex>() * self.len();
let data = unsafe {
let mut data = Vec::<i8>::with_capacity(size);
copy_nonoverlapping(
self.as_ptr() as *const i8, data.as_ptr() as *mut i8, size);
data.set_len(size);
data
};
// let indices : Vec<usize> = (0..self.len()).into_iter().collect();
let indices = vec![0, 1, 2];
let …
Run Code Online (Sandbox Code Playgroud) 关于这个主题已经有一个非常受欢迎的问题,但我不完全理解答案。
目标是:
我需要一个“函数指针”列表(读取 Vec)来修改存储在程序中其他位置的数据。我能想到的最简单的例子是按下按键时调用的回调。因此,当按下任意键时,传递给该对象的所有函数都将按某种顺序调用。
阅读答案后,我不清楚如何才能列出这样的列表。听起来我需要将回调的类型限制为已知的类型,否则我不知道如何创建它的数组。
我也不清楚如何存储数据指针/引用。
说我有
struct Processor<CB>
where
CB: FnMut(),
{
callback: CB,
}
Run Code Online (Sandbox Code Playgroud)
就像答案所暗示的那样,我无法制作处理器阵列,可以吗?因为每个处理器在技术上都是不同的类型,具体取决于通用实例。
在 C 系列语言中,我通常将状态机实现为一系列 if else 语句和枚举,其中 if 语句检查机器处于哪个状态,并且主体执行状态转换,例如:
if(current_left_state == GLFW_PRESS && !left_pressed)
{
left_pressed = true;
return MouseInputState::LEFT_DOWN;
}
if(current_left_state == GLFW_PRESS && left_pressed)
{
left_pressed = true;
return MouseInputState::LEFT_DRAG;
}
if(current_left_state == GLFW_RELEASE && left_pressed)
{
left_pressed = false;
return MouseInputState::LEFT_UP;
}
if(current_right_state == GLFW_PRESS && !right_pressed)
{
right_pressed = true;
return MouseInputState::RIGHT_DOWN;
}
Run Code Online (Sandbox Code Playgroud)
Rust 有很多惯用的糖,这很好,我想知道是否有一种方法可以使用 Rust 的语法糖来制作更干净的状态机。
就像,一定有比这更好的方法:
MouseState::NoAction =>
{
if *button == glfw::MouseButtonLeft && *action == glfw::Action::Press
{
return MouseState::LeftDown;
}
if *button == glfw::MouseButtonRight …
Run Code Online (Sandbox Code Playgroud) 我对样条数据结构做了以下定义:
#[derive(Clone, Debug)]
pub struct BSpline
{
knots: Vec<f32>,
control_points: Vec<Vec3>,
/// Internal helper variable. Used to optimize repetetitive samplings on close
/// $t$ values.
last_t_index: usize,
order: usize,
}
impl BSpline
{
pub fn sample(&self, t: f32) -> Vec3
{
debug_assert!(self.control_points.len() >= self.order);
let t = f32::clamp(t, self.knots[0], *self.knots.last().unwrap());
let mut t_index = self.last_t_index;
while !(t >= self.knots[t_index] && t <= self.knots[t_index + 1])
{
t_index = (t_index + 1) % self.knots.len();
}
// TODO(low): find a better way …
Run Code Online (Sandbox Code Playgroud) 以下类型转换是否会在内存中创建一个新变量?下面的 printf 函数引用了它,并打印 1.23 作为答案。
#include<stdio.h>
int main(){
int num;
num = 1.23456;
printf("num = %.2f \n", (float)num);
*((float*) &num) = 1.23456;
printf("num = %.2f \n", *((float*)&num));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用实例渲染来绘制大量的立方体.现在,显然立方体中可见面的最大数量是3,这意味着就着色而言,我所做的工作量是所需的两倍.
因为这是实例化,所以我不能简单地只传递要绘制到着色器的几何体.但是如果在着色器中(我想象这将是几何形状或细分)我可以使用普通信息来丢弃基元,我可以减少不必要的操作数量.
例如,如果观察方向和表面法线之间的角度小于90度,我可以假设在当前方向前面有一个三角形,因此丢弃了这个给定的图元.
在管道中是否有一种方法可以确定是否需要片段并相应地丢弃它?
我已经阅读了在线文档和 VS code API 的源代码,但我仍然不清楚如何读取 JSON 用户设置和工作空间设置。我尝试寻找示例,但找不到仅显示如何执行此操作的内容。
本质上我想要一个名为“最大值”的设置值。然后我想从 TS scrypt 读取最大值。
该文档引导我在 activate 函数中编写以下两行:
const config = vscode.workspace.getConfiguration('extension', vscode.window.activeTextEditor.document.uri);
vscode.window.showInformationMessage(config.has('configuration').toString());
Run Code Online (Sandbox Code Playgroud)
在我添加的 package.json 文件中,在贡献下:
"configuration": {
"maximum":
{
"type": ["integer"],
"default": 40,
"description": "The level of alignment, how far the titles will extend horizontally"
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的输出是 false 。
我尝试了多个不同的输出,唯一一次我得到正确的结果是当第一个函数的参数是“启动”而第二个参数是“配置”时。
我无法仅从文档中了解参数需要是什么。也不应该在哪里指定该值。
说我想要的大小存储std::vector
在int
我有以下选项,据我所知:
int size = vector.size(); // Throws an implicit conversion warning
int size = (int)vector.size(); // C like typecasting is discouraged and forbidden in many code standards
int size = static_cast<int>(vector.size()); // This makes me want to gouge my eyes out (it's ugly)
Run Code Online (Sandbox Code Playgroud)
有没有其他选择可以避免上述所有问题?
我有一个图像 A。目标是将其缩小为图像,使图像的尺寸更小,但新图像中的像素不包含原始图像中不存在的值。换句话说,如果 $p \in A'$ 那么 $p \in A$。
我尝试在 python 中执行此操作,如下所示:
resized = cv2.resize(old_img, (1024, 1024), 0, 0, cv2.INTER_NEAREST)
Run Code Online (Sandbox Code Playgroud)
但是,当输入是二值图像(old_img 仅包含黑白像素)时,生成的图像包含灰度值(值不等于 0 或 255)。
这是实现中的错误吗?对我来说,没有像素以非原始值结束是一个硬性要求。
假设我们有这样的 C 代码:
typedef struct A { int i; } A;
typedef struct B { A* a; } B;
typedef struct C { A* a; } C;
int main(void)
{
A a = { .i = 42 };
B b = { .a = &a };
C c = { .a = &a };
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,A 是堆栈分配的,B 和 C 指向 A 所在的堆栈分配的内存。
我需要在 Rust 中做完全相同的事情,但每次我尝试创建多个可变引用时,它都会抱怨。
为了完成如此基本的事情而不得不与语言作斗争,这有点令人沮丧。