使用 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. 本文就介绍一下这 ...
随机推荐
- 记一次 .NET某游戏后端API服务 CPU爆高分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他们的API服务程序跑着跑着CPU满了降不下去,让我帮忙看下怎么回事,现在貌似民间只有我一个人专注dump分析,还是申明一下我dump分析是免费的,如果 ...
- 详解SSL证书系列(6)了解HTTP及网络基础
使用HTTP协议访问Web 你知道当我们在网页浏览器(比如Chrome)的地址栏中输入URL时,Web网页是如何呈现的吗? Web页面当然不会凭空显示出来.根据Web浏览器地址栏中指定的URL,W ...
- 绘制三元图、颜色空间图:R语言代码
本文介绍基于R语言中的Ternary包,绘制三元图(Ternary Plot)的详细方法:其中,我们就以RGB三色分布图为例来具体介绍. 三元图可以从三个不同的角度反映数据的特征,因此在很多领 ...
- archlinux启动virtualbox实例出现错误:内核驱动未安装
参照 https://cn.linux-console.net/?p=22258 错误如下 Kernel driver not installed (rc=-1908) The VirtualBox ...
- rv1126 mpp部署加解决问题
rv1126 mpp部署 + test 执行失败问题 1.1 mpp 环境部署 首先在我们自己的sdk中 ~/rv1126_linux_240110/external/mpp 将改目录拷贝到需要的 ...
- 3个.NET开源、免费、强大的商城系统
前言 今天大姚给大家分享3个.NET开源.免费.强大的商城系统,希望可以帮助到有商城系统开发需求的同学. nopCommerce nopCommerce是一个功能丰富.免费.灵活且可定制的开源电子商务 ...
- #dp,vector#AT2567 [ARC074C] RGB Sequence
题目 分析 一种很正常的想法就是设\(dp[i][j][k]\), 表示前\(i\)个格子,其它两种颜色出现的位置分别为\(j,k,j>k或j=k=0(可取两种颜色)\)的方案数 那么颜色种类限 ...
- vue3中router配置中的children怎么用
在Vue 3中,当你使用Vue Router创建路由配置时, children属性允许你为某个路由定义嵌套路由.这意味着你可以在父路由下设置子路由,从而构建出具有层级结构的URL路径. 这里是一个基本 ...
- java中的类型擦除type erasure
目录 简介 举个例子 原因 解决办法 总结 简介 泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度. 泛型可以用在类和接口上 ...
- C++ 数学函数、头文件及布尔类型详解
C++ 数学 C++ 有许多函数可以让您在数字上执行数学任务. 最大值和最小值 max(x, y) 函数可用于找到 x 和 y 的最大值: 示例 cout << max(5, 10); 而 ...