{"id":9063,"date":"2023-01-19T21:28:39","date_gmt":"2023-01-19T12:28:39","guid":{"rendered":"https:\/\/minnano.app\/support\/?p=9063"},"modified":"2023-01-21T11:51:19","modified_gmt":"2023-01-21T02:51:19","slug":"env_pri_cat_19","status":"publish","type":"post","link":"https:\/\/minnano.app\/support\/2023\/01\/19\/env_pri_cat_19\/","title":{"rendered":"\u30b2\u30fc\u30e0\u5236\u4f5c \u74b0\u5883\u539f\u732b 19\u65e5\u76ee"},"content":{"rendered":"\n<p><a href=\"https:\/\/minnano.app\/support\/2023\/01\/18\/env_pri_cat_18\/\">\u6628\u65e5\u306f\u3053\u306e\u30b6\u30de<\/a>\u3067\u3057\u305f\u304c\u3001\u4eca\u65e5\u306f\u5931\u6557\u3057\u305f\u539f\u56e0\u3092\u7279\u5b9a\u3057\u3066<a href=\"https:\/\/minnano.app\/support\/2023\/01\/08\/env_pri_cat_8\/\">\u6c34\u5206\u5b50\u753b\u50cf<\/a>\u3092\u30a2\u30eb\u30d5\u30a1\u5024\u3092\u8003\u616e\u3057\u3066\u6b63\u3057\u304f\u63cf\u753b\u51fa\u6765\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p><p lang=\"\" style=\"font-family:'MS PGothic','\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af',sans-serif;font-size: 16px; line-height:18px;\"><script type=\"text\/javascript\" src=\"https:\/\/minnano.app\/textmanga\/assets\/js\/caller\/text_manga_0000000102.js?v=11\"><\/script><span name=\"text_manga_0000000102_001\">(\u0a6d&nbsp;\u02c3\u0323\u0323\u0325&nbsp;\u03c9\u02c2\u0323\u0323\u0325)\u0a6d\u0941\u207e\u207e<\/span><\/p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/minnano.app\/support\/wp-content\/uploads\/2023\/01\/pointsprite2-1024x808.png\" alt=\"\" class=\"wp-image-9064\" width=\"512\" height=\"404\" srcset=\"https:\/\/minnano.app\/support\/wp-content\/uploads\/2023\/01\/pointsprite2-1024x808.png 1024w, https:\/\/minnano.app\/support\/wp-content\/uploads\/2023\/01\/pointsprite2-300x237.png 300w, https:\/\/minnano.app\/support\/wp-content\/uploads\/2023\/01\/pointsprite2-768x606.png 768w, https:\/\/minnano.app\/support\/wp-content\/uploads\/2023\/01\/pointsprite2.png 1202w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure>\n<\/div>\n\n\n<p>\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u3067\u3059\u3002\u4e00\u90e8<a href=\"http:\/\/nercury.github.io\/rust\/opengl\/tutorial\/2018\/02\/11\/opengl-in-rust-from-scratch-04-triangle.html\">\u3053\u306e\u30da\u30fc\u30b8<\/a>\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>#!&#91;cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")]\nextern crate sdl2;\nextern crate gl;\nextern crate image;\n\npub mod render_gl;\n\nuse std::path::Path;\nuse std::os::raw::c_void;\n\nuse sdl2::event::Event;\nuse sdl2::keyboard::Keycode;\nuse sdl2::video::GLProfile;\n\nfn main() {\n    let window_w: u32= 800;\n    let window_h: u32= 600;\n\n    let sdl_context = sdl2::init().unwrap();\n    let video_subsystem = sdl_context.video().unwrap();\n    \n    let gl_attr = video_subsystem.gl_attr();\n    gl_attr.set_context_profile(GLProfile::Core);\n    gl_attr.set_context_version(4, 5);\n\n    let window = video_subsystem.window(\"\u74b0\u5883\u539f\u732b\", window_w, window_h)\n        .opengl()\n        .resizable()    \/\/ .fullscreen_desktop()\n        .build()\n        .unwrap();\n\n\n    let _ctx = window.gl_create_context().unwrap();\n    gl::load_with(|name| video_subsystem.gl_get_proc_address(name) as *const _);\n    \n    debug_assert_eq!(gl_attr.context_profile(), GLProfile::Core);\n    debug_assert_eq!(gl_attr.context_version(), (4, 5));\n\n    \/\/ shader program\n    use std::ffi::CString;\n    let vert_shader = render_gl::Shader::from_vert_source(&amp;CString::new(include_str!(\"triangle.vert\")).unwrap()).unwrap();\n    let frag_shader = render_gl::Shader::from_frag_source(&amp;CString::new(include_str!(\"triangle.frag\")).unwrap()).unwrap();\n    let shader_program = render_gl::Program::from_shaders(&amp;&#91;vert_shader, frag_shader]).unwrap();\n\n    \/\/ texture\n    let img = image::open(&amp;Path::new(\"resources\/textures\/drop.png\")).expect(\"Failed to load texture\");\n    let format = match img {\n        image::DynamicImage::ImageLuma8(_) =&gt; gl::RED,\n        image::DynamicImage::ImageLumaA8(_) =&gt; gl::RG,\n        image::DynamicImage::ImageRgb8(_) =&gt; gl::RGB,\n        image::DynamicImage::ImageRgba8(_) =&gt; gl::RGBA,\n        _ =&gt; panic!(\"unknown format.\")\n    };\n    let mut texture = 0;\n    unsafe {\n        gl::GenTextures(1, &amp;mut texture);\n        gl::BindTexture(gl::TEXTURE_2D, texture);\n        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::REPEAT as i32);\n        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::REPEAT as i32);\n        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST as i32);\n        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST as i32);\n        let data = img.as_bytes();\n        gl::TexImage2D(gl::TEXTURE_2D,\n                       0,\n                       format as i32,\n                       img.width() as i32,\n                       img.height() as i32,\n                       0,\n                       format,\n                       gl::UNSIGNED_BYTE,\n                       &amp;data&#91;0] as *const u8 as *const c_void);\n        gl::GenerateMipmap(gl::TEXTURE_2D);\n    }\n\n    \/\/ vertex buffer object\n    let vertices: Vec&lt;f32&gt; = vec!&#91;-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0];\n    let mut vbo: gl::types::GLuint = 0;\n    unsafe {\n        gl::GenBuffers(1, &amp;mut vbo);\n    }\n    unsafe {\n        gl::BindBuffer(gl::ARRAY_BUFFER, vbo);\n        gl::BufferData(\n            gl::ARRAY_BUFFER,                                                       \n            (vertices.len() * std::mem::size_of::&lt;f32&gt;()) as gl::types::GLsizeiptr,\n            vertices.as_ptr() as *const gl::types::GLvoid,\n            gl::STATIC_DRAW,\n        );\n        gl::BindBuffer(gl::ARRAY_BUFFER, 0);\n    }\n    \/\/ vertex array object\n    let mut vao: gl::types::GLuint = 0;\n    unsafe {\n        gl::GenVertexArrays(1, &amp;mut vao);\n    }\n    unsafe {\n        gl::BindVertexArray(vao);\n        gl::BindBuffer(gl::ARRAY_BUFFER, vbo);\n        gl::EnableVertexAttribArray(0); \/\/ layout (location = 0)\n        gl::VertexAttribPointer(\n            0,         \/\/ index\n            3,         \/\/ number of components\n            gl::FLOAT, \/\/ data type\n            gl::FALSE, \/\/ normalized\n            (3 * std::mem::size_of::&lt;f32&gt;()) as gl::types::GLint, \/\/ stride \n            std::ptr::null(),                                     \/\/ offset \n        );\n        gl::BindBuffer(gl::ARRAY_BUFFER, 0);\n        gl::BindVertexArray(0);\n    }\n\n    \/\/ set up\n    unsafe {\n        gl::Viewport(0, 0, window_w as i32, window_h as i32);\n        gl::ClearColor(0.6, 0.0, 0.8, 1.0);\n        gl::Enable(gl::VERTEX_PROGRAM_POINT_SIZE);\n        gl::Enable(gl::BLEND);\n        gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ONE, gl::ONE);\n    }\n\n    let mut event_pump = sdl_context.event_pump().unwrap();\n\n    'running: loop {\n        for event in event_pump.poll_iter() {\n            match event {\n                Event::Quit {..} | Event::KeyDown { keycode: Some(Keycode::Escape), .. } =&gt; {\n                    break 'running\n                },\n                _ =&gt; {}\n            }\n        }\n        unsafe {\n            gl::Clear(gl::COLOR_BUFFER_BIT);\n        }\n        \/\/ draw point sprites\n        shader_program.set_used();\n        unsafe {\n            gl::BindVertexArray(vao);\n            gl::DrawArrays(\n                gl::POINTS, \/\/ mode\n                0,             \/\/ starting index\n                3,             \/\/ number of indices\n            );\n        }\n        \/\/ swap window\n        window.gl_swap_window();\n\n        ::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 \/ 60));\n    }\n}<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/minnano.app\/support\/2023\/01\/21\/env_pri_cat_20\/\">\u6b21\u306e\u65e5<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6628\u65e5\u306f\u3053\u306e\u30b6\u30de\u3067\u3057\u305f\u304c\u3001\u4eca\u65e5\u306f\u5931\u6557\u3057\u305f\u539f\u56e0\u3092\u7279\u5b9a\u3057\u3066\u6c34\u5206\u5b50\u753b\u50cf\u3092\u30a2\u30eb\u30d5\u30a1\u5024\u3092\u8003\u616e\u3057\u3066\u6b63\u3057\u304f\u63cf\u753b\u51fa\u6765\u307e\u3057\u305f\u3002 (\u0a6d&nbsp;\u02c3\u0323\u0323\u0325&nbsp;\u03c9\u02c2\u0323\u0323\u0325)\u0a6d\u0941\u207e\u207e \u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u3067\u3059\u3002\u4e00\u90e8\u3053\u306e\u30da\u30fc\u30b8\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3063\u3066\u3044 &hellip; <a href=\"https:\/\/minnano.app\/support\/2023\/01\/19\/env_pri_cat_19\/\" class=\"more-link\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">\u30b2\u30fc\u30e0\u5236\u4f5c \u74b0\u5883\u539f\u732b 19\u65e5\u76ee<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[],"class_list":["post-9063","post","type-post","status-publish","format-standard","hentry","category-23"],"_links":{"self":[{"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/posts\/9063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/comments?post=9063"}],"version-history":[{"count":6,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/posts\/9063\/revisions"}],"predecessor-version":[{"id":9074,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/posts\/9063\/revisions\/9074"}],"wp:attachment":[{"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/media?parent=9063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/categories?post=9063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/minnano.app\/support\/wp-json\/wp\/v2\/tags?post=9063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}