前言
我个人对三维渲染领域的开发有着浓厚的兴趣,尽管并未在相关行业工作过,我的了解还很片面。去年,在与群友聊天时,他们推荐了一本《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

  • 漫反射场景

  • 各类纹理渲染

项目地址

qian-o/Triangle: OpenGL 实战项目。 (github.com)

使用 .NET 8.0 和 OpenGL 创建一个简易的渲染器的更多相关文章

  1. OpenGL创建一个三角形,并且颜色渐变(绿—>黑—>绿)

    学习自: https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/#_4 #include <glad/glad ...

  2. 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...

  4. SpringBoot 应用篇之从 0 到 1 实现一个自定义 Bean 注册器

    191213-SpringBoot 应用篇之从 0 到 1 实现一个自定义 Bean 注册器 我们知道在 spring 中可以通过@Component,@Service, @Repository 装饰 ...

  5. 如何使用Java AWT 创建一个简易计算器

    摘要:手把手教你使用 Java AWT 创建一个简易计算器. 本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工 ...

  6. 依赖注入[4]: 创建一个简易版的DI框架[上篇]

    本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章(<控制反转>.<基于IoC的设计模式>和< 依赖注入模式>)从纯理论的角度 ...

  7. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  8. 使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  9. C#编写一个简易的文件管理器

    编写一个简易的文件管理器,通过本次实验,练习 TreeView.ListView 和SplitContainer 控件的使用,同时熟悉 C#文件系统的操作方法以及 File 类和 Directory类 ...

  10. 基于OpenGL编写一个简易的2D渲染框架-01 创建窗口

    最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的 ...

随机推荐

  1. HashMap集合遍历随机性问题分析

    一.原因分析 1.1 HashMap对象的遍历 HashMap的遍历是通过此类中字段table数组进行顺序遍历,原因如下所示: 1 #HashMap 迭代遍历源码 2 public final boo ...

  2. Redis-有序集合-zset

  3. [转帖]TPC-C 、TPC-H和TPC-DS区别

    https://zhuanlan.zhihu.com/p/339886289 针对数据库不同的使用场景TPC组织发布了多项测试标准. TPC-C: TPC Benchmark C于1992年7月获得批 ...

  4. [转帖]「开源摘星计划」Prometheus监控Harbor(二进制版)

    推荐 原创 键客李大白2022-08-08 11:35:07博主文章分类:Harbor进阶实战(企业实战)著作权 文章标签云原生运维Harbor文章分类kubernetes云计算私藏项目实操分享阅读数 ...

  5. [转帖]zookeeper三节点集群搭建

    https://www.jianshu.com/p/1dcfbf45383b 下载zookeeper Apache源 http://archive.apache.org/dist/zookeeper/ ...

  6. [转帖]云平台部署CNA、VRM手动安装方法

    云平台部署CNA.VRM手动安装方法 分享人:郭道川 00443725 日期:2018.11.06     Ⅰ. 项目介绍 该项目主要为XX煤矿智能煤炭项目云平台部署交付,该项目所采用的服务器为RH2 ...

  7. [转帖]Jmeter学习笔记(十)——元件的作用域和执行顺序

    https://www.cnblogs.com/pachongshangdexuebi/p/11582891.html jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序 ...

  8. [转帖]Megacli 错误码

    MegaCLI Error Messages 0x00 Command completed successfully 0x01 Invalid command 0x02 DCMD opcode is ...

  9. [转帖]内存随机访问也比顺序慢,带你深入理解内存IO过程

    https://zhuanlan.zhihu.com/p/86513504 平时大家都知道内存访问很快,今天来让我们来思考两个问题: 问题1: 内存访问一次延时到底是多少?你是否会进行大概的估算? 例 ...

  10. iframe 在线预览pdf、word、excel、ppt、txt、图片、视频

    第一种方式通过 iframe 在线预览 pdf,word,excel,ppt,txt,图片,视频 <template> <el-button @click="openHan ...