1.1.语义
接着上一篇我们继续
a.顶点着色器的输入语义。(不是输出)
输入参数给到顶点函数,输入的参数需要填充一个语义,用于表示所传递的数据。
下面是顶点着色器输入语义:
语义
|
描述
|
POSITION
|
顶点的坐标信息,通常为float3或者float4类型
|
NORMAL
|
顶点的法线信息,通常为float3类型
|
TEXCOORD0
|
模型的第一套UV坐标,通常为float2、float3或者float4类型,TEXCOORD0到TEXCOORD3分别对应为第一到第四套UV坐标
|
TANGENT
|
顶点的切向量,通常为float4类型
|
COLOR
|
顶点的颜色信息,通常为float4类型
|
注意事项:
当顶点信息包含的元素少于顶点着色器输人所需要的元素时,缺少的部分会被0填充,而W分量会被1填充。例如:项点的 UV 坐标通常是二维向量,只包含x和y元素。如果输人的语义 TEXCOORD0 被声明为float4 类型,那么顶点着色器最终获取到的数据将变成(x,y,0,1)。
b.顶点着色器的输出和片段着色器输入语义。(顶点的输出 片段的输入!)
一个渲染流程分为三个阶段:应用阶段、几何阶段、光栅化阶段。
在应用阶段最重要是输出渲染所需的几何数据,也就是渲染图元,渲染图元可以是点、线和三角面。这些数据会传到下一阶段,即几何阶段。
在几何阶段通过对输入的渲染图元处理,如 顶点着色器(空间变换、顶点着色等)、曲面细分着色器、几何着色器、裁剪、屏幕映射;输出屏幕空间的二维顶点坐标、对应的深度、着色等信息传递给下一阶段光栅化阶段。
光栅化阶段主要是决定每个渲染图元中的那些像素会被绘制在屏幕上,对上一阶段的逐顶点数据(纹理、顶点颜色)进行插值。(这三个阶段是概念流水线,只是做了基本的功能划分。)
下面是渲染流程三阶段(概念阶段):
#mermaid-svg-FjHo8Kd3pEY5NQgz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .error-icon{fill:#552222;}#mermaid-svg-FjHo8Kd3pEY5NQgz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FjHo8Kd3pEY5NQgz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .marker.cross{stroke:#333333;}#mermaid-svg-FjHo8Kd3pEY5NQgz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .cluster-label text{fill:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .cluster-label span{color:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .label text,#mermaid-svg-FjHo8Kd3pEY5NQgz span{fill:#333;color:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .node rect,#mermaid-svg-FjHo8Kd3pEY5NQgz .node circle,#mermaid-svg-FjHo8Kd3pEY5NQgz .node ellipse,#mermaid-svg-FjHo8Kd3pEY5NQgz .node polygon,#mermaid-svg-FjHo8Kd3pEY5NQgz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .node .label{text-align:center;}#mermaid-svg-FjHo8Kd3pEY5NQgz .node.clickable{cursor:pointer;}#mermaid-svg-FjHo8Kd3pEY5NQgz .arrowheadPath{fill:#333333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FjHo8Kd3pEY5NQgz .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FjHo8Kd3pEY5NQgz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FjHo8Kd3pEY5NQgz .cluster text{fill:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz .cluster span{color:#333;}#mermaid-svg-FjHo8Kd3pEY5NQgz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FjHo8Kd3pEY5NQgz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
应用阶段
输出渲染图元
几何阶段
光栅化阶段
输出屏幕空间的顶点信息
图形渲染流水线以顶点数据作为开始,当GPU获取到CPU传递的顶点数据之后,图形渲染流水线正式开始执行。
下面是部分GPU渲染流水线:
#mermaid-svg-WVHAEUB83VUc2fNT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .error-icon{fill:#552222;}#mermaid-svg-WVHAEUB83VUc2fNT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WVHAEUB83VUc2fNT .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WVHAEUB83VUc2fNT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WVHAEUB83VUc2fNT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WVHAEUB83VUc2fNT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WVHAEUB83VUc2fNT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WVHAEUB83VUc2fNT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WVHAEUB83VUc2fNT .marker.cross{stroke:#333333;}#mermaid-svg-WVHAEUB83VUc2fNT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WVHAEUB83VUc2fNT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .cluster-label text{fill:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .cluster-label span{color:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .label text,#mermaid-svg-WVHAEUB83VUc2fNT span{fill:#333;color:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .node rect,#mermaid-svg-WVHAEUB83VUc2fNT .node circle,#mermaid-svg-WVHAEUB83VUc2fNT .node ellipse,#mermaid-svg-WVHAEUB83VUc2fNT .node polygon,#mermaid-svg-WVHAEUB83VUc2fNT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WVHAEUB83VUc2fNT .node .label{text-align:center;}#mermaid-svg-WVHAEUB83VUc2fNT .node.clickable{cursor:pointer;}#mermaid-svg-WVHAEUB83VUc2fNT .arrowheadPath{fill:#333333;}#mermaid-svg-WVHAEUB83VUc2fNT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WVHAEUB83VUc2fNT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WVHAEUB83VUc2fNT .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WVHAEUB83VUc2fNT .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WVHAEUB83VUc2fNT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WVHAEUB83VUc2fNT .cluster text{fill:#333;}#mermaid-svg-WVHAEUB83VUc2fNT .cluster span{color:#333;}#mermaid-svg-WVHAEUB83VUc2fNT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WVHAEUB83VUc2fNT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
顶点数据
顶点着色器
装配图元
光栅化
片段着色器
在整个渲染流水线中,顶点着色器需要输出顶点在裁切空间中的坐标,这样GPU就可以知道顶点在屏幕上的光栅化位置及深度值。在顶点函数中输出参数使用float4类型的SV_POSITION语义进行填充。
根据上面提到到渲染流程三阶段,顶点着色器输出的值将会在光栅化阶段,对逐顶点数据(纹理、顶点颜色)插值计算,最终作为像素值输入到片段着色器。也即 顶点着色器的输入也可以成为片段着色器的输入。
温馨提示: 这就解释了有些Shader的片段函数中只有输出参数,没有输入参数。
下面是顶点着色器输出和片段着色器输入常用的语义:
语义
|
描述
|
SV_POSITION
|
顶点在裁切空间中的坐标,float4类型
|
TEXCOORD0、TEXCOORD1 等
|
用于声明任意高精度的数据,例如纹理坐标、向量等
|
COLOR0、COLOR1
|
用于声明任意低精度的数据,例如颜色、数值区间[0,1]的变量
|
特别提醒
|
TEXCOORDn 或者 COLORn 不特指UV和颜色,语义范围只包括但不限于此。忘各位仁兄不要受骗。
|
在顶点和片段着色器的输入和输出参数后被冒号:隔开的就是语义,语义所代表的是需要传递的数据。那么如何才能在CG代码块中调用属性变量,如何起到关联作用,最终在属性面板中做调整得到想要的效果。这涉及到在CG中调用Proprieties代码块声明,做到Shader程序可访问这些属性,需要在CG代码块中再次声明。
关于CG中声明属性变量,会在下一篇进行补充。
【Unity Shader 中Pass相关介绍_第二篇】相关推荐
- Unity Shader中各部分定义内容详解
Unity Shader中各部分定义内容详解 样板 Shader "Practice/Unlit/SimpleUnlit" {Properties{_MainTex (" ...
- unity shader中 CG和GLSL之间矩阵存储方式的差异
在unity shader中计算切线空间光照的时候发现TBN矩阵在计算后并没有转置,这和在GLSL.线代中的计算方法相差一个转置的步骤,因为在GLSL中直接求得的TBN矩阵是切线空间到世界空间的变换, ...
- qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式
参考文章: 使用采样器状态 - Unity 手册docs.unity3d.comhttps://blog.csdn.net/chenjinxian_3D/article/details/518169 ...
- 【Unity大气渲染】Unity Shader中实现大气散射(半成品)
写在前面 这是之前在做天空盒的时候同步写的分析博客,结果后面写到一半就忘了继续了,这里先贴出当时写的半成品,有小伙伴问我怎么做的,这里只能尽力把之前的半成品先放出来了(写得很乱,勿怪orz),,后面有 ...
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...
- GWAS分析中SNP解释百分比PVE | 第二篇,GLM模型中如何计算PVE?
上一篇,介绍了一下显著性的SNP,他们的解释表型变异百分比(PVE)之和,为何可能大于1. https://yijiaobani.blog.csdn.net/article/details/12209 ...
- 软件使用_第二篇 Latex基础知识
目录 1. 基础知识 1.1 Latex 源文件 1.1.1 空白距离 1.1.2 特殊字符 1.1.3 Latex命令 1.1.4 注释 1.1.5 纵向固定间距控制命令 1.1.6 页面控制命令 ...
- Unity Shader中内置的坐标空间与转换矩阵函数
模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系. 世界空间(world space)也称全局空间(glob ...
- Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型
我们是如何看到这个世界的 从宏观上来说,渲染包含了两大部分 决定一个像素的可见性 决定这个像素上的关照计算 而光照模型就是用于决定一个像素上进行怎样的光照计算 通常来讲,我们要模拟真实的光照环境来生成 ...
- unity游戏中提示信息如何实现_《游戏设计模式》(游戏编程模式)全书笔记+Unity实现...
Unity实现(Github地址): 笔记部分以下部分只包含笔记,具体实现及项目说明可查看Github 笔记中很多都是个人理解,目的是尽量让原本抽象的概念更易懂一些 关于书名--书名直译是<游戏 ...
最新文章
- 学生科技周的讲座-2021-内容准备
- docker 保存 环境持久化_18、docker的持久化存储和数据共享
- 图形显卡_选核芯显卡还是独立显卡?这才是决定笔记本电脑性能的关键
- 外国wince学习论坛收集
- “新一代互联网安全(BII)管理:理论与实践研讨会”在西安交通大学成功举办...
- Uniswap 24h交易量约11.2亿美元涨23.91%
- nodejs爬虫基础(二)
- SylixOS armv8 任务切换
- 单元测试 测试用例 用例测试文件golang的单元测试
- 复制pdf里的文字,去掉多余换行符的最简单方法(不用word不用python)
- vs2015下载路径
- uva 11584 dp
- Android O 开机动画铃声
- 将图片转化成SVG格式(亲测可行)
- 构建完整的API构架与Buddy API使用示例
- Android开发之连接实体手机进行开发的步骤 遇到的“an app is obsuring...“的问题及解决
- win10 vs2015 wxWidgets编译
- Spring Cloud中Hystrix的请求合并
- 计算机上面的字母代表什么意思,电脑主板上面的字母型号是什么意思
- c++ map unordered_map使用大全
热门文章
- TCP MIN_RTO 辩证考
- 红帽子Linux7安装Oracle,RedHat Enterprise Linux7.0安装Oracle 12C
- openstack的kvm win10镜像制作
- 论文学习笔记 How not to prove your election outcome
- linux下root切换普通用户,linux之普通用户与root用户之间切换方法
- linux attach 指令,Docker attach 命令
- “全球化”是一个漫长过程,海尔智家用了20年
- 介绍java糊涂Hutool工具
- 常用软件分类 精选列表(一)
- Matlab求集合交集和并集