Я пытаюсь экспортировать свою игру OpenGL из C ++ в Rust и добиться двух вещей:
1. Распечатать сообщения об ошибках OpenGL на консоль.
2. Автозаполнение функций и констант GL в моей IDE (Visual Studio Код).
Я просто сгенерировал привязки OpenGL с помощью gl_generator ящик и скопировал файл bindings.rs
на мою машину go.
extern crate sdl2;
mod bindings;
use bindings as GL;
fn main() {
let sdl = sdl2::init().unwrap();
let mut event_pump = sdl.event_pump().unwrap();
let video_subsystem = sdl.video().unwrap();
let gl_attr = video_subsystem.gl_attr();
gl_attr.set_context_profile(sdl2::video::GLProfile::Core);
gl_attr.set_context_version(4, 5);
let window = video_subsystem.window("Window", 900, 700).opengl().resizable().build().unwrap();
let _gl_context = window.gl_create_context().unwrap();
let gl = GL::Gl::load_with(|s| video_subsystem.gl_get_proc_address(s) as *const std::os::raw::c_void);
unsafe{ gl.Viewport(0, 0, 900, 700); }
'main: loop {
unsafe {
gl.UseProgram(42); // <- error (^ GL error triggered: 1281)
gl.ClearColor(0.0, 0.3, 0.6, 1.0 );
gl.Clear(GL::COLOR_BUFFER_BIT);
}
window.gl_swap_window();
for event in event_pump.poll_iter() {
match event {
sdl2::event::Event::Quit {..} => { break 'main },
_ => {},
}
}
}
}
Проблема в том, что * Переменная 1011 *, в которой хранятся все функции, не является глобальной, и я не уверен, как ее использовать с различными модулями / функциями.
Причина, по которой все функции находятся внутри Gl
struct, заключается в том, что я использовал DebugStructGenerator
в моей функции сборки. Он печатает не только ошибки, но и все вызовы функций OpenGL (например, [OpenGL] ClearColor(0.0, 0.3, 0.6, 1.0)
). Было бы здорово, если бы печатались только сообщения об ошибках.
Мой build.rs
файл:
extern crate gl_generator;
use gl_generator::{Registry, Fallbacks, /*StructGenerator, GlobalGenerator,*/ DebugStructGenerator, Api, Profile};
use std::env;
use std::fs::File;
use std::path::Path;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let mut file_gl = File::create(&Path::new(&out_dir).join("bindings.rs")).unwrap();
let registry = Registry::new(Api::Gl, (4, 5), Profile::Core, Fallbacks::All, [ "GL_NV_command_list" ]);
registry.write_bindings(DebugStructGenerator, &mut file_gl).unwrap();
}