0
シェーダーを統一的に開発しています。シェーダには頂点シェーダ、フラグメントシェーダ、ジオメトリシェーダが含まれている必要がありますが、最初の2つはうまく動作しますが、ジオメトリシェーダに問題があります。ジオメトリシェーダーが機能しません(unity3d)
次のコードを使用すると、シェーダがちょうどピンクになるシェーダオブジェクトが表示されますが、シェーダのコンパイルエラーは発生しません。ジオメトリシェーダを削除するだけで、すべてが正常に動作します。
現在の実装では、入力データを出力するだけで、何もしないでください。
もう1つ興味深いのは、Unityがジオメトリシェーダの内容を無視する可能性があるということです。これからすべてを削除すると、オブジェクトはまだピンクです。私の理解では、この場合は何も表示されません。
私が使用しているコード:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/VoidCircle"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Progress ("Progress", float) = 0.4
}
SubShader
{
Tags { "RenderType"="Opaque" }
Blend SrcAlpha OneMinusSrcAlpha
LOD 100
Pass
{
CGPROGRAM
#pragma geometry geom
#pragma vertex vert
#pragma fragment frag
struct appdata
{
float4 vertex : POSITION; // vertex position
float2 uv : TEXCOORD0; // texture coordinate
};
struct v2f
{
float2 uv : TEXCOORD0; // texture coordinate
float4 vertex : SV_POSITION; // clip space position
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
// ALL THE PROBLEMS ARE HERE
[maxvertexcount(3)]
void geom(triangle v2f input[3], inout TriangleStream<v2f> OutputStream)
{
for (int i = 0; i < 3; i++) {
OutputStream.Append(input[i]);
}
}
sampler2D _MainTex;
float4 _MainTex_TexelSize;
float4 frag (v2f i) : SV_Target
{
float4 col = tex2D(_MainTex, i.uv);
float besta = 0;
int d = 1;
for (int x = -d; x <= d; x++) {
for (int y = -d; y <= d; y++) {
float4 col1 = tex2D(_MainTex, i.uv + fixed2(_MainTex_TexelSize.x * x, _MainTex_TexelSize.y * y));
if (col1.a > besta) {
besta = col1.a;
}
}
}
if (col.a > 0) {
return float4(col.a, col.a, col.a, 1);
} else {
return float4(0, 0, 0, besta);
}
}
ENDCG
}
}
}