gpt4 book ai didi

opengl - 如何在Rust中将数据正确传递给openGL功能

转载 作者:行者123 更新时间:2023-12-03 11:45:02 25 4
gpt4 key购买 nike

我正在尝试在Rust中抽象openGL。我使用glutin与openGL进行通信(here是我开始使用的代码)。我在提取Uniforms时遇到问题,实际上它们随机将-1作为位置(相同的代码有时有效,有时无效)。
我检查了该程序是否正在使用中,因此开始怀疑将数据发送到openGL的方式是否有问题:

// value is initialised here

let name = name.to_string();
let location;
unsafe {
location = gl.GetUniformLocation(program.get_id(), name.as_ptr() as *const GLchar);
};

match value {
UniformType::Float(v) => unsafe {
gl.Uniform1f(location, v);
},
UniformType::Float4(v) => unsafe {
gl.Uniform4fv(location, 1, &v[0]);
},
UniformType::Texture(tex_id) => unsafe {
gl.Uniform1i(location, tex_id);
},
UniformType::Mat4x4(v) => unsafe {
gl.UniformMatrix4fv(location, 1, gl::FALSE, &v[0]);
},
_ => {
panic!("Uniform::new This uniform type is unknown");
}
}

// this scope ends and value if freed
在调用gl.Uniform之后 value被释放,这是一个问题吗?如果是,为什么?我在网上阅读到只有绘画调用是异步的。

编辑:调试
均匀地在着色器内部使用这些制服。
提供正确数量的 Activity 制服,甚至将那些以 -1作为位置的制服也计算在内:
let mut param = 0;
unsafe {
gl.GetProgramiv(program.get_id(), gl::ACTIVE_UNIFORMS, &mut param);
}
println!("Number of active uniforms: {}", param);
始终给出 'no error':
let err;
unsafe {
err = gl.GetError();
}
match err {
gl::NO_ERROR => {
println!("Uniform '{}': no error", name);
}
gl::INVALID_VALUE => {
println!("Uniform '{}': invalid value", name);
}
gl::INVALID_OPERATION => {
println!("Uniform '{}': invalid operation", name);
}
_ => {
println!("Uniform: '{}' error: {}", name, err);
}
}

最佳答案

根据GetUniformLocation的文档:

This function returns -1 if name​ does not correspond to an active uniform variable in program​, if name​ starts with the reserved prefix "gl_", or if name​ is associated with an atomic counter or a named uniform block.


因此,您不会对gl调用进行错误检查,并且在某些情况下,您可能错误地调用了 GetUniformLocation,这可能导致“有时它可以工作,有时却不起作用”。

关于opengl - 如何在Rust中将数据正确传递给openGL功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63339027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com