Guest User

Works

a guest
Jul 11th, 2026
49
0
252 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.76 KB | None | 0 0
  1. use glow::HasContext;
  2. use glow as gl;
  3.  
  4. const WIDTH: u32 = 800;
  5. const HEIGHT: u32 = 600;
  6.  
  7. /// # Safety:
  8. /// * `T` must have no padding bits.
  9. unsafe fn as_u8_slice<T>(slice: &[T]) -> &[u8] {
  10.     unsafe {
  11.         core::slice::from_raw_parts(
  12.             slice.as_ptr().cast(),
  13.             std::mem::size_of_val(slice)
  14.         )
  15.     }
  16. }
  17.  
  18. type PreludeReturn = (
  19.     sdl2::Sdl,
  20.     sdl2::EventPump,
  21.     sdl2::VideoSubsystem,
  22.     sdl2::video::Window,
  23.     sdl2::video::GLContext,
  24.     glow::Context,
  25. );
  26.  
  27. unsafe fn prelude() -> PreludeReturn {
  28.     let sdl = sdl2::init().unwrap();
  29.     let event_loop = sdl.event_pump().unwrap();
  30.     let video = sdl.video().unwrap();
  31.    
  32.     let gl_attr = video.gl_attr();
  33.     gl_attr.set_context_profile(sdl2::video::GLProfile::Core);
  34.     gl_attr.set_context_version(3, 3);
  35.  
  36.     let window = video.window(
  37.         "opengl!!",
  38.         WIDTH,
  39.         HEIGHT,
  40.     ).opengl()
  41.     .resizable()
  42.     .build()
  43.     .unwrap();
  44.  
  45.     let ctx = window.gl_create_context().unwrap();
  46.  
  47.     let gl = unsafe {
  48.         glow::Context::from_loader_function(
  49.             |s| video.gl_get_proc_address(s) as *const _
  50.         )
  51.     };
  52.    
  53.     unsafe {
  54.         gl.viewport(0, 0, WIDTH as i32, HEIGHT as i32);
  55.     }
  56.  
  57.     (sdl, event_loop, video, window, ctx, gl)
  58. }
  59.  
  60. fn main() {unsafe {
  61.     let (
  62.         _sdl,
  63.         mut event_loop,
  64.         _video,
  65.         window,
  66.         _ctx,
  67.         gl
  68.     ) = prelude();
  69.  
  70.     let vss = r#"#version 330 core
  71.    layout (location = 0) in vec3 aPos;
  72.  
  73.    void main() {
  74.        gl_Position = vec4(aPos, 1.0);
  75.    }"#;
  76.     let vshader = gl.create_shader(gl::VERTEX_SHADER)
  77.         .unwrap();
  78.     gl.shader_source(vshader, vss);
  79.     gl.compile_shader(vshader);
  80.     if !gl.get_shader_compile_status(vshader) {
  81.         let err = gl.get_shader_info_log(vshader);
  82.         panic!("Vertex shader compilation error: {err}");
  83.     }
  84.  
  85.     let fss = r#"#version 330 core
  86.    out vec4 FragColor;
  87.    void main()
  88.    {
  89.        FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
  90.    }"#;
  91.     let fshader = gl.create_shader(gl::FRAGMENT_SHADER)
  92.         .unwrap();
  93.     gl.shader_source(fshader, fss);
  94.     gl.compile_shader(fshader);
  95.     if !gl.get_shader_compile_status(fshader) {
  96.         let err = gl.get_shader_info_log(fshader);
  97.         panic!("Fragment shader compilation error: {err}");
  98.     }
  99.  
  100.     let shader_program = gl.create_program().unwrap();
  101.     gl.attach_shader(shader_program, vshader);
  102.     gl.attach_shader(shader_program, fshader);
  103.     gl.link_program(shader_program);
  104.  
  105.     gl.use_program(Some(shader_program));
  106.  
  107.     gl.delete_shader(vshader);
  108.     gl.delete_shader(fshader);
  109.  
  110.     let vertices1: &[f32] = &[
  111.         -1.0, -0.5, 0.0,
  112.         0.0, -0.5, 0.0,
  113.         -0.5, 0.5, 0.0,
  114.     ];
  115.  
  116.     let vertices2: &[f32] = &[
  117.         0.0, -0.5, 0.0,
  118.         1.0, -0.5, 0.0,
  119.         0.5, 0.5, 0.0,
  120.     ];
  121.  
  122.     let vao1 = gl.create_vertex_array().unwrap();
  123.     let vao2 = gl.create_vertex_array().unwrap();
  124.  
  125.     let vbo1 = gl.create_buffer().unwrap();
  126.     let vbo2 = gl.create_buffer().unwrap();
  127.    
  128.     gl.bind_vertex_array(Some(vao1));
  129.     gl.bind_buffer(gl::ARRAY_BUFFER, Some(vbo1));
  130.     gl.buffer_data_u8_slice(
  131.         gl::ARRAY_BUFFER,
  132.         as_u8_slice(vertices1),
  133.         gl::STATIC_DRAW,
  134.     );
  135.     gl.vertex_attrib_pointer_f32(
  136.         0,
  137.         3,
  138.         gl::FLOAT,
  139.         false,
  140.         3 * size_of::<f32>() as i32,
  141.         0,
  142.     );
  143.     gl.enable_vertex_attrib_array(0);
  144.  
  145.     gl.bind_vertex_array(Some(vao2));
  146.     gl.bind_buffer(gl::ARRAY_BUFFER, Some(vbo2));
  147.     gl.buffer_data_u8_slice(
  148.         gl::ARRAY_BUFFER,
  149.         as_u8_slice(vertices2),
  150.         gl::STATIC_DRAW,
  151.     );
  152.     gl.vertex_attrib_pointer_f32(
  153.         0,
  154.         3,
  155.         gl::FLOAT,
  156.         false,
  157.         3 * size_of::<f32>() as i32,
  158.         0,
  159.     );
  160.     gl.enable_vertex_attrib_array(0);
  161.  
  162.     gl.bind_vertex_array(None);
  163.  
  164.     gl.clear_color(0.2, 0.3, 0.3, 1.0);
  165.     gl.clear(gl::COLOR_BUFFER_BIT);
  166.  
  167.     gl.bind_vertex_array(Some(vao2));
  168.     gl.draw_arrays(gl::TRIANGLES, 0, 3);
  169.     gl.bind_vertex_array(Some(vao1));
  170.     gl.draw_arrays(gl::TRIANGLES, 0, 3);
  171.  
  172.     window.gl_swap_window();
  173.  
  174.     let mut running = true;
  175.     while running {
  176.         for event in event_loop.poll_iter() {
  177.             use sdl2::{event::{Event, WindowEvent}, keyboard::Keycode};
  178.             match event {
  179.                 Event::Quit { .. } | Event::KeyDown { keycode: Some(Keycode::Escape), .. }
  180.                     => running = false,
  181.                 Event::Window { win_event: WindowEvent::Resized(w, h),.. } =>
  182.                     gl.viewport(0, 0, w, h),
  183.                 _ => {},
  184.             }
  185.         }
  186.  
  187.         std::thread::sleep(std::time::Duration::from_secs_f32(1.0 / 60.0));
  188.     }
  189. }}
Advertisement
Add Comment
Please, Sign In to add comment