Shader class... appears to work
parent
952b924425
commit
dfecbdd4fb
120
src/main.rs
120
src/main.rs
|
@ -1,10 +1,116 @@
|
|||
use gl::types::*;
|
||||
|
||||
use sdl2::event::Event;
|
||||
use sdl2::keyboard::Keycode;
|
||||
|
||||
use std::convert::TryInto;
|
||||
use std::time::Duration;
|
||||
|
||||
const VERT_SHADER_SRC: &str =
|
||||
"
|
||||
#define lowp
|
||||
#define mediump
|
||||
#define highp
|
||||
#line 0
|
||||
uniform highp mat4 uni_model;
|
||||
uniform highp mat4 uni_viewproj;
|
||||
|
||||
attribute highp vec4 attr_pos;
|
||||
attribute mediump vec2 attr_uv;
|
||||
attribute lowp vec3 attr_normal;
|
||||
|
||||
varying lowp vec4 vary_color;
|
||||
varying mediump vec2 vary_uv;
|
||||
|
||||
void main (void) {
|
||||
vary_uv = attr_uv;
|
||||
|
||||
lowp vec4 light_color = vec4 (1.0);
|
||||
|
||||
vary_color = light_color;
|
||||
|
||||
vec4 world_pos = uni_model * attr_pos;
|
||||
|
||||
gl_Position = uni_viewproj * world_pos;
|
||||
}";
|
||||
|
||||
const FRAG_SHADER_SRC: &str =
|
||||
"
|
||||
#define lowp
|
||||
#define mediump
|
||||
#define highp
|
||||
#line 0
|
||||
uniform lowp sampler2D uni_texture;
|
||||
|
||||
varying lowp vec4 vary_color;
|
||||
varying mediump vec2 vary_uv;
|
||||
|
||||
void main (void) {
|
||||
gl_FragColor = texture2D (uni_texture, vary_uv) * vary_color;
|
||||
//gl_FragColor = vec4 (1.0, 0.0, 1.0, 1.0);
|
||||
}
|
||||
";
|
||||
|
||||
pub struct ShaderObject {
|
||||
id: u32,
|
||||
}
|
||||
|
||||
impl ShaderObject {
|
||||
pub fn id (&self) -> u32 {
|
||||
self.id
|
||||
}
|
||||
|
||||
pub fn new (shader_type: u32, source: &str) -> Result <ShaderObject, String>
|
||||
{
|
||||
let id = unsafe {
|
||||
gl::CreateShader (shader_type)
|
||||
};
|
||||
|
||||
let sources = [
|
||||
source.as_ptr () as *const i8,
|
||||
];
|
||||
|
||||
let lengths = [
|
||||
source.len ().try_into ().unwrap (),
|
||||
];
|
||||
|
||||
let success = unsafe {
|
||||
gl::ShaderSource (id, sources.len ().try_into ().unwrap (), sources.as_ptr (), lengths.as_ptr ());
|
||||
gl::CompileShader (id);
|
||||
|
||||
let mut success = 0;
|
||||
gl::GetShaderiv (id, gl::COMPILE_STATUS, &mut success);
|
||||
success == 1
|
||||
};
|
||||
|
||||
if success {
|
||||
Ok (ShaderObject {
|
||||
id,
|
||||
})
|
||||
}
|
||||
else {
|
||||
let mut info_log = vec! [0u8; 4096];
|
||||
let mut log_length = 0;
|
||||
|
||||
unsafe {
|
||||
gl::GetShaderInfoLog (id, (info_log.len () - 1).try_into ().unwrap (), &mut log_length, info_log.as_mut_ptr () as *mut i8);
|
||||
}
|
||||
|
||||
info_log.truncate (log_length.try_into ().unwrap ());
|
||||
|
||||
let info = String::from_utf8 (info_log).unwrap ();
|
||||
|
||||
Err (info)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ShaderObject {
|
||||
fn drop (&mut self) {
|
||||
unsafe {
|
||||
gl::DeleteShader (self.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main () {
|
||||
let sdl_context = sdl2::init ().unwrap ();
|
||||
let video_subsystem = sdl_context.video ().unwrap ();
|
||||
|
@ -15,9 +121,6 @@ fn main () {
|
|||
.build ()
|
||||
.unwrap ();
|
||||
|
||||
println! ("{:?}", &video_subsystem);
|
||||
println! ("{}", video_subsystem.current_video_driver ());
|
||||
|
||||
gl::load_with (|s| {
|
||||
let result = video_subsystem.gl_get_proc_address (s) as *const _;
|
||||
//println! ("{:?}", result);
|
||||
|
@ -29,9 +132,14 @@ fn main () {
|
|||
|
||||
let gl_ctx = window.gl_create_context ().unwrap ();
|
||||
|
||||
window.gl_make_current (&gl_ctx).unwrap ();
|
||||
|
||||
let vert_shader = ShaderObject::new (gl::VERTEX_SHADER, VERT_SHADER_SRC).unwrap ();
|
||||
let frag_shader = ShaderObject::new (gl::FRAGMENT_SHADER, FRAG_SHADER_SRC).unwrap ();
|
||||
|
||||
let mut event_pump = sdl_context.event_pump ().unwrap ();
|
||||
'running: loop {
|
||||
let mouse = event_pump.mouse_state ();
|
||||
let _mouse = event_pump.mouse_state ();
|
||||
|
||||
for event in event_pump.poll_iter() {
|
||||
match event {
|
||||
|
|
Loading…
Reference in New Issue