前言
我个人对三维渲染领域的开发有着浓厚的兴趣,尽管并未在服务器托管网相关行业工作过,我的了解还很片面。去年,在与群友聊天时,他们推荐了一本《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
项目地址
qian-o/Triangle: OpenGL 实战项目。 (github.com)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
1.死锁 要提交快照的时候由于没有人取走applyCh通道里面的东西,导致死锁。 具体解释: 2D的测试代码中在日志达到一定大小时会调用snapshot,该函数需要申请rf.mu这个互斥锁。而在提交普通的日志条目时,错误地没有先释放锁,导致snapshot无法…