Vertex and Fragment Shader
Semantics语义词:
定义:GPU工作时,数据通常暂存在寄存器,那么在Cg中,语义词就指定了输入/输出数据和图形硬件寄存器之间的映射关系。
原理:根据输入语义,图形处理器从某个寄存器取数据;然后再将处理好的数据,根据输出语义,放到指定的寄存器。
VS中绑定语义的输出数据会传递到PS中绑定相同语义的输入参数。
语义只对VS和PS入口函数的输入/输出参数有意义,是VS/PS输入输出和寄存器之间的桥梁。
VS输入语义词:POSITION BLENDWEIGHT NORMAL TANGENT BINORMAL PSIZE BLENDINDICES TEXCOORD0-TEXCOORD7
VS输出语义:POSITION PSIZE FOG COLOR0-COLOR1 TEXCOORD0-TEXCOORD7
VS的输出中必须包含POSITION语义变量,该值不能在PS中直接使用,它只被用于光栅化。
VS的输出中的自定义数据可以使用TEXCOORD系列的语义词来表示。
PS输入语义词:除POSITION外,VS的输出语义,也是VP的输入语义
PS输出语义:通常只有一个输出COLOR,最终颜色值。
VS输入参数的定义:
VS的输入参数可以是通用类型appdata_base,也可以是自定义结构体,并在其中指定需要的参数。
[UnityGC.cginc]VS预定义输入参数:
appdata_base:包含顶点的position、normal、one texture coordinate
appdata_tan:包含顶点的position、tangent、normal、one texture coordinate
appdata_full:包含顶点的position、tangent、normal、tow texture coordinate、color
自定义输入结构示例:
struct vertexInput {float4 vertex : POSITION;float4 texcoord0 : TEXCOORD0;fixed4 color : COLOR;};
Unity中,顶点只能包含以下这些数据,所以自定义输入结构中的成员也必须在此范围内(具体类型可以不一样,比如fixed4 color):
float4 vertex/float3 normal/float4 texcoord/float4 texcoord1/float4 tangent/float4 color
注意:其中没有副法向量binoraml,它可以通过noraml和tangent计算得出来,公式如下所示:
// binormal的计算公式float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
Cg访问属性定义:
Cg访问Properties块中定义的变量的方式:声明同名并匹配类型的变量。
Color/Vector --> float4/half4/fixed4
Range/Float --> float/half/fixed
2D --> sampler2D
3D --> sampler3D
Cube --> samplerCUBE
可以看下面的例子:
属性:
_MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float", Float) = 0.5 _MyTexture ("Texture", 2D) = "white" {} _MyCubemap ("Cubemap", CUBE) = "" {}
Cg变量:
fixed4 _MyColor; // low precision type is enough for colorsfloat4 _MyVector;float _MyFloat; sampler2D _MyTexture;samplerCUBE _MyCubemap
shader中的Cg片段会被Unity编辑器编译成low-level shader assembly,并被包含在生成的版本的data files里面。因为Cg片段需要被预编译,所以不能在运行时动态创建Cg shader。
#pragma glsl_no_auto_normalization 当给移动平台编译GLSL时,不自动normalize法向量和切线向量。在IOS/Android平台,noramls和tangents会在vertex shader中自动noramize。
#pragma exclude_renderers d3d11 xbox360 在DX11和Xbox360平台上不渲染
常用预定义和Cg函数:
[Cg]采样2dtexture: tex2D(_MainTex, i.texcoord0);
[Cg]frac函数:取小数部分
[Cg]any函数:输入参数只要有其中一个不为0,则返回true
[Cg]saturate函数:如果小于0则返回0,如果大于1则返回1,否则返回原值
[Cg]语义词VPOS表示像素的屏幕坐标,至少需要支持target 3.0。
[UnityCG.cginc]_ScreenParam表示屏幕的宽和高。
[UnityCG.cginc]ComputeScreenPos(MVP_pos)该函数返回像素的屏幕坐标,不需要target 3.0的支持。
一些代码片段:
// 3D坐标转换到2D Window坐标return mul(UNITY_MATRIX_MVP, v.vertex); // 计算像素的屏幕坐标 方法一 vertOut vert(appdata_base v) {vertOut o;o.pos = mul (UNITY_MATRIX_MVP, v.vertex);o.scrPos = ComputeScreenPos(o.pos);return o;// PS中转化[0-1]:float2 wcoord = (i.scrPos.xy/i.scrPos.w); }// 计算像素的屏幕坐标 方法二 fixed4 frag(float4 sp:VPOS) : SV_Target {float2 wcoord = sp.xy/_ScreenParams.xy;...}// 判断uv是否在[0-1]返回内,可用来做uv检查if (any(saturate(i.uv) - i.uv))...
转载于:https://www.cnblogs.com/sifenkesi/p/4707991.html
Vertex and Fragment Shader相关推荐
- Unity 中用 Vertex Fragment Shader 实现 surface shader 中的 Diffuse 和 Decal
自己体验了以后发现surface shader确实是隐藏了好多好多的内部实现呀,像我没有考虑的多光源,阴影,衰减等问题,在surface shader中都是被隐藏实现好了的,而且还是多平台适配的,Ve ...
- 【OpenGL】理解VAO、VBO、EBO和 shader中vertex、fragment交互。
1:首先了解GPU和渲染管道工作原理. 2:解释VAO.VBO.EBO 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 元 ...
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.
- Learn OpenGL(四)——片段着色器(Fragment Shader)
片段着色器(Fragment Shader) 片段着色器是第二个也是最终我们打算创建的用于渲染三角形的着色器. 片段着色器的全部, 都是用来计算你的像素的最后颜色输出. 为了让事情比较简单, 我们的片 ...
- Unity cg vertex and fragment shaders(二)
着色器的一般结构: Shader "MyShader/MyShaderName" {Properties {// ... properties here ...}SubShader ...
- Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)
Unity 一个面片的最大顶点数为65524,所以大于这个数,请拆分成多个面片 1.获取汽车x轴的最大值和最小值[-2.5,2.5]+R surfaceShader 语法 surf :surface ...
- three.js script vertex和fragment在react中使用/纯js写法
html原生script写法 <script id="vs" type="x-shader/x-vertex"> -- </script> ...
- 初识OpenGL (3)片段着色器(Fragment Shader)
step1. 片段着色器 计算像素最后的颜色输出. 片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来. #version 330 core o ...
- OpenGL Shader Key Points (3)
Shader和Program Program Link过后,Shader就可以从Program中Detach并删掉.这样是不是可以节省一点点显存呢? 链接到同一个program的vertex和frag ...
最新文章
- C 语言编程 — 使用 assert 断言进行程序设计
- linux之彻底卸载mysql
- 计算机专业英语的题目,计算机专业英语题目
- 《Head First 设计模式》例子的C++实现(2 观察者模式)
- WINCE6.0+ILI9806E驱动IC显示屏调试总结
- python实验原理_python实验报告5
- Python爬虫基础之BeautifulSoup
- Screw一键生成数据库文档工具
- mysql重置所有表_清空mysql指定库里所有表数据
- 利用Yum自动更新Linux系统效劳器的措施
- 外贸企业邮箱用哪个好?免费企业邮箱和收费企业邮箱哪个更好用?
- 五十分钟带你看遍C语言初阶语法(总纲)
- 层次分析法python代码_Python 实现层次分析法
- java判断字符串中是否包含某个字符
- 如何去选择高防服务器
- 基于NLP的COVID-19虚假新闻检测
- IR-HARQ(增量冗余HARQ)理论(待更新)
- SQL 窗口函数速查表
- uniapp页面通信方法总汇
- 解决海盗王客户端白屏和建筑人物等消失的问题
热门文章
- 接口报Provisional headers are shown原因和解决方法
- Taro+react开发(61) 一条虚线
- 前端学习(3289):object.define2
- react学习(28)---react挂载图
- 前端学习(3032):vue+element今日头条管理-反馈
- [Css] 使用css如何拉伸字体?
- [vue-element] ElementUI表格组件如何实现动态表头?
- 前端学习(2682):重读vue电商网站2之前台启动
- “约见”面试官系列之常见面试题第二十七篇之vue-router的重要属性
- 前端学习(1903)vue之电商管理系统电商系统之调用api添加用户