我在团结中学习着色器,并且我试图实现下面的图像。但我似乎无法让我的代码产生我的目标输出。我的最终目标是根据阵列的大小划分整个图像。知道如何纠正我的代码吗?
代码:
Shader "Custom/PassArray" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent"} Blend SrcAlpha OneMinusSrcAlphaPass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" uniform float4 _Test [3]; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag (v2f i) : SV_Target { fixed4 col; _Test[0] = fixed4(0,0,1,1); _Test[1] = fixed4(1,0,0,1); _Test[2] = fixed4(0,1,0,1); //Test1: This code block produces output1 image. int index = round(i.uv.x*_Test.Length); col = _Test[index]; //Test2: This codeblocks outputs pure green. //if(i.uv.x < 1/3){ // col = _Test[0]; //} //else if(i.uv.x < 2/3){ // col = _Test[1]; //} //else if(i.uv.x < 3/3){ // col = _Test[2]; //} return col; } ENDCG } }
}
如果我理解正确,它会给我黑色像素,因为max i.uv.x是1.因此使索引3(基于计算i.uv.x / _Test.Length) 。但是我的数组中没有索引3。
答案 0 :(得分:0)
改变到地板。因为你是四舍五入,大于2.5的值会四舍五入为3.你可能知道,一个包含3个元素的数组没有索引3,因此是黑条。
答案 1 :(得分:0)
我已经弄明白了。这里是任何可能发现它有用的人的更新代码。我将公式从 int index = round(i.uv.x _Test.Length); 更改为 int index = ceil(i.uv。 X / 1 强> 的 _Test.Length)-1; 强>
Shader "Custom/PassArray"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags {"Queue"="Transparent"}
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _Test [3];
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col;
_Test[0] = fixed4(0,0,1,1);
_Test[1] = fixed4(1,0,0,1);
_Test[2] = fixed4(0,1,0,1);
//Test1:
int index = ceil(i.uv.x/1*_Test.Length)-1;
col = _Test[index];
return col;
}
ENDCG
}
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform float4 _Test [3];
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col;
_Test[0] = fixed4(0,0,1,1);
_Test[1] = fixed4(1,0,0,1);
_Test[2] = fixed4(0,1,0,1);
//Test1:
int index = ceil(i.uv.x/1*_Test.Length)-1;
col = _Test[index];
return col;
}
ENDCG
}
}