本文主要是介绍Shader学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 渲染管线概述
定义:渲染管线(流水线)就是将数据分阶段的变为屏幕图像的过程
数据就是我们在游戏场景中放置的模型、光源、摄像机等等内容的数据
阶段就是渲染管线中的三个阶段:应用阶段一>几何阶段一>光栅化阶段
通过这三个阶段对数据的处理,最终我们就能够在屏幕上看见最终的图像
2. 应用阶段
- 应用阶段的大部分内容都和渲染无关(游戏逻辑处理、动画更新、物理模拟)
- 几何阶段和光栅化阶段将开始处理和图形渲染相关的数据和操作
问题:为什么应用阶段归纳到渲染管线中呢?
应用阶段为渲染管线后续提供了数据,应用阶段的主导者是CPU,将渲染需要的数据传递给GPU用于后续几何阶段和光栅化阶段处理。
应用阶段为渲染具体准备了什么?
- 把不可见的物体数据剔除
- 准备好模型相关数据(顶点、法线、切线、贴图、着色器等等)
- 将数据加载到显存中
- 设置渲染状态(设置网格需要使用那个着色器、材质、光源属性等等)
- 调用DrawCall(CPU通知GPU使用相关的数据和渲染状态进行渲染)
为什么DrawCall多了会影响性能呢?
主要的性能的瓶颈是CPU造成的
每次调用DrawCall之前,CPU需要想GPU发送很多内容,包括数据、状态、命令等等。
如果DrawCalli过多,CPU就会把大量的时间花费在提交DrawCall上,造成CPU过载,让玩家感受到卡顿
如何减少DrawCall
使用批处理,可以有效的减少DrawCall,从而提升性能表现
- 合并网格(可以将静态物体合并网格)
- 共用材质(在不同网格之间共用一种材质)
- 合并图集(2D游戏和UI中,可以将多张图片合并为一张大图)
CPU和GPU
- CPU:中央处理器,负责算数运算、逻辑操作、数据传输等通用计算任务,同时还管理和调度计算机的资源(游戏开发中一游戏逻辑处理)
- GPU:图形处理器,是专门用于图形和并行计算的处理器
显卡就是搭载GPU的硬件设备,显卡包含一个或多个GPU芯片,还包含显存(用于存储图像数据)、显示接口、视频解码器等等(游戏开发中一渲染相关处理)
CPU主要处理操作系统管理、程序执行、通用计算等等
GPU主要处理图形渲染、图像处理等等
3. 几何阶段
图元
- 在渲染管线中,图元是指几何数据的基本单元
- 它是构成几何体的最小可绘制的单元
- 图元可以是点、线、三角形,在渲染管线的几何阶段,顶点数据会被组合为图元
- 这些图元将在后续的光栅化阶段转换为像素,最终呈现在屏幕上在这里插入图片描述
渲染管线在几何阶段主要做什么?
渲染管线的几何阶段主要是又GPU主导,几何阶段主要做的事情是根据应用阶段输入的数据信息进行顶点坐标转换以及裁剪不可见图元等工作
顶点着色器(完全可编程的):
它处理来自应用阶段由CPU传递过来的顶点相关数据,输入进来的每一个顶点都会调用一次顶点着色器中的逻辑
曲面细分着色器、几何着色器:
它们两对于对于我们来说是可选的着色器,并且他们需要硬件和驱动程序的支持才能使用
裁剪:
裁剪阶段会自动的将不在视野内和部分在视野内的图元(点、线、三角形)进行裁剪,我们可以进行一些配置,但是一般我们
不需要进行任何处理,渲染管线会自动帮助我们进行处理
屏幕映射:
将输入的三维坐标系下的图元坐标转换到屏幕坐标系中
总结
(GPU主导)几何阶段对顶点进行处理,并进行坐标转换,裁剪画面外的图元,最主要完成的是将模型的顶点从本地坐标转换到最终屏幕坐标中
4. 光栅化阶段
像素
- 像素是计算机图形学中的基本概念,它是组成图像的最小可控单位
- 具有位置和属性,用于表示图像中的颜色和其他信息
- 它是二位图像中的一个点,每个像素都占据屏幕上的一个固定位置
片元
- 在渲染管线中,片元是指在光栅化阶段生成的像素或像素片段
- 片元是渲染管线中进行像素级别操作和计算的基本单位
- 每个片元代表了屏幕上的一个像素,并且具有位置信息和与之相关的属性
比如:颜色、深度值、法线等等
渲染管线在光栅化阶段主要做什么?
渲染管线的光栅化阶段同样由GPU主导,同样我们无法拥有绝对的控制权,同样GPU为我们开放了部分控制权
光栅化阶段主要做的事情是根据几何阶段输入的信息计算每个图元覆盖哪些像素,以及为这些像素计算他们的颜色等等工作
三角形设置:
在三角形设置这个小阶段,GPU主要做的事情就是计算三角形网格的表示数据
三角形遍历:
主要根据三角形设置中计算出的三角形网格数据,检查每个像素身份被一个三角形覆盖,如果是覆盖就生成一个片元,最终得到被覆盖的片元序列
片元着色器(可编程的):
对三角形遍历输入的片元序列中的每个片元的着色计算和属性处理
- 光照计算:一计算片元的光照效果
- 纹理映射:根据片元在纹理中的位置,对纹理进行采样,将纹理颜色映射到片元上,实现表面贴图效果
- 材质属性处理:根据材质的属性,比如颜色、透明度、反射率等,计算片元的最终颜色和透明度
- 阴影计算:根据光源等信息,计算片元是否处于阴影中,影响其最终颜色
逐片元操作(输出合并阶段):
它主要完成对片元着色器输出数据(最终颜色、法线、纹理坐标、深度等)进行各种处理和计算
- 决定每个片元的可见性,比如深度测试、模板测试
- 如果通过了所有测试,需要把片元的颜色值和已经存储在颜色缓冲区的颜色进行合并(混合)
光栅化总结
确定片元最终是否被渲染,确定片元最终的渲染颜色效果等
5. Shader
Shader就是着色器,是用于编写图形表现效果的程序代码
Shader和渲染管线的关系
渲染管线的基本概念是将数据分阶段的变为屏幕图形的过程
Shader开发就是针对其中某些阶段的自定义开发,从而决定图形图像最终呈现到屏幕上的表现效果
- 几何阶段-----顶点着色器
- 光栅化阶段----片元着色器
通过对渲染管线中的数据进行自定义处理来决定最终的渲染效果,通过Shader代码来处理渲染数据
图形接口程序(OpenGL、DX等)提供了对渲染管线(流水线)的控制和管理功能,它是开发者和硬件打交道的中间层
Shader和图形接口程序的关系
图形接口程序(OpenGL、DX等)为Shader?开发提供了各种APl,Shaderz开发需要针对不同的图形接口程序使用不同的Shader开发语言来调用相关APl。
不同图形接口程序对Shader开发的影响
开发语言不同、坐标系原点不同
这篇关于Shader学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!