使用 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. 本文就介绍一下这 ...
随机推荐
- 记录--axios和loading不得不说的故事
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 loading的展示和取消可以说是每个前端对接口的时候都要关心的一个问题.这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loa ...
- 记录--uniapp map 制作一个简单的地图导航
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 先上效果 简易map 在图一的地图中可以看到 a点 连接 到 b点, 基本信息 以及 基本的控件(放大.缩小.回到某个指定的点),接下来我 ...
- Clang开发注意事项
Clang tools need their builtin headers and search for them the same way Clang does. Thus, the defaul ...
- CDC实战:MySQL实时同步数据到Elasticsearch之数组集合(array)如何处理【CDC实战系列十二】
需求背景: mysql存储的一个字段,需要同步到elasticsearch,并存储为数组,以便于查询. 如下例子,就是查询预期. PUT /t_test_1/_doc/1 { "name&q ...
- RepPointsV2:更多的监督任务,更强的性能 | NIPS 2020
RepPointsV2的整体思想类似与Mask R-CNN,加入更多的任务来监督目标检测算法的学习.虽然在创新性上可能不够新颖,但论文的通用性还是很不错的,而且将角点任务的输出用于联合推理,从对比实验 ...
- NetAdapt:MobileNetV3用到的自动化网络简化方法 | ECCV 2018
NetAdapt的思想巧妙且有效,将优化目标分为多个小目标,并且将实际指标引入到优化过程中,能够自动化产生一系列平台相关的简化网络,不仅搜索速度快,而且得到简化网络在准确率和时延上都于较好的表现 ...
- BeautifulSoup 库 和 re 库 解析腾讯视频电影
1 import requests 2 import json 3 from bs4 import BeautifulSoup #网页解析获取数据 4 import sys 5 import re 6 ...
- Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
什么是Go? Go是一个跨平台.开源的编程语言 Go可用于创建高性能应用程序 Go是一种快速.静态类型.编译型语言,感觉上像动态类型.解释型语言 Go由Robert Griesemer.Rob Pik ...
- Numpy数组变形和轴变换
数组变形(reshape)或轴转换(Transposing Arrays and Swapping Axes)后返回的是非副本视图,对于非副本视图的修改会使原来的数组也同时改变. In [1]: im ...
- 面试必备HashMap源码解析
Map的实现有很多种,而HashMap算是最经典的实现之一了吧,在平时的使用中,绝大部分的使用也都是HashMap,我记得刚入行那会,脑子里对Map的使用就是Map map = new HashMap ...