559666429
来,你们一块儿找答案,共同进步友情提示:在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党能够参考一下这几篇文章《unity3d shaderlab在vs的高亮显示》使代码高亮显示,也能够下载shaderlabvs或NShader之类的插件使代码高亮显示。html
如图所示,这是OpenGL的工做流程图。
关于图中的各个过程具体都在作些什么工做,能够看看这篇博客《OpenGL渲染管线》,讲得挺详细的,我就不赘述了。
上述的这些过程,初学者能够简单地记为四个部分程序员
顶点变换 → 图元装配和光栅化 → 片元纹理映射和着色 → 写入帧缓存web
可编程的部分就是顶点变换和片元着色啦。算法
Shader的意思就是着色器,也就是“给物体上色”,因此Shader的做用就是经过计算物体的像素,片断,顶点等等而最终决定物体显示的是什么,怎么显示。
GPU这个名词相信你们都不陌生。它是计算机处理图像的元件。GPU是Graphic Processing Unit(图形处理单元)的缩写。因为 GPU 具备高并行结构(highly parallel structure),因此 GPU 在处理图形数据和复杂算法方面拥有比 CPU 更高的效率。咱们来看一下下面两段代码的对比,这两段代码都是提取 2D 图像上每一个像素点的颜色值,第一段是在CPU上运算的C++代码,第二段是在GPU上运算的Cg代码:
img
CPU要用for循环语句遍历像素,而GPU只要一行代码就够了。GPU在图形处理方面很强大吧?
而Shader,就是GPU执行的一段针对3D对象进行操做的程序。
编程
CPU要用for循环语句遍历像素,而GPU只要一行代码就够了。GPU在图形处理方面很强大吧?
而Shader,就是GPU执行的一段针对3D对象进行操做的程序。windows
语言 | 介绍 |
---|---|
HLSL | 主要用于Direct3D。平台:windows。 |
GLSL | 主要用于OpenGL。 平台:移动平台(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0) |
CG | 与DirectX 9.0以上以及OpenGL 彻底兼容。运行时或事先编译成GPU汇编代码。 CG比HLSL、GLSL支持更多的平台,Unity Shader采用CG/HLSL做为开发语言。 |
英文 | 中文 | 介绍 |
---|---|---|
surface shaders | 表面着色 | Unity3d推荐的Shader类型。它是一个代码生成器,帮咱们将重复的代码省去了,使得编写Shader更为容易。使用的也是CG/HLSL语言。 |
vertex and fragment shaders | 顶点和片断着色器 | 最强大的Shader类型,属于可编程渲染管线。使用的是CG/HLSL语言。也就是我上面说过的两种。 |
fixed function shaders | 做为固定功能着色 | 属于固定渲染管线Shader, 基本用于高级Shader在老显卡没法显示时的备用Shader。 |
Compute Shader | Unity新增的一种Shader( 使用HLSL语言) | Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU做为并行处理器加以利用,GPU将不只具备3D渲染能力,也具备其余的运算能力,也就是咱们说的GPGPU的概念和物理加速运算。 |
Unity Shader | 介绍 |
---|---|
Standard Surface Shader | 表面着色 |
Unlit Shader & ImageEffect Shader | 顶点和片断着色器 |
Compute Shader | Unity新增Shader |
不管您选择哪一种类型,实际的shader代码老是会被裹在被称为ShaderLab的语言中,这是用来组织结构着色。它看起来像这样:缓存
Shader "Unlit/ff"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
这个很重要的,官方的东西比你收到的任何博客资料都详细并且无误。只是是英语,得慢慢认真看。虽然我也尚未看。哈哈哈~~~app