C# unity在调用着色器之前在哪里丢弃顶点?

C# unity在调用着色器之前在哪里丢弃顶点?,c#,unity3d,shader,C#,Unity3d,Shader,我试图用周期性的边界条件来做一个游戏(所以基本上如果你在地图的右边缘,并且你看对了,你应该再次看到整个地图) 我制作了一个几何体着色器,它取一个三角形并输出我需要的27个三角形(3*3*3周期框),当基本对象在屏幕上时,它可以完美地工作。一旦基本对象离开屏幕,所有副本也将消失 所以我认为unity甚至不会在我的相机后面的顶点上调用我的着色器(这对于优化来说是完全好的),但是在我当前的解决方案中,我需要调用游戏中的每个对象 是否可以强制unity在渲染之前不丢弃任何对象,或者我应该寻找不同的解决方

我试图用周期性的边界条件来做一个游戏(所以基本上如果你在地图的右边缘,并且你看对了,你应该再次看到整个地图)

我制作了一个几何体着色器,它取一个三角形并输出我需要的27个三角形(3*3*3周期框),当基本对象在屏幕上时,它可以完美地工作。一旦基本对象离开屏幕,所有副本也将消失

所以我认为unity甚至不会在我的相机后面的顶点上调用我的着色器(这对于优化来说是完全好的),但是在我当前的解决方案中,我需要调用游戏中的每个对象

是否可以强制unity在渲染之前不丢弃任何对象,或者我应该寻找不同的解决方案?如果我要做别的事,你有什么想法吗

这是我目前的密码。(我是着色器新手,所以这可能很愚蠢…)

着色器“未照明/几何体着色器”
{
性质
{
_MainTex(“纹理”,2D)=“白色”{}
}
子阴影
{
标记{“RenderType”=“不透明”}
LOD 100
通过
{
CGP程序
#pragma顶点顶点
#布拉格几何几何
#布拉格碎片碎片
#包括“UnityCG.cginc”
结构appdata{
浮动4顶点:位置;
3正常:正常;
float2uv:TEXCOORD0;
};
结构v2g{
浮动4顶点:SV_位置;
float2uv:TEXCOORD0;
};
结构g2f{
浮动4顶点:SV_位置;
float2uv:TEXCOORD0;
};
取样器2D_MainTex;
浮动4(缅特克斯街);;
v2g垂直(appdata v)
{
v2g-o;
o、 顶点=v.顶点;
o、 uv=v.uv;
返回o;
}
[maxvertexcount(3*3*3*3)]
void geom(三角形v2g输入[3],输入输出三角形流三流){
g2fo=(g2f)0;
对于(int x=0;x<3;x++)
{
浮点x_移位=(x-1)*2*_SinTime[2];
对于(int y=0;y<3;y++)
{
浮点y_移位=(y-1)*2*_SinTime[2];
对于(intz=0;z<3;z++)
{
浮点z_移位=(z-1)*2*_时间[2];
对于(int i=0;i<3;i++)
{
o、 顶点=UnityObjectToClipPos(输入[i]。顶点+float4(x_移位,y_移位,z_移位,0));
o、 uv=变换_TEX(输入[i].uv,_MainTex);
三流附加(o);
}
tristream.RestartStrip();
}
}
}
}
固定4框架(g2f i):SV_目标
{
固定4列=tex2D(_MainTex,i.uv);
返回列;
}
ENDCG
}
}
}

我不打算把它用于灯光,而是用于整个物体,我确信它们的处理方式是不同的。因此,它发生的原因是相同的,但解决方案必须不同。(为什么它不是的副本:)

不是顶点被丢弃,而是整个网格作为一个整体被剔除


Unity基于网格的边界框实现视锥剔除。您可以通过将新值指定给来手动更改网格的边界框。

,因此我认为unity甚至不会在我相机后面的顶点上调用我的着色器。这叫做“视锥剔除”。谢谢!经过更多的搜索(最后使用正确的关键字…),我发现也许这个功能可以帮助我。另一个“解决方案”是在消隐发生之前完全改变相机的消隐矩阵,但这感觉很粗略……可能是你最终设法做到的复制品?我有一张32x32的地图,我想有一个“无止境”的定期导航。谢谢你的回答。这确实是一个解决办法。如果有人想和我做同样的事,我想添加一条评论。渲染同一对象的多个实例的更好方法是使用
Shader "Unlit/Geom_shader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma geometry geom
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 uv : TEXCOORD0;
            };

            struct v2g {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            struct g2f {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2g vert (appdata v)
            {
                v2g o;
                o.vertex = v.vertex;
                o.uv = v.uv;
                return o;
            }

            [maxvertexcount(3*3*3*3)]
            void geom(triangle v2g input[3], inout TriangleStream<g2f> tristream) {

                g2f o = (g2f)0;

                for (int x = 0; x < 3; x++)
                {
                    float x_shift = (x - 1) * 2*_SinTime[2];
                    for (int y = 0; y < 3; y++)
                    {
                        float y_shift = (y - 1) * 2 * _SinTime[2];
                        for (int z = 0; z < 3; z++)
                        {
                            float z_shift = (z - 1) * 2 * _CosTime[2];

                            for (int i = 0; i < 3; i++)
                            {
                                o.vertex = UnityObjectToClipPos(input[i].vertex + float4(x_shift, y_shift, z_shift, 0));
                                o.uv = TRANSFORM_TEX(input[i].uv, _MainTex);
                                tristream.Append(o);
                            }
                            tristream.RestartStrip();
                        }
                    }
                }
            }

            fixed4 frag (g2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}