当前位置: 首页 > news >正文

Shader学习笔记

1. 渲染管线概述

定义:渲染管线(流水线)就是将数据分阶段的变为屏幕图像的过程
数据就是我们在游戏场景中放置的模型、光源、摄像机等等内容的数据
阶段就是渲染管线中的三个阶段:应用阶段一>几何阶段一>光栅化阶段

通过这三个阶段对数据的处理,最终我们就能够在屏幕上看见最终的图像

2. 应用阶段

  1. 应用阶段的大部分内容都和渲染无关(游戏逻辑处理、动画更新、物理模拟)
  2. 几何阶段和光栅化阶段将开始处理和图形渲染相关的数据和操作

问题:为什么应用阶段归纳到渲染管线中呢?

应用阶段为渲染管线后续提供了数据,应用阶段的主导者是CPU,将渲染需要的数据传递给GPU用于后续几何阶段和光栅化阶段处理。

应用阶段为渲染具体准备了什么?

  1. 把不可见的物体数据剔除
  2. 准备好模型相关数据(顶点、法线、切线、贴图、着色器等等)
  3. 将数据加载到显存中
  4. 设置渲染状态(设置网格需要使用那个着色器、材质、光源属性等等)
  5. 调用DrawCall(CPU通知GPU使用相关的数据和渲染状态进行渲染)
    在这里插入图片描述

为什么DrawCall多了会影响性能呢?

主要的性能的瓶颈是CPU造成的
每次调用DrawCall之前,CPU需要想GPU发送很多内容,包括数据、状态、命令等等。
如果DrawCalli过多,CPU就会把大量的时间花费在提交DrawCall上,造成CPU过载,让玩家感受到卡顿

如何减少DrawCall

使用批处理,可以有效的减少DrawCall,从而提升性能表现

  1. 合并网格(可以将静态物体合并网格)
  2. 共用材质(在不同网格之间共用一种材质)
  3. 合并图集(2D游戏和UI中,可以将多张图片合并为一张大图)

CPU和GPU

  1. CPU:中央处理器,负责算数运算、逻辑操作、数据传输等通用计算任务,同时还管理和调度计算机的资源(游戏开发中一游戏逻辑处理)
  2. GPU:图形处理器,是专门用于图形和并行计算的处理器
    显卡就是搭载GPU的硬件设备,显卡包含一个或多个GPU芯片,还包含显存(用于存储图像数据)、显示接口、视频解码器等等(游戏开发中一渲染相关处理)

CPU主要处理操作系统管理、程序执行、通用计算等等
GPU主要处理图形渲染、图像处理等等

3. 几何阶段

图元

  • 在渲染管线中,图元是指几何数据的基本单元
  • 它是构成几何体的最小可绘制的单元
  • 图元可以是点、线、三角形,在渲染管线的几何阶段,顶点数据会被组合为图元
  • 这些图元将在后续的光栅化阶段转换为像素,最终呈现在屏幕上在这里插入图片描述

渲染管线在几何阶段主要做什么?

渲染管线的几何阶段主要是又GPU主导,几何阶段主要做的事情是根据应用阶段输入的数据信息进行顶点坐标转换以及裁剪不可见图元等工作

在这里插入图片描述
顶点着色器(完全可编程的):
它处理来自应用阶段由CPU传递过来的顶点相关数据,输入进来的每一个顶点都会调用一次顶点着色器中的逻辑
曲面细分着色器、几何着色器:
它们两对于对于我们来说是可选的着色器,并且他们需要硬件和驱动程序的支持才能使用
裁剪
裁剪阶段会自动的将不在视野内和部分在视野内的图元(点、线、三角形)进行裁剪,我们可以进行一些配置,但是一般我们
不需要进行任何处理,渲染管线会自动帮助我们进行处理
屏幕映射
将输入的三维坐标系下的图元坐标转换到屏幕坐标系中

总结

(GPU主导)几何阶段对顶点进行处理,并进行坐标转换,裁剪画面外的图元,最主要完成的是将模型的顶点本地坐标转换到最终屏幕坐标

4. 光栅化阶段

像素

  • 像素是计算机图形学中的基本概念,它是组成图像的最小可控单位
  • 具有位置和属性,用于表示图像中的颜色和其他信息
  • 它是二位图像中的一个点,每个像素都占据屏幕上的一个固定位置

片元

  • 在渲染管线中,片元是指在光栅化阶段生成的像素或像素片段
  • 片元是渲染管线中进行像素级别操作和计算的基本单位
  • 每个片元代表了屏幕上的一个像素,并且具有位置信息和与之相关的属性
    比如:颜色、深度值、法线等等

渲染管线在光栅化阶段主要做什么?

渲染管线的光栅化阶段同样由GPU主导,同样我们无法拥有绝对的控制权,同样GPU为我们开放了部分控制权
光栅化阶段主要做的事情是根据几何阶段输入的信息计算每个图元覆盖哪些像素,以及为这些像素计算他们的颜色等等工作

在这里插入图片描述
三角形设置:
在三角形设置这个小阶段,GPU主要做的事情就是计算三角形网格的表示数据
三角形遍历
主要根据三角形设置中计算出的三角形网格数据,检查每个像素身份被一个三角形覆盖,如果是覆盖就生成一个片元,最终得到被覆盖的片元序列
片元着色器(可编程的):
对三角形遍历输入的片元序列中的每个片元的着色计算和属性处理

  1. 光照计算:一计算片元的光照效果
  2. 纹理映射:根据片元在纹理中的位置,对纹理进行采样,将纹理颜色映射到片元上,实现表面贴图效果
  3. 材质属性处理:根据材质的属性,比如颜色、透明度、反射率等,计算片元的最终颜色和透明度
  4. 阴影计算:根据光源等信息,计算片元是否处于阴影中,影响其最终颜色

逐片元操作(输出合并阶段)
它主要完成对片元着色器输出数据(最终颜色、法线、纹理坐标、深度等)进行各种处理和计算

  1. 决定每个片元的可见性,比如深度测试、模板测试
  2. 如果通过了所有测试,需要把片元的颜色值和已经存储在颜色缓冲区的颜色进行合并(混合)

光栅化总结

确定片元最终是否被渲染,确定片元最终的渲染颜色效果等

在这里插入图片描述

5. Shader

Shader就是着色器,是用于编写图形表现效果的程序代码

Shader和渲染管线的关系

渲染管线的基本概念是将数据分阶段的变为屏幕图形的过程
Shader开发就是针对其中某些阶段的自定义开发,从而决定图形图像最终呈现到屏幕上的表现效果

  • 几何阶段-----顶点着色器
  • 光栅化阶段----片元着色器
    通过对渲染管线中的数据进行自定义处理来决定最终的渲染效果,通过Shader代码来处理渲染数据

图形接口程序(OpenGL、DX等)提供了对渲染管线(流水线)的控制和管理功能,它是开发者和硬件打交道的中间层

Shader和图形接口程序的关系

图形接口程序(OpenGL、DX等)为Shader?开发提供了各种APl,Shaderz开发需要针对不同的图形接口程序使用不同的Shader开发语言来调用相关APl。

不同图形接口程序对Shader开发的影响

开发语言不同、坐标系原点不同

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#中的Array.Sort()和Reverse()
  • JAVA-JVM 内存模型类加载器GC算法GC调优
  • 【技巧】Excel检查单元格的值是否在另一列中
  • LuaJit分析(一)LuaJit交叉编译
  • 今日算法:蓝桥杯基础题之“切面条”
  • VS2022出现C1001内部编译器错误的情况分析
  • 性能测试⼯具-——JMeter
  • 关于位结构体及位操作总结
  • 项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略
  • 传统CV算法——基于opencv的答题卡识别判卷系统
  • 机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)
  • python办公自动化:使用`Python-PPTX`的样式与格式
  • C++ ─── List的模拟实现
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task3:批量归一化
  • 接口请求400
  • axios 和 cookie 的那些事
  • ES学习笔记(12)--Symbol
  • JavaScript HTML DOM
  • October CMS - 快速入门 9 Images And Galleries
  • Python打包系统简单入门
  • 从零搭建Koa2 Server
  • 搞机器学习要哪些技能
  • 给github项目添加CI badge
  • 和 || 运算
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端存储 - localStorage
  • 微信小程序:实现悬浮返回和分享按钮
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个JAVA程序员成长之路分享
  • 以太坊客户端Geth命令参数详解
  • puppet连载22:define用法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $(selector).each()和$.each()的区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (10)STL算法之搜索(二) 二分查找
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (定时器/计数器)中断系统(详解与使用)
  • (四)opengl函数加载和错误处理
  • (四)模仿学习-完成后台管理页面查询
  • (一)appium-desktop定位元素原理
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .netcore如何运行环境安装到Linux服务器
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net中调用windows performance记录性能信息
  • @Autowired和@Resource装配
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具