利用Unity着色器重新创建Photoshop混合模式

发布时间:2019-05-23 14:59

在我们的游戏Tricky Towers的开发过程中,我有责任研究着色器效果,以便稍微调整我们的图形。我对我们的公司WeirdBeard很陌生,并且刚刚与Unity合作,而WeirdBeard对于使用着色器来说还是一个新手,因为我们过去主要为移动和浏览器制作游戏。我对编写着色器没有经验,但是我在编写一些OpenGL项目时感到很开心,并且在我从事XNA游戏时有一些HLSL的经验soC所以我至少知道在开始我的研究时要问的正确问题。我们的艺术家特别想让我研究他曾经在Photoshop中使用的重建混合模式。实际上在网上关于这个 C的确很少,所以希望这篇博文可以帮助其他人。

基本

由于我习惯了glsl和hlsl着色器文件 - 以及那些与c ++和c#之间的通信 - 我首先必须了解Unity如何做到这一点。

1. ShaderLab

Unity(不出所料)为我们完成了艰苦的工作,并为我们提供了着色器本身与它最终将被绑定的Unity材料之间的接口。这叫做ShaderLab。每个着色器文件必须以ShaderLab root命令 Shader

开头
Shader  name  {?//文件的其余部分在这里} 

在编辑器中创建着色器时,Unity会为您设置这一切,但更改名称会很有用。

2.属

这些括号内的第一个命令通常是 Properties 。这里是可以在Unity材质检查器中设置的参数列表(当然,也可以是通过脚本)。稍后,这些属将成为着色器代中的输入。这些的一般语法是:

 name(  在编辑器中显示的名称,类型)= defaultvalue 3.子载体

接下来是Subshader命令。加载游戏时着色器必须至少有一个子载体 CUnity将选择用户机器支持的第一个子载体。在子着色器中,可以编写三种不同类型的着色器。曲面着色器,顶点和片段着色器以及固定能着色器。 Unity 5中不推荐使用固定能着色器,所以我不想再谈这些。表面着色器最适用于照明计算 C,因为我们在游戏中没有使用任何光照效果(到目前为止),我没有进一步研究这些。另外因为我更熟悉顶点和片段着色器,我发现表面着色器非常有限。所以,关于顶点和片段着色器。这些比表面着色器更复杂,但它们更灵活,可以实现更多。它们可以用CG或HLSL编写,但Unity出于能原因推荐CG。

通过

着色器代需要写在子载体内的传递块内。传递块使着色器代所附着的几何体呈现一次。因此,子着色器内的多次传递将导致该几何体的多次渲染。顶点和片段着色器嵌入在带有CGPROGRAM和ENDCG关键字的传递中。

5.顶点和片段着色器

这里要写的第一件事是编译指令。最有用的是:

 #pragma vertex  //顶点着色器的名称#pragma fragment  //片段/像素着色器的名称#include  UnityCG.cginc  //包含许多在着色器中使用的非常有用的函数  

在此之后,我们可以列出我们在Properties部分中指定的输入变量。我们还必须创建一个结构,用作顶点着色器的输出和片段着色器的输入。然后我们可以列出顶点和片段函数。顶点函数应返回先前定义的结构的实例。片段函数应该返回一个表示像素颜色的fixed4。

 struct v2f {?float4 pos:SV_POSITION;?float2 uv:TEXCOORD0;}; 
 v2f vert(appdata_base v){?v2f o;?o.pos = mul(UNITY_MATRIX_MVP,v.vertex);?o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);?返回o;} 
 fixed4 frag(v2f i):SV_Target{fixed4 texcol = tex2D(_MainTex,i.uv);return texcol * _Color;} 

上面的顶点着色器接受appdata_base类型的参数,该参数是UnityCG.cginc中定义的结构。所有这些着色器都将纹理的顶点和uv坐标从世界坐标转换为scr

在我们的游戏Tricky Towers的开发过程中,我有责任研究着色器效果,以便稍微调整我们的图形。我对我们的公司WeirdBeard很陌生,并且刚刚与Unity合作,而WeirdBeard对于使用着色器来说还是一个新手,因为我们过去主要为移动和浏览器制作游戏。我对编写着色器没有经验,但是我在编写一些OpenGL项目时感到很开心,并且在我从事XNA游戏时有一些HLSL的经验soC所以我至少知道在开始我的研究时要问的正确问题。我们的艺术家特别想让我研究他曾经在Photoshop中使用的重建混合模式。实际上在网上关于这个 C的确很少,所以希望这篇博文可以帮助其他人。

基本

由于我习惯了glsl和hlsl着色器文件 - 以及那些与c ++和c#之间的通信 - 我首先必须了解Unity如何做到这一点。

1. ShaderLab

Unity(不出所料)为我们完成了艰苦的工作,并为我们提供了着色器本身与它最终将被绑定的Unity材料之间的接口。这叫做ShaderLab。每个着色器文件必须以ShaderLab root命令 Shader

开头
Shader  name  {?//文件的其余部分在这里} 

在编辑器中创建着色器时,Unity会为您设置这一切,但更改名称会很有用。

2.属

这些括号内的第一个命令通常是 Properties 。这里是可以在Unity材质检查器中设置的参数列表(当然,也可以是通过脚本)。稍后,这些属将成为着色器代中的输入。这些的一般语法是:

 name(  在编辑器中显示的名称,类型)= defaultvalue 3.子载体

接下来是Subshader命令。加载游戏时着色器必须至少有一个子载体 CUnity将选择用户机器支持的第一个子载体。在子着色器中,可以编写三种不同类型的着色器。曲面着色器,顶点和片段着色器以及固定能着色器。 Unity 5中不推荐使用固定能着色器,所以我不想再谈这些。表面着色器最适用于照明计算 C,因为我们在游戏中没有使用任何光照效果(到目前为止),我没有进一步研究这些。另外因为我更熟悉顶点和片段着色器,我发现表面着色器非常有限。所以,关于顶点和片段着色器。这些比表面着色器更复杂,但它们更灵活,可以实现更多。它们可以用CG或HLSL编写,但Unity出于能原因推荐CG。

通过

着色器代需要写在子载体内的传递块内。传递块使着色器代所附着的几何体呈现一次。因此,子着色器内的多次传递将导致该几何体的多次渲染。顶点和片段着色器嵌入在带有CGPROGRAM和ENDCG关键字的传递中。

5.顶点和片段着色器

这里要写的第一件事是编译指令。最有用的是:

 #pragma vertex  //顶点着色器的名称#pragma fragment  //片段/像素着色器的名称#include  UnityCG.cginc  //包含许多在着色器中使用的非常有用的函数  

在此之后,我们可以列出我们在Properties部分中指定的输入变量。我们还必须创建一个结构,用作顶点着色器的输出和片段着色器的输入。然后我们可以列出顶点和片段函数。顶点函数应返回先前定义的结构的实例。片段函数应该返回一个表示像素颜色的fixed4。

 struct v2f {?float4 pos:SV_POSITION;?float2 uv:TEXCOORD0;}; 
 v2f vert(appdata_base v){?v2f o;?o.pos = mul(UNITY_MATRIX_MVP,v.vertex);?o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);?返回o;} 
 fixed4 frag(v2f i):SV_Target{fixed4 texcol = tex2D(_MainTex,i.uv);return texcol * _Color;} 

上面的顶点着色器接受appdata_base类型的参数,该参数是UnityCG.cginc中定义的结构。所有这些着色器都将纹理的顶点和uv坐标从世界坐标转换为scr

在我们的游戏Tricky Towers的开发过程中,我有责任研究着色器效果,以便稍微调整我们的图形。我对我们的公司WeirdBeard很陌生,并且刚刚与Unity合作,而WeirdBeard对于使用着色器来说还是一个新手,因为我们过去主要为移动和浏览器制作游戏。我对编写着色器没有经验,但是我在编写一些OpenGL项目时感到很开心,并且在我从事XNA游戏时有一些HLSL的经验soC所以我至少知道在开始我的研究时要问的正确问题。我们的艺术家特别想让我研究他曾经在Photoshop中使用的重建混合模式。实际上在网上关于这个 C的确很少,所以希望这篇博文可以帮助其他人。

基本

由于我习惯了glsl和hlsl着色器文件 - 以及那些与c ++和c#之间的通信 - 我首先必须了解Unity如何做到这一点。

1. ShaderLab

Unity(不出所料)为我们完成了艰苦的工作,并为我们提供了着色器本身与它最终将被绑定的Unity材料之间的接口。这叫做ShaderLab。每个着色器文件必须以ShaderLab root命令 Shader

开头
Shader  name  {?//文件的其余部分在这里} 

在编辑器中创建着色器时,Unity会为您设置这一切,但更改名称会很有用。

2.属

这些括号内的第一个命令通常是 Properties 。这里是可以在Unity材质检查器中设置的参数列表(当然,也可以是通过脚本)。稍后,这些属将成为着色器代中的输入。这些的一般语法是:

 name(  在编辑器中显示的名称,类型)= defaultvalue 3.子载体

接下来是Subshader命令。加载游戏时着色器必须至少有一个子载体 CUnity将选择用户机器支持的第一个子载体。在子着色器中,可以编写三种不同类型的着色器。曲面着色器,顶点和片段着色器以及固定能着色器。 Unity 5中不推荐使用固定能着色器,所以我不想再谈这些。表面着色器最适用于照明计算 C,因为我们在游戏中没有使用任何光照效果(到目前为止),我没有进一步研究这些。另外因为我更熟悉顶点和片段着色器,我发现表面着色器非常有限。所以,关于顶点和片段着色器。这些比表面着色器更复杂,但它们更灵活,可以实现更多。它们可以用CG或HLSL编写,但Unity出于能原因推荐CG。

通过

着色器代需要写在子载体内的传递块内。传递块使着色器代所附着的几何体呈现一次。因此,子着色器内的多次传递将导致该几何体的多次渲染。顶点和片段着色器嵌入在带有CGPROGRAM和ENDCG关键字的传递中。

5.顶点和片段着色器

这里要写的第一件事是编译指令。最有用的是:

 #pragma vertex  //顶点着色器的名称#pragma fragment  //片段/像素着色器的名称#include  UnityCG.cginc  //包含许多在着色器中使用的非常有用的函数  

在此之后,我们可以列出我们在Properties部分中指定的输入变量。我们还必须创建一个结构,用作顶点着色器的输出和片段着色器的输入。然后我们可以列出顶点和片段函数。顶点函数应返回先前定义的结构的实例。片段函数应该返回一个表示像素颜色的fixed4。

 struct v2f {?float4 pos:SV_POSITION;?float2 uv:TEXCOORD0;}; 
 v2f vert(appdata_base v){?v2f o;?o.pos = mul(UNITY_MATRIX_MVP,v.vertex);?o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);?返回o;} 
 fixed4 frag(v2f i):SV_Target{fixed4 texcol = tex2D(_MainTex,i.uv);return texcol * _Color;} 

上面的顶点着色器接受appdata_base类型的参数,该参数是UnityCG.cginc中定义的结构。所有这些着色器都将纹理的顶点和uv坐标从世界坐标转换为scr

上一篇:令人敬畏的游戏Done Quick在1月再次为慈善机构提供快速服务
下一篇:Doom 4可以使用Quake Live系统

相关推荐