Shader学习笔记

2024-09-03 12:20
文章标签 学习 笔记 shader

本文主要是介绍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开发的影响

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

这篇关于Shader学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132938

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件