Настройка Rust и OpenGL - PullRequest
       9

Настройка Rust и OpenGL

0 голосов
/ 04 марта 2020

Я пытаюсь экспортировать свою игру 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...