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

    AHB2APB Bridge位置 AHB子系统时钟在200Mhz左右,APB时钟在几十Khz到几十Mhz 所以要进行跨时钟域处理,从AHB高时钟频率转到APB低时钟频率 AHB2APB Bridge规 ...

  2. Laravel路由匹配

    Route常规用法如下,特别是最后一个传参之后可以进行正则匹配,非常好用. //@后面内容为所要访问的方法 Route::get('foo', 'Photos\AdminController@meth ...

  3. 【ARM】为堆和栈保留空的内存块

    此示例演示如何使用分散加载描述为堆栈和堆保留和清空内存块.它还显示链接器生成的相关符号. 在以下示例中,执行区域定义STACK 0x800000 EMPTY -0x10000定义了一个名为STACK ...

  4. 【ThreadX-GUIX】Azure RTOS GUIX和Azure RTOS GUIX Studio概述

    Azure GUIX嵌入式GUI是Microsoft的高级工业级GUI解决方案,专门针对深度嵌入式,实时和IoT应用程序而设计.Microsoft还提供了名为Azure RTOS GUIX Studi ...

  5. [转帖]OceanBase 存储引擎详解

    https://zhuanlan.zhihu.com/p/436485359 作者简介:沈炼,蚂蚁集团技术风险部数据库高级专家毕业于东南大学,2014年以来从事 OceanBase 在蚂蚁的架构工作, ...

  6. [转帖]Mnesia reports that this RabbitMQ cluster has experienced a network partition.

    一 问题描述 双节点RabbitMQ集群发生了脑裂,节点日志报错: [error] <0.6318.0> Mnesia(rabbit@pc2): ** ERROR ** mnesia_ev ...

  7. [转帖]Oracle性能优化-大内存页配置

    一.为什么需要大页面? 如果您有一个大的RAM和SGA,那么HugePages对于Linux上更快的Oracle数据库性能是至关重要的.如果您的组合数据库SGAs很大(比如超过8GB,甚至对于更小的数 ...

  8. [转帖]nginx配置默认首页(index.html index.htm)全流程(包含遇到问题的解决)

    https://www.cnblogs.com/tujietg/p/10753041.html#:~:text=%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9 ...

  9. [转帖]国产数据库到底行不行?人大金仓KINGBASE数据库与主流开源数据库性能实测

    近年来,人大金仓的数据库产品受到了外界诸多的关注.做产品,免不了要接受用户的对比和选择,数据库因其行业的自身特点,还有很多开源的技术产品同台比拼,用户因此也会产生诸多疑问,国产数据库相比开源数据库到底 ...

  10. [1036]kvm虚拟机访问时提示no route to host分析

    环境 宿主机: IP: 10.110.136.43 版本:Kylin Linux Advanced Server release V10 (Sword) KVM vm: IP: 10.110.136. ...