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

这篇具有很好参考价值的文章主要介绍了使用 .NET 8.0 和 OpenGL 创建一个简易的渲染器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

项目预览

  • 初始界面

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

  • 窗体菜单

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

  • 场景模型拾取和 Transform

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

  • 漫反射场景

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

  •  各类纹理渲染

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

  • Shadertoy 网站的 shader 渲染,我抄了几个 Shadertoy BETA

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

 

项目地址

qian-o/Triangle: OpenGL 实战项目。 (github.com)文章来源地址https://www.toymoban.com/news/detail-827290.html

到了这里,关于使用 .NET 8.0 和 OpenGL 创建一个简易的渲染器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用OpenGL 和 opengl ES 渲染YUV图片文件的QT示例

    头文件:CPlayWidget.h cpp文件:CPlayWidget.cpp 默认打开 ./test.yuv文件 头文件:CPlayWidget.h  与上面没有差别 cpp文件:只替换了着色器代码:

    2024年01月20日
    浏览(38)
  • macOS下使用OpenGL做离屏渲染

    有时,我们想通过GPU做一些视频、图像处理,而处理的结果不需要显示在显示器上,而是直接交给主存,这时候我们可以通过OpenGL的 离屏渲染 ( Offscreen Rendering )来实现。 由于我们不需要将渲染好的像素显示到屏幕上,因此我们可以使用framebuffer object,将像素放到 fbo 上,

    2024年02月03日
    浏览(36)
  • Qt使用OpenGL进行多线程离屏渲染

    基于Qt Widgets的Qt程序,控件的刷新默认状况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。若是某个控件的paintEvent很是耗时(等待数据时间+CPU处理时间+GPU渲染时间),会致使刷新帧率降低,界面的响应速度变慢。 假如这个

    2024年02月02日
    浏览(42)
  • .Net 8.0 除gRPC之外的另一个选择,IceRPC之快速开始HelloWorld

    很高兴啊,我们来到了第一篇,程序员的HelloWorld,快速开始RPC之游 演示如何在几分钟内,使用 IceRPC ,构建和运行一个完整的客户端-服务器(C/S)应用程序. 必要条件: 只要电脑安装 .NET 8 SDK 就行了. 来吧,开始你的RPC之旅 接下来,我们要一起构建一个简单的网络应用程序,包括如下:

    2024年03月20日
    浏览(42)
  • 使用Python和OpenGL渲染PS2存档3D图标

    经过前面一系列文章的铺垫,PS2存档3D图标的文件已经全部解析完毕。本篇开始将介绍使用如下工具将3D图标渲染出来,并尽可能接近PS2主机原生的效果。 Python3 PyGame Numpy ModernGL PyGLM 第一步先初始化 PyGame ,设置窗口大小为 640x480 , FPS 为 60 。开启 OpenGL 渲染模式, OpenGL 的版

    2024年02月03日
    浏览(43)
  • ffmpeg cuda硬件解码后处理使用opengl渲染,全硬件流程

    使用硬件解码后不要transfer到内存,使用cuda转化nv12 - bgr24 转化完毕后cuda里面存了一份bgr24 如果需要opencv gpumat直接使用cuda内存,则可以手动构造gpumat 可以使用gpumat的各种函数 ptr(0)、ptr(1)和ptr(2)分别获取了R、G、B三个通道的数据指针。 使用reinterpret_cast将uchar 指针转换为ucha

    2024年04月12日
    浏览(45)
  • 搭建一个简易框架 3秒创建一个WebApi接口

    前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {\\\"selectA1\\\":[{\\\"Name\\\":\\\"156324\\\"}]} {\\\"selectA1\\\":[{\\\"Name\\\":\\\"156324\\\"}],\\\"selectA2\\\":[{\\\"IdA\\\":\\\"11\\\",\\\"IdB\\\":\\\"12\\\"},{\\\"IdA\\\":\\\"13\\\",\\\"IdB\\\":\\\"14\\\"}]} 既然如此那么数据库设计一张表 . . 前端请求数据时传递一个字符串JsonParm,里面放json格式

    2024年02月03日
    浏览(36)
  • 创建一个简易百度百科词条的方法!

    百度百科作为中国最大的中文百科全书,拥有着广泛的用户群体和权威性。对于许多人来说,创建一个百度百科词条是一种展示自己和宣传自己的有效方式。所以越来越多的人都想要上百度百科,百度百科词条的创建是一大难关,今天伯乐网络传媒就来给大家分享创建一个简

    2024年02月21日
    浏览(45)
  • 如何创建一个简易的HTML网页框架

    在我们初步学习了web前端开发的一些知识时,我们可能会考虑构建一个简单的html网站,但是,如何着手去开始我们的网站,对于新手来说可能是个问题。 在这篇文章中,我将介绍我在构建一个简易的网页时,首先去做的事情。 当然,我本身也并非专业的前端设计师,写此文

    2024年02月06日
    浏览(40)
  • 五.实战软件部署 1-3实战章节-前言&MYSQL 5.7版本在centos系统安装&MYSQL 8.0版本在centos系统安装

    目录 五.实战软件部署 1-实战章节-前言 五.实战软件部署 2-MYSQL 5.7版本在centos系统安装 1-配置yum仓库 2-使用yum安装mysql 3-安装完成后,启动mysql并配置开机自启动 4-检查mysql的运行状态 --配置 1-获取mysql的初识密码 2-登录mysql数据库系统 3-修改root用户密码 4-配置root的简单密码

    2024年02月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包