Shader学习笔记

news2024/11/27 14:42:00

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开发的影响

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细步骤——Keil MDK-ARM 如何修改工程名字

背景: 注意:本项目是基于 STM32 单片机的裸机程序,使用 STM32CubeMX 工具生成的 Keil MDK-ARM 工程。 目标: 在 Keil MDK-ARM 开发环境中,将名为version0805 的工程重命名为 version0910,并确保所有新编译…

PHP+Thinkphp+MySQL民宿管理系统41279-计算机毕业设计项目选题推荐(免费领源码)

摘 要 伴随着国内旅游经济的迅猛发展民宿住宿行在国内也迎来了前所未有的发展机遇。传统的旅游模式已难以满足游客日益多元化的需求,随着人们外出度假的时间越来越长,导致人们在住宿的选择上更加追求舒适、个性化的住宿体验。以往大家出游度假首选都是以…

Android图片缓存工具类LruCache原理和使用介绍

LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络,其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用,意思是当缓存到达限制时候,优先淘汰近 期内最少使用的缓存&#xff0c…

传输层协议---TCP协议

以下都是自己的学习总结,有不足也有错误的地方,谨供参考。 TCP协议特点 ---面向字节流,有连接,可靠,全双工 面向字节流 面向字节流指的是服务器和客户端之间的数据传输,使用的字节流传输,获取…

Git 使用指南 --- 远程仓库

序言 在这篇文章中,我们将理解分布式版本控制系统,学习远程仓库与本地仓库的交互操作,掌握多⼈协作开发模式。 1. 理解分布式版本控制系统 前两篇中的所有内容都是针对于在本地的文件管理,Git 的强大之处肯定不仅仅只是体现于此。…

jupter_notebook简单介绍以及安装使用

目录 jupyter简单介绍: Jupyter: Jupyter的主要特点包括: 1. 交互式编程: 2. 文档和代码的整合: 3. 易于分享和协作: 4. 丰富的扩展性: 5. 社区支持: 6. 支持多种内核&#…

基于SpringBoot房屋租赁管理系统【包含运行步骤】

基于SpringBoot房屋租赁管理系统【包含运行步骤】 一、项目简介二、技术选型三、运行步骤1. 项目启动 四、项目演示前台页面展示管理员后台管理源码获取方式 总结 大家好,这里是程序猿代码之路,在当今社会,随着城市化进程的加快,房…

Git之2.29版本重要特性及用法实例(六十二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列…

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大。下面是一些介绍: 台灣億圖 HUST CNC 是一個充滿活力的公司,我們經營的目標是提供能滿足客戶之優良產品,以及優質的服務。我們的期望是使 HUS…

学习笔记--Docker

安装 1.卸载旧版 首先如果系统中已经存在旧的Docker,则先卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2.配置Docker的yum库 首先要安…

七,Spring Boot 当中的 yaml 语法使用

七,Spring Boot 当中的 yaml 语法使用 文章目录 七,Spring Boot 当中的 yaml 语法使用1. yaml 的介绍2. yaml 基本语法3. yaml 数据类型4. 学习测试的准备工作4.1 yaml 字面量4.2 yaml 数组4.3 yaml 对象 5. yaml 使用细节和注意事项6. 总结:…

产业园区智慧招商解决方案

1. 项目背景与挑战 2023年,产业园区在智慧招商领域面临诸多挑战,包括传统推广方式、信息分散、跨部门协作障碍、缺乏主动服务、服务流程改进困难以及数据档案管理不善。 2. 方案思路 解决方案围绕“一套秘籍”和“一套流程”,服务三方角色…

OpenAI即将推出自然语音功能

🦉 AI新闻 🚀 OpenAI即将推出自然语音功能 摘要:测试博客testingcatalog揭示OpenAI正在通过逆向工程ChatGPT应用,计划增加更自然的语音朗读功能。未来可能推出8种新语音,具有独特代号,能表达动物叫声等非…

(苍穹外卖)day05 店铺营业状态设置 功能测试

目录 一.Redis入门 Redis简介 二.Redis数据类型 三.Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 四.在java中操作Redis Redis的java客户端 ​编辑 五.店铺营业状态设置 代码开发 Redis---是一个数据库&…

浅谈信创浪潮下,职业院校人才培养有哪些新思路

一、信创产业发展背景 1.1 国家战略意义 信创产业,即信息技术应用创新产业,是国家战略发展的关键方向。近年来,在全球化的竞争和合作背景下,中国高度重视信息技术的自主创新能力,通过政策扶持、资金投入和市场引导等…

【数据结构】—— 栈与队列

目录 前言一、栈1.1 堆栈原理1.2 栈的实现 二、队列2.1 队列的概念2.2 队列结构2.2.1 顺序队列2.2.2 链队 2.3 队列的实现 三、堆与栈的区别3.1 内存中的堆与栈3.2 数据结构中的堆与栈 结语 前言 在单片机数据处理的时候,如果在中断里添加太多函数,可能会…

使用mobaxterm连接linux出现连接中断问题

1.问题描述 使用mobaxterm在连接到远程服务器时,如果隔一段时间不进行操作的话,会出现中断连接的现象。 2.解决 为了增强Linux系统的安全性,我们需要在用户输入空闲一段时间后自动断开,这个操作可以由设置TMOUT值来实现。将以下…

netty编程之基于websocket实现聊天功能

写在前面 源码 。 本文看下netty如何通过websocket实现聊天功能。 类似于实现http server,netty实现websocket也很简单,同样使用对应的编码器和解码器就行了,相关的有HttpServerCodec,HttpObjectAggregator,ChunkedWriteHandler。 1:编码 …

已解决:VS2022启动闪退,错误模块名称: clr.dll,版本: 4.8.9261.0,时间戳: 0x667a1925的问题

本问题已得到解决,请看以下小结: 关于《VS2022启动闪退》的解决方案 记录备注报错时间2024年报错版本VS2022报错复现下载某款VPN软件后,打开VS2022闪退,事件查看器输出如下报错描述错误应用程序名称: devenv.exe,版本:…

DAY 2 - 3 : 线性表—顺序存储

线性表—顺序表 问题引入&#xff1a; 线性表 定义 若干数据元素的一个线性序列。 表示 L (D,R) (即线性表L包含数据元素集合D和关系集合R&#xff09; D{ ai | ai∈datatype ,i0,1,2...n-1 ,n≥0} R{ <ai,ai1> | ai,ai1∈D, 0 ≤ i ≤ n - 2} < ai,ai1 >在这里称…