gl-rs | An OpenGL function pointer loader for Rust | Graphics library
kandi X-RAY | gl-rs Summary
kandi X-RAY | gl-rs Summary
This repository contains the necessary building blocks for OpenGL wrapper libraries. For more information on each crate, see their respective READMEs listed below.
Support
Quality
Security
License
Reuse
Top functions reviewed by kandi - BETA
Currently covering the most popular Java, JavaScript and Python libraries. See a Sample of gl-rs
gl-rs Key Features
gl-rs Examples and Code Snippets
Community Discussions
Trending Discussions on gl-rs
QUESTION
I am trying to make a plugin-based game in Rust, and I am having some difficulties. The way I am making my plugins is through the method shared on this question. At runtime, I will dynamically load all the necessary functions from the plugins, and run them later when they need to be run.
My problem is in using OpenGL to draw things to the screen with the code of one of these plugins. In my game's executable, I load all the functions from the plugins (currently only one function), create the GLFW window and load the OpenGL function pointers, following the code shown below, from here.
ANSWER
Answered 2021-Feb-20 at 04:48while not loading the function pointers in again in each plugin?
You can't. Not unless the executable you're working with exports all of those OpenGL function pointers, or you're importing a common DLL that exports those function pointers.
Each DLL and executable is distinct and for the most part entirely separate from other executables. Unless they explicitly share something, then it's not shared. And most programs don't explicitly share their OpenGL function pointers, so you'll have to load them yourself.
QUESTION
I was playing around with gl-rs
and in the original opengl tutorial they set VertexAttribPointer
and it's offset with:
ANSWER
Answered 2020-Jan-12 at 08:22The last parameter (offset) has to be cast to *const gl::types::GLvoid
:
QUESTION
#[cfg(windows)] extern crate winapi;
#[cfg(windows)] use winapi::shared::windef::HWND;
#[cfg(windows)] use winapi::shared::windef::HMENU;
#[cfg(windows)] use winapi::shared::windef::HBRUSH;
#[cfg(windows)] use winapi::shared::minwindef::HINSTANCE;
#[cfg(windows)] use winapi::shared::minwindef::UINT;
#[cfg(windows)] use winapi::shared::minwindef::DWORD;
#[cfg(windows)] use winapi::shared::minwindef::WPARAM;
#[cfg(windows)] use winapi::shared::minwindef::LPARAM;
#[cfg(windows)] use winapi::shared::minwindef::LRESULT;
#[cfg(windows)] use winapi::um::winnt::LPCWSTR;
#[cfg(windows)] use winapi::um::winuser::WS_OVERLAPPEDWINDOW;
#[cfg(windows)] use winapi::um::winuser::WS_VISIBLE;
#[cfg(windows)] use winapi::um::winuser::WNDCLASSW;
#[cfg(windows)] use std::os::windows::ffi::OsStrExt;
#[cfg(windows)] use std::ffi::OsStr;
#[cfg(windows)] use std::os::raw::c_void;
#[cfg(windows)] use winapi::um::libloaderapi::GetProcAddress;
#[cfg(windows)] use gl::types::*;
// Vertex data
static VERTEX_DATA: [GLfloat; 6] = [0.0, 0.5, 0.5, -0.5, -0.5, -0.5];
// Shader sources
static VS_SRC: &'static str = "
#version 150
in vec2 position;
void main() {
gl_Position = vec4(position, 0.0, 1.0);
}";
static FS_SRC: &'static str = "
#version 150
out vec4 out_color;
void main() {
out_color = vec4(1.0, 1.0, 1.0, 1.0);
}";
mod gl
{
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
}
#[cfg(windows)]
fn to_wstring(str : &str) -> Vec
{
let v : Vec =
OsStr::new(str).encode_wide().chain(Some(0).into_iter()).collect();
v
}
#[cfg(windows)]
pub unsafe extern "system" fn window_proc(h_wnd :HWND,
msg :UINT, w_param :WPARAM, l_param :LPARAM) -> LRESULT
{
if msg == winapi::um::winuser::WM_DESTROY {
winapi::um::winuser::PostQuitMessage(0i32);
}
return winapi::um::winuser::DefWindowProcW(h_wnd, msg, w_param, l_param);
}
fn draw_gl_scene(window_width: i32, window_height: i32,
h_dc: winapi::shared::windef::HDC)
{
unsafe
{
let module = winapi::um::libloaderapi::LoadLibraryW(to_wstring("opengl32.dll") .as_ptr());
// gl::load_with(|s| GetProcAddress(module,
// s.as_ptr() as *const i8) as *const c_void);
gl::Viewport::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::Viewport::is_loaded() {
gl::Viewport(0, 0, window_width, window_height);
} else {
panic!("gl::Viewport was not loaded")
}
gl::ClearColor::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::ClearColor::is_loaded() {
gl::ClearColor(0.12109375f32, 0.12109375f32, 0.12109375f32, 1.0f32);
} else {
panic!("gl::ClearColor was not loaded")
}
gl::GetError::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
let error_check_value: GLenum = gl::GetError();
/*
gl::CreateShader::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
let mut vertex_shader_id = 0u32;
if gl::CreateShader::is_loaded() {
vertex_shader_id = gl::CreateShader(gl::VERTEX_SHADER);
} else {
panic!("gl::CreateShader was not loaded")
}
*/
/*
let c_str = std::ffi::CString::new(VS_SRC.as_bytes()).unwrap();
gl::ShaderSource::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::ShaderSource::is_loaded() {
gl::ShaderSource(vertex_shader_id, 1, &c_str.as_ptr(), std::ptr::null_mut());
} else {
// panic!("gl::ShaderSource was not loaded")
}
gl::CompileShader::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::CompileShader::is_loaded() {
gl::CompileShader(vertex_shader_id);
} else {
// panic!("gl::CompileShader was not loaded")
}
let mut vertex_array_id: GLuint = 0u32;
gl::GenVertexArrays::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::GenVertexArrays::is_loaded() {
gl::GenVertexArrays(1, &mut vertex_array_id as *mut u32);
} else {
panic!("gl::GenVertexArrays was not loaded")
}
*/
gl::Clear::load_with(|s| GetProcAddress(module,
s.as_ptr() as *const i8) as *const c_void);
if gl::Clear::is_loaded() {
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
} else {
panic!("gl::Clear was not loaded")
}
winapi::um::wingdi::SwapBuffers(h_dc);
}
}
fn main()
{
unsafe
{
let class_name = to_wstring("OpenGL");
let h_instance = winapi::um::libloaderapi::GetModuleHandleW(std::ptr::null_mut());
let wnd = WNDCLASSW {
style: 0,
lpfnWndProc: Some(window_proc),
cbClsExtra: 0,
cbWndExtra: 0,
hInstance: h_instance,
hIcon: winapi::um::winuser::LoadIconW(0 as HINSTANCE,
winapi::um::winuser::IDI_APPLICATION),
hCursor: winapi::um::winuser::LoadCursorW(0 as HINSTANCE,
winapi::um::winuser::IDI_APPLICATION),
hbrBackground: 16 as HBRUSH,
lpszMenuName: 0 as LPCWSTR,
lpszClassName: class_name.as_ptr(),
};
winapi::um::winuser::RegisterClassW(&wnd);
let window_width = 640;
let window_height = 480;
let h_wnd_window = winapi::um::winuser::CreateWindowExW(0, class_name.as_ptr(),
to_wstring("OpenGL Example").as_ptr(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0, 0, window_width, window_height, 0 as HWND, 0 as HMENU, h_instance,
std::ptr::null_mut());
let mut msg = winapi::um::winuser::MSG {
hwnd : 0 as HWND,
message : 0 as UINT,
wParam : 0 as WPARAM,
lParam : 0 as LPARAM,
time : 0 as DWORD,
pt : winapi::shared::windef::POINT { x: 0, y: 0, },
};
let h_dc = winapi::um::winuser::GetDC(h_wnd_window);
let pfd = winapi::um::wingdi::PIXELFORMATDESCRIPTOR {
nSize: std::mem::size_of::() as u16,
nVersion: 1,
dwFlags: winapi::um::wingdi::PFD_DRAW_TO_WINDOW
| winapi::um::wingdi::PFD_SUPPORT_OPENGL | winapi::um::wingdi::PFD_DOUBLEBUFFER,
iPixelType: winapi::um::wingdi::PFD_TYPE_RGBA,
cColorBits: 64,
cRedBits: 0,
cRedShift: 0,
cGreenBits: 0,
cGreenShift: 0,
cBlueBits: 0,
cBlueShift: 0,
cAlphaBits: 0,
cAlphaShift: 0,
cAccumBits: 0,
cAccumRedBits: 0,
cAccumGreenBits: 0,
cAccumBlueBits: 0,
cAccumAlphaBits: 0,
cDepthBits: 32,
cStencilBits: 8,
cAuxBuffers: 0,
iLayerType: winapi::um::wingdi::PFD_MAIN_PLANE,
bReserved: 0,
dwLayerMask: 0,
dwVisibleMask: 0,
dwDamageMask: 0,
};
let pixel_format = winapi::um::wingdi::ChoosePixelFormat(h_dc,
&pfd as *const winapi::um::wingdi::PIXELFORMATDESCRIPTOR);
winapi::um::wingdi::SetPixelFormat(h_dc, pixel_format,
&pfd as *const winapi::um::wingdi::PIXELFORMATDESCRIPTOR);
let h_rc = winapi::um::wingdi::wglCreateContext(h_dc);
winapi::um::wingdi::wglMakeCurrent(h_dc, h_rc);
winapi::um::winuser::ShowWindow(h_wnd_window, winapi::um::winuser::SW_SHOW);
loop
{
if winapi::um::winuser::PeekMessageW(&mut msg, 0u32 as HWND, 0u32, 0u32,
winapi::um::winuser::PM_REMOVE) > 0i32 {
if msg.message == winapi::um::winuser::WM_QUIT {
break;
} else {
winapi::um::winuser::TranslateMessage(&mut msg);
winapi::um::winuser::DispatchMessageW(&mut msg);
}
} else {
draw_gl_scene(window_width, window_height, h_dc);
}
}
}
}
...ANSWER
Answered 2018-Feb-28 at 16:40Read the wiki and this too about loading OGL pointers.
Briefly, for Windows:
GetProcAddress
is only valid for OpenGL <= 1.1wglGetProcAddress
is only valid for OpenGL > 1.1
Also, the use of shaders requires OpenGL >= 2.0. Better go with OGL >= 3.2 Core Profile. For this context:
- You need a proper context for OpenGL >= 3.0, which is created with the use of
wglCreateContextAttribsARB
. - You need a valid and current context to get the pointer to
wglCreateContextAttribsARB
itself by usingwglGetProcAddress
. - This context may be temporary. It can be created with
wglCreateContext
. You can delete it after you got that pointer; and the create the "real" context.
.
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install gl-rs
Rust is installed and managed by the rustup tool. Rust has a 6-week rapid release process and supports a great number of platforms, so there are many builds of Rust available at any time. Please refer rust-lang.org for more information.
Support
Reuse Trending Solutions
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesStay Updated
Subscribe to our newsletter for trending solutions and developer bootcamps
Share this Page