使用 Silk.NET 创建 OpenGL 空窗口项目例子
本文告诉大家如何使用 Silk.NET 创建 OpenGL 空窗口项目。在 dotnet 基金会下,开源维护 Silk.NET 仓库,此仓库提供了渲染相关的封装逻辑,包括 DX 和 OpenGL 等等的封装,利用此封装可以用来代替原有的 SharpDx 等库。这是一个全新写的项目,使用上了 dotnet 和 C# 很多新的特性,相对来说也很活跃,我准备开始入坑这个项目
本文的例子完全是从 https://github.com/dotnet/Silk.NET 里面抄的,这是官方的使用 OpenGL 的例子
当前是 2021.12.22 官方完成的应用高层封装的只有 OpenGL 一个,加上 Vulkan 版本。基础底层封装完成了 DirectX 系列(但还完成没有 D2D 部分)和 OpenAL OpenCL OpenGL OpenXR Vulkan SDL 等
本文的例子是采用高层封装的 OpenGL 创建空窗口。根据官方 OpenGL Tutorials 的 Tutorial 1.1 - Hello Window
的代码,只需一个 Program 类即可完成启动应用
在开始之前,先通过 NuGet 安装 Silk.NET 库,对于新项目格式,可以编辑 csproj 项目文件,修改为如下代码
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Silk.NET" Version="2.11.0" />
</ItemGroup>
</Project>
在 Main 函数里面,使用进行创建窗口。创建窗口需要初始化创建所需参数,在 Silk.NET 提供了预设的选项,如下面代码
var options = WindowOptions.Default;
此预设的代码等同于如下配置
var options = new WindowOptions
(
true,
new Vector2D<int>(50, 50),
new Vector2D<int>(1280, 720),
0.0,
0.0,
new GraphicsAPI
(
ContextAPI.OpenGL,
ContextProfile.Core,
ContextFlags.ForwardCompatible,
new APIVersion(3, 3)
),
"",
WindowState.Normal,
WindowBorder.Resizable,
false,
false,
VideoMode.Default
);
通过 GraphicsAPI 可以看到默认采用的是 OpenGL 作为渲染。在 ContextAPI 可选的参数,当前有三个,但是如下面代码注释,当前还没有完成 Vulkan 的高层封装
/// <summary>
/// Represents which API the graphics context should use.
/// </summary>
public enum ContextAPI
{
/// <summary>
/// Don't use any API. This is necessary for linking an external API, such as Vulkan, to the window.
/// </summary>
None = 0,
/// <summary>
/// Use Vulkan. Silk.NET doesn't support this yet.
/// </summary>
Vulkan,
/// <summary>
/// Use core OpenGL. This is standard for software intended for desktop computers.
/// </summary>
OpenGL,
/// <summary>
/// Use OpenGL ES. This is standard for software intended to be compatible with embedded systems, such as phones.
/// </summary>
OpenGLES
}
获取到默认的创建选项之后,如果需要修改窗口创建参数,可以修改对应的属性。例如修改窗口尺寸等
options.Size = new Vector2D<int>(800, 600);
options.Title = "LearnOpenGL with Silk.NET";
完成窗口创建参数配置,即可通过 Silk.NET.Windowing.Window 的 Create 方法创建窗口,如下面代码
private static IWindow _window;
private static void Main(string[] args)
{
//Create a window.
var options = WindowOptions.Default;
options.Size = new Vector2D<int>(800, 600);
options.Title = "LearnOpenGL with Silk.NET";
_window = Window.Create(options);
}
完成窗口创建之后,可以使用 Run 方法执行代码
//Run the window.
_window.Run();
在执行 Run 方法时,将会和 WPF 一样开启消息循环。为了实现窗口里面的初始化逻辑,需要在 Run 之间加上事件
_window.Load += OnLoad;
_window.Update += OnUpdate;
_window.Render += OnRender;
修改之后的 Main 函数如下
private static void Main(string[] args)
{
//Create a window.
var options = WindowOptions.Default;
options.Size = new Vector2D<int>(800, 600);
options.Title = "LearnOpenGL with Silk.NET";
_window = Window.Create(options);
//Assign events.
_window.Load += OnLoad;
_window.Update += OnUpdate;
_window.Render += OnRender;
//Run the window.
_window.Run();
}
在 OnLoad 里面,可以进行很多初始化逻辑,例如获取输入键盘内容,如下面代码
private static void OnLoad()
{
//Set-up input context.
IInputContext input = _window.CreateInput();
for (int i = 0; i < input.Keyboards.Count; i++)
{
input.Keyboards[i].KeyDown += KeyDown;
}
}
默认拿到的键盘只有一个,在 KeyDown 函数,可以通过参数判断当前按键
private static void KeyDown(IKeyboard arg1, Key arg2, int arg3)
{
//Check to close the window on escape.
if (arg2 == Key.Escape)
{
_window.Close();
}
}
而 OnUpdate 和 OnRender 方法分别是做具体的渲染准备和渲染的逻辑,这些就不是本文的内容了
以下是 Program 的代码
using Silk.NET.Input;
using Silk.NET.Maths;
using Silk.NET.Windowing;
namespace WemkuhewhallYekaherehohurnije
{
class Program
{
private static IWindow _window;
private static void Main(string[] args)
{
//Create a window.
var options = WindowOptions.Default;
options = new WindowOptions
(
true,
new Vector2D<int>(50, 50),
new Vector2D<int>(1280, 720),
0.0,
0.0,
new GraphicsAPI
(
ContextAPI.OpenGL,
ContextProfile.Core,
ContextFlags.ForwardCompatible,
new APIVersion(3, 3)
),
"",
WindowState.Normal,
WindowBorder.Resizable,
false,
false,
VideoMode.Default
);
options.Size = new Vector2D<int>(800, 600);
options.Title = "LearnOpenGL with Silk.NET";
_window = Window.Create(options);
//Assign events.
_window.Load += OnLoad;
_window.Update += OnUpdate;
_window.Render += OnRender;
//Run the window.
_window.Run();
}
private static void OnLoad()
{
//Set-up input context.
IInputContext input = _window.CreateInput();
for (int i = 0; i < input.Keyboards.Count; i++)
{
input.Keyboards[i].KeyDown += KeyDown;
}
}
private static void OnRender(double obj)
{
//Here all rendering should be done.
}
private static void OnUpdate(double obj)
{
//Here all updates to the program should be done.
}
private static void KeyDown(IKeyboard arg1, Key arg2, int arg3)
{
//Check to close the window on escape.
if (arg2 == Key.Escape)
{
_window.Close();
}
}
}
}
按下 F5 运行代码,即可看到创建了空窗口
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
使用 Silk.NET 创建 OpenGL 空窗口项目例子的更多相关文章
- 使用Vaadin的maven archetype创建一个空Vaadin项目
所在公司要求使用这个臭屎粑粑一样的Vaadin,我也没办法.为了更好地开展工作,对得起老板发给我的工资,就算是臭屎粑粑,也要尽力给他玩儿出花样来. Vaadin针对Eclipse和Netbeans等I ...
- M1: 创建UWP空项目
本小节介绍如何在Visual Studio中创建一个UWP项目,Visual Studio中提供了快速创建各种项目的类型模板.在Visual Studio 2015中,同样提供了UWP项目模板. 学完 ...
- [转]用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口
原文链接: 1.用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口 2.Windows MFC 两个OpenGL窗口显示与线程RC问题
- OpenGL 使用GLFW创建全屏窗口
OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...
- OpenGL入门(一):使用GLFW创建简单的窗口
如果使用QT,那么创建一个OpenGL渲染窗口其实很容易,不过出于初学的角度,使用GLFW库来创建新窗口. 1. 下载并配置GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体 ...
- OpenGL学习(2)—— 创建第一个窗口
创建 GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口.它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的. #inclu ...
- IDEA创建新空项目
IDEA创建新空项目 File -> New -> Project -> Empty Project -> 然后OK 这个是什么都不能做的,然后我们创建Module. File ...
- 创建OpenGL Context(WGL)
创建OpenGL Context(WGL) 创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL cont ...
- OpenGL编程-OpenGL框架-win32项目
在win32项目中开发的程序 小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的 程序运行结果是这样的 源代码:对第45行进行覆盖 # ...
- Sencha Cmd创建Ext JS示例项目
Sencha提供了免费的Cmd工具,可以用来创建Ext JS项目并提供了一些便利的功能. Sencha也在官方文档中提供了一个示例来演示如何创建一个Sample Login App. 本文就介绍一下这 ...
随机推荐
- C++ Concurrency in Action 读书笔记二:用mutex互斥锁保护在线程间共享的数据
Chapter 3 线程间共享数据 3.2 用互斥锁保护共享数据
- CYarp:力压frp的C#高性能http内网反代中间件
我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了.随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp ...
- Loto实践干货(9) 示波器测 晶振
我们用LOTO示波器的多个型号,带宽从20M到100M,分别测无源和有源晶振的情况.分别测试了12M,15M,24M,48M,80M晶振的波形.并分析了为什么我们经常测出晶振波形不是方波?为什么有时候 ...
- vue项目 nginx部署
nginx.conf中的server配置片段 server { listen 8080 ;#默认端口是80,如果端口没被占用可以不用修改 server_name localhost; #charset ...
- 痞子衡嵌入式:给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启动失败
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是给i.MXRT1xxx系列GPIO提早供电会影响DCDC_PSWITCH上电时序导致内部DCDC启动失败. 最近有一个 RW612 产品 ...
- KingbaseES 执行计划常见节点介绍
KingbaseES中explain命令来查看执行计划时最常用的方式.其命令格式如下: explain [option] statement 其中option为可选项,常用的是以下5种情况的组合: a ...
- Android组件(菜鸟教程)
- 链表队列(LinkedListQueue)
栈操作 入队 template<typename T> void LinkedListQueue<T>::enqueue(T e) { if (tail == nullptr) ...
- 9 CSS背景属性
CSS 背景属性 1. background-color(背景颜色) 页面的背景颜色有四种属性值表示,分别是transparent(透明),RGB十进制颜色表示,十六进制颜色表示和颜色单词表示. 属性 ...
- PWA 实践/应用(Google Workbox)
桌面端 PWA 应用: 移动端添加到桌面: 1 什么是 PWA PWA(Progressive Web App - 渐进式网页应用)是一种理念,由 Google Chrome 在 2015 年提出.P ...