前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 8.0 和 OpenGL 创建一个简易的渲染器

.NET 8.0 和 OpenGL 创建一个简易的渲染器

作者头像
郑子铭
发布2024-03-01 14:43:09
1090
发布2024-03-01 14:43:09
举报

前言

我个人对三维渲染领域的开发有着浓厚的兴趣,尽管并未在相关行业工作过,我的了解还很片面。

去年,在与群友聊天时,他们推荐了一本《Unity Shader入门精要》,说适合像我这样想自学的新人,于是我打开了通往新世界的大门。

这本书涵盖了很多基础的渲染知识,如光照、阴影、各种风格的渲染等等。对于有兴趣的同学,可以在京东读书中在线阅读,无需购买纸质版。在学习过程中,我发现使用Unity Shader编写着色器非常方便,它很好地封装了渲染概念中的Pipeline、Pass等要点。

因此,我萌生了一个想法:是否可以模仿Unity Shader来开发一款属于自己的渲染器呢?

必备的技术点 (不分先后)

线性代数 - 在编写Shader时,了解线性代数是至关重要的,因为许多内置函数与线性代数相关,帮助你理解代码含义。

图形学基础 - 了解图形学基础也是必要的,即使只对图形库的作用和渲染流程有基本了解。

图形库API - 掌握图形库API是开发渲染器的核心,可以根据个人偏好选择适合自己的API,如OpenGL、Vulkan、DirectX等。

编程基础 - 编程基础也是必备技能。

这些知识结合起来,可以帮助你更好地开发自己的渲染器。

项目搭建和所需依赖

Silk.NET.OpenGL - OpenGL 的 C# 包装器。

Silk.NET.Shaderc、Silk.NET.Shaderc.Native - 用于以 SPIR-V 方式编译 GLSL。注意,OpenGL 4.6 支持 SPV Shader。

Silk.NET.Windowing、Silk.NET.Input - 对 glfw、sdl 窗口进行包装,包含控制器输入(鼠标、键盘等)。

StbImageSharp - 用于解析图片。

Silk.NET.Assimp - 用于解析三维模型。

Silk.NET.Maths - 一个完善的数学库。

Hexa.NET.ImGui、Hexa.NET.ImGuizmo - ImGui 的 C# 包装器。

项目架构

TrContext.cs - 统一管理使用的 GL 和 GL 扩展的上下文。

TrShader.cs - 用于加载 Shader,支持 SPV 二进制文件和 Shader 字符串。

TrRenderPipeline.cs - 管理一条管线中的 Shader,并维护管线状态,如混合状态、重采样、深度测试、模板测试等。

TrRenderPass.cs - 管理多条管线和切换管线。

TrTexture.cs - 管理纹理和采样器属性。

TrFrame.cs - 创建并维护一个 Frame,支持多重采样。

TrScene.cs - 内置一个 Frame 的 ImGui 窗口,用于绑定渲染。

TrBuffer.cs - 使用 OpenGL 创建并维护内存,可设置内存优先级。

TrTransform.cs - 简易的矩阵变换类,支持平移、缩放、旋转。

TrCamera.cs - 相机类。

TrMesh.cs - 管理网格体的顶点数据和索引数据。

TrMaterial.cs - 渲染器的核心,管理着渲染管线和材质属性,负责进行网格的渲染。

项目中,所有材质和 Shader 按照书中的章节进行了分组管理。

项目预览

初始界面

窗体菜单

场景模型拾取和 Transform

漫反射场景

各类纹理渲染

Shadertoy 网站的 shader 渲染,我抄了几个Shadertoy BETA(https://www.shadertoy.com/)

项目地址

OpenGL 实战项目 https://github.com/qian-o/Triangle

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目预览
  • 项目地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档