Articles of shaderlab

如何在Unity中的MRT着色器中制作自定义的类似GrabPass的sampler2D?

我只知道编写着色器的基础知识,所以我不知道如何才能做出与Unity的Grabpass类似的function,因为当前只能写入的RenderTexture可以更改为只读,并在着色器中用于sampler2D。 我为我的相机设置了两个渲染目标,在一个着色器中写入两个目标,但在另一个着色器中,我只写入一个,但需要从另一个着色器读取。 我尝试设置我需要从材质属性读取的rendertexture,但即使第二个着色器当前没有触及rendertexture,我相信rendertexture仍然是只写,因为从它读取什么都不返回。 我最初使用GrabPass,但它不适用于不同的相机视口reflection,以及虽然它工作,但对我来说没有多大意义,因为我不仅写作rendertextures而不是“屏幕”(GrabPass是应该让一个屏幕区域的采样器即将被绘制,即使我没有直接写在屏幕上),但我使用了2个rendertextures作为目标,但它只能从一个,第一个我必须改变rendertextures的顺序,以便GrabPass采样器从正确的第一个rendertexture抓取。 此外,如果可能的话,我想避免GrabPass的假设成本,因为我不认为我需要做一个新的纹理,只是暂时使一个rendertextures只读,并使用它在sampler2d,但我知道几乎没有关于这一点。 1)我使用rendertextures new RenderTexture(Screen.width,Screen.height, 24); 2) public Material lighting; … Camera.SetTargetBuffers ( new RenderBuffer[2] { shadedTexture.colorBuffer, worldTexture.colorBuffer, }, shadedTexture.depthBuffer ); lighting.SetTexture("_World", worldTexture);" 3) _World ("World", 2D) = "white" {} sampler2D _World; tex2D(_World, screenUV); 在其他着色器中,这是碎片返回结构 struct PixelOutput { fixed4 shaded : SV_Target0; fixed4 world : SV_Target1; };

我该如何解决我的影子施法者问题?

我试图通过使用它的阴影投射通过它添加阴影物体本身的背面阴影使无形的物体与阴影。 我的意思是物体遮住了他的背面,并在背景表面上绘制了阴影(我的统一版本是Unity5.6) 你可以在下面的animationgif中看到这个问题: 这是我团结阴影传递的着色器: Shader "Test/ShadowCaster" { SubShader { Tags{ "LightMode" = "ShadowCaster" } Name "ShadowCaster" Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" struct v2f { V2F_SHADOW_CASTER; }; v2f vert(appdata_base v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } float4 frag(v2f i) : COLOR { SHADOW_CASTER_FRAGMENT(i) } […]

统一几何着色器永久编译

我正在写一个着色器来实现一个激光表演效果的例子 。 现在我只关注线条。 一条线表示为一个三角形。 当我保存我的shadercode时,unity变得不活跃,我可以在任务管理器中看到着色器编译器有30%的cpu – >正在编译。 但是这需要永远,当我重新启动统一,它不能够从资产加载着色器。 我发现,当我评论这行时,不会发生这种情况: const int TRI_STRIP[TAM] = tmpTriStrip; 显然,我得到一个错误,TRI_STRIP是未定义的,但着色器编译器做了工作,Unity仍在运行。 然后我把代码放回到上面的desribed行为出现。 感谢您的任何提示和建议。 这里是完整的geometryshader代码: void myGeometryShader(point gIn vert[1], inout TriangleStream<v2f> triStream) { float f = _PointSize / 20.0f * sin(_Time * _Speed); //half size float4 vctmp[TAM]; int i; float y; for (i = 0; i < TAM; i += 3) { […]

访问顶点直接在surf中input没有vert的输出参数在Tessellation Shader中

我可以在顶点着色器中获取顶点input,如下所示: o.worldPos = v.vertex.xyz; 但是,如何在不填充vert函数中的out参数的情况下直接获取worldPos。 提出这个问题是因为着色器是一个DX11 Tessellation函数,在vert函数中一个又一个out参数根本不可用。 基本上我想初始化我的input着色器,并将其传递到表面着色器在顶点着色器。我可以做到这一点,但它不同在镶嵌着色器,所以我需要直接访问冲浪中的顶点位置没有垂直出的参数。 Shader "Tessellation Sample" { Properties { _EdgeLength ("Edge length", Range(2,50)) = 15 _MainTex ("Base (RGB)", 2D) = "white" {} _DispTex ("Disp Texture", 2D) = "gray" {} _NormalMap ("Normalmap", 2D) = "bump" {} _Displacement ("Displacement", Range(0, 1.0)) = 0.3 _Color ("Color", color) = (1,1,1,0) _SpecColor ("Spec color", color) […]

为什么我的模具面具不起作用?

我有一个非常sipmle团结的场景。 它有两个对象,它们是Sprites,它们都使用sipmle黑盒作为纹理。 这里有两个着色器,一个作为掩码,另一个作为一个对象,应该只渲染像素,由该掩码指定。 遮罩着色器: Shader "Unlit/StencilUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" "Queue" = "Geometry" } Pass { //AlphaTest Greater 0.5 //Only render pixels whose alpha is greater than AlphaValue. Stencil{ Ref 2 Comp Never//Never – never pass the stencil test, Always – always pass the […]

我该如何延迟着色器?

我的效果是循环,但我需要每个闪光效果之间的延迟。我不想使用C#代码,因为我相信有一个简单的方法来实现着色器延迟。 waitfor 2 second flash effect waitfor 2 second flash effect …. 这是我的着色器: Shader "Smkgames/SwordFlash" { Properties { _MainTex("MainTex",2D) = "white"{} _Color ("Color", Color) = (1,1,1,1) _LineColor ("LineColor", Color) = (1,1,0,1) _Speed ("Speed",Float) = 1 _Thickness ("Thickness", Float) = 4.286548 _LineSeparation ("LineSeparation", Range(0.1, 10)) = 1 _LineRotation ("LineRotation", Range(-180, 180)) = 0 _Numbers ("Numbers", Float […]

Shaderlab和Cg API参考

我正在寻找关于Shaderlab的API和Cg语言的明确信息。 我迄今为止发现的文档是通过示例程序,而不是API的定义。 另外,search特定的API术语(如Sampler2D)没有任何确定性。 什么参考文件可用,或可能的Shaderlab和Cg的前体文件?

重叠透明颗粒而不混合? (统一)

我试图从一个物体(如太空船的尾气)创建一个连续的光输出,我想我会用粒子来达到这个目的。 但是我遇到了alpha混合的问题。 我希望随着时间的推移减less粒子系统的alpha,但是由于粒子的密度如此之高,在系统的大部分时间内,它们最终只能评估为纯色。 这个博客文章基本上显示了我想要实现的: https : //mispy.me/unity-alpha-blending-overlap/ 这个想法是使用模板testing来确保精灵/粒子中的像素如果与另一个精灵/粒子重叠则不会消失。 Pass { Stencil { Ref 2 Comp NotEqual Pass Replace } } 然后,作者添加一个alpha截止点,以确保底层sprite上的透明像素不会阻止写入新的像素。 half4 frag (v2f i) : COLOR { half4 color = tex2D(_MainTex, i.uv); if (color.a < 0.3) discard; return color; } 但是这个解决scheme要求你消除软边缘,所以我认为它在粒子系统中看起来不太好。 作者还暗示了一个涉及ZTest的替代解决scheme,但是我不能想象这会是什么。

我怎样才能在我的国旗上添加animation阴影?

这是我的标志: 我需要在我的animation标志像下面的图像添加阴影效果,但我不知道我该怎么做: 这里是我的着色器: Shader "Custom/Flag" { Properties { _MainTex ("Texture", 2D) = "white" {} _Ambient ("Ambient", Range(0., 1.)) = 0.2 [Header(Waves)] _WaveSpeed("Speed", Range(1,50)) = 20 _WaveStrength("Strength", Range(0.0, 1.0)) = 0.0 } SubShader { Cull Off CGPROGRAM #pragma surface surf Standard fullforwardshadows vertex:vert #pragma target 3.0 struct Input { float4 pos : POSITION; float2 uv_MainTex: TEXCOORD0; […]

如何使用Unity Shader Lab为CG中​​的2D多边形创建内联发光着色器?

所以这就是我想要做的。 给定不规则的多边形(在左边),我希望能够创建一个类似Photoshop内联发光效果与不透明填充(在右侧)的着色器。 创建与3D对象类似的效果我可以用菲涅耳函数实现。 但是,我无法做到任何给定的不规则二维多边形的平面。 编辑 我打算使用Voronoi方法来生成多边形,然后将各个多边形连接到基于哪个玩家所拥有的领土形状。 其中,那么将有边界材料应用。 我需要的是有效的边界(或领域)着色器。 这意味着着色器必须为更不规则的形状工作,如下面的。