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) = (,,,)
_MyVector ("Some Vector", Vector) = (,,,)
_MyFloat ("My float", Float) = 0.5
_MyTexture ("Texture", 2D) = "white" {}
_MyCubemap ("Cubemap", CUBE) = "" {}
Cg变量:
fixed4 _MyColor; // low precision type is enough for colors
float4 _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))
...
Vertex and Fragment Shader的更多相关文章
- UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】
顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...
- Vertex And Fragment Shader(顶点和片段着色器)
Vertex And Fragment Shader(顶点和片段着色器) Shader "Unlit/ Vertex_And_Fragment_Shader " { Proper ...
- 3D Computer Grapihcs Using OpenGL - 07 Passing Data from Vertex to Fragment Shader
上节的最后我们实现了两个绿色的三角形,而绿色是直接在Fragment Shader中指定的. 这节我们将为这两个三角形进行更加自由的着色——五个顶点各自使用不同的颜色. 要实现这个目的,我们分两步进行 ...
- Unity Shaders Vertex & Fragment Shader入门
http://blog.csdn.net/candycat1992/article/details/40212735 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Sha ...
- 【Unity Shaders】Vertex & Fragment Shader入门
写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...
- GLSL写vertex shader和fragment shader
0.一般来说vertex shader处理顶点坐标,然后向后传输,经过光栅化之后,传给fragment shader,其负责颜色.纹理.光照等等. 前者处理之后变成裁剪坐标系(三维),光栅化之后一般认 ...
- Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章
Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...
- Vertex and fragment programs
[Vertex and fragment programs] When you use vertex and fragment programs (the so called "progra ...
- 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders
从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...
随机推荐
- 【转】浅谈html5网页内嵌视频
转自 http://www.pchou.info/web/2014/01/30/52ea01e13a7f1.html
- Android 百度云媒体 等播放器播放4:3等多种比例的视频 大小配置的问题
视频播放宽度大小各不一样,就需要根据视频的尺寸去适应屏幕的宽度和高度进行缩放. 思路是在onPrepared方法中,或者切换屏幕后,获取video的高度和宽度.以及屏幕展示区域的高度的宽度.并对比二者 ...
- day14---html基础
本节内容: 一.HTML 二.CSS 三.JS HTML 1.一套规则,浏览器认识的规则. 2.开发者: 学习Html规则 开发后台程序: - 写Html文件(充当模板的作用) ****** - 数据 ...
- React 随笔二
这周做的demo3和demo4.5 随记的小点. 1.js错误提示: Warning: Each child in an array or iterator should have a unique ...
- 【C++】DDX_Control、SubclassWindow和SubclassDlgItem的区别
在自绘窗口的时候,子类化是MFC最常用的窗体技术之一.什么是子类化?窗口子类化就是创建一个新的窗口函数代替原来的窗口函数. Subclass(子类化)是MFC中最常用的窗体技术之一.子类化完成两个工作 ...
- JSON数据查询方法
在进行前端项目开发的时候时长会遇到JSON的数据查找问题,如何方便快速查找?这里推荐一个linqjs组件,项目主页参见http://linqjs.codeplex.com/ 查询对象 var json ...
- log4net入门
简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...
- 用StackExchange.Redis客户端连接阿里云Redis服务遇到的问题
阿里云推荐的Redis服务.NET客户端是ServiceStack.Redis,但ServiceStack.Redis不支持异步,不支持.NET Core,于是尝试使用StackExchange.Re ...
- .NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy
当我们要接到一个新的项目的时候,我们第一时间想到的是用微软的MVC框架,但是你是否想过微软的MVC是不是有点笨重?我们这个项目用MVC是不是有点大材小用?有没有可以替代MVC的东西呢?看到这里也许你会 ...
- Golang下的Log处理
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 后端系统中的Log是相当重要的,做过高并发服务的同学都会认同这一点.相对而言,调试已经用处不大了,对于这样的项目, ...