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