Ich spiele mit einem Geometrie-Shader und frage mich, warum er nicht für jeden Scheitelpunkt in allen Netzen Geometrie generiert.
- Ich denke nicht, dass dies ein Cull-Problem ist, da dieselben Scheitelpunkte Geometrie erzeugen, wenn Sie sich drehen und die Einstellung
Cull Off
nichts ändert. - Ein anderes Problem könnte eine Multiplikation mit Null sein, aber ich habe versucht, so viele Variablen wie möglich zu eliminieren und habe immer noch das Problem.
- Ein drittes unwahrscheinliches Problem könnte darin bestehen, die Ausgabemenge irgendwo zu begrenzen. Ich habe nichts explizit festgelegt, um dies zu verhindern.
Ich bemerke das Problem bei einem Cube (5/8) und Quad (2/4), aber es scheint, als würde die gesamte Geometrie in einer Ebene, einem Zylinder usw. fein erzeugt. Im Folgenden sind einige Ergebnisse aus der Verwendung des Bare-Bones-Geometrie-Shaders aufgeführt.
Cube (am nächsten: Unity-Standard, weiter hinten: Cinema 4D exportierter .fbx
Cube) :
Quad:
Es scheint in einer Ebene gut zu funktionieren (Update: Es fehlt tatsächlich eine ganze Zeile auf jeder Achse)
Unity Shader Code GeometryShaderTest1.shader
:
Hinweis: Wenn Sie den Shader testen und nichts angezeigt wird; Drehen Sie Ihre Kamera so, dass die Normalen in die richtige Richtung zeigen.
Shader "Custom/GeometryShaderTest1" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_Amount ("Height Adjustment", Float) = 0.0
}
SubShader {
Pass {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma target 5.0
//#pragma addshadow
#pragma vertex vert
#pragma geometry GS_Main
#pragma fragment frag
#include "UnityCG.cginc"
// Vert to geo
struct v2g
{
float4 pos: POSITION;
};
// geo to frag
struct g2f
{
float4 pos: POSITION;
};
// Vars
fixed4 _Color;
float _Amount;
// Vertex modifier function
v2g vert(appdata_base v) {
v2g output = (v2g)0;
output.pos = mul(_Object2World, v.vertex);
// Just testing whether all vertices affected
output.pos.y -= _Amount;
return output;
}
// GS_Main(point v2g p[1], inout TriangleStream<g2f> triStream)
// GS_Main(line v2g p[2], inout TriangleStream<g2f> triStream)
// GS_Main(triangle v2g p[3], inout TriangleStream<g2f> triStream)
[maxvertexcount(4)]
void GS_Main(point v2g p[1], inout TriangleStream<g2f> triStream)
{
float4 v[4];
float3 asdfUp = float3(0, 1, 0);
float3 asdfRight = float3(0, 0, 1);
v[0] = float4(p[0].pos + 0.25 * asdfRight - 0.25 * asdfUp, 1.0f);
v[1] = float4(p[0].pos + 0.25 * asdfRight + 0.25 * asdfUp, 1.0f);
v[2] = float4(p[0].pos - 0.25 * asdfRight - 0.25 * asdfUp, 1.0f);
v[3] = float4(p[0].pos - 0.25 * asdfRight + 0.25 * asdfUp, 1.0f);
float4x4 vp = mul(UNITY_MATRIX_MVP, _World2Object);
g2f pIn;
pIn.pos = mul(vp, v[0]);
triStream.Append(pIn);
pIn.pos = mul(vp, v[1]);
triStream.Append(pIn);
pIn.pos = mul(vp, v[2]);
triStream.Append(pIn);
pIn.pos = mul(vp, v[3]);
triStream.Append(pIn);
}
fixed4 frag(g2f input) : COLOR {
return float4(1.0, 0.0, 0.0, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
Geometrie-Shader-Ressourcen:
- Geometrie-Shader mit Schatten, die Schatten nicht richtig anzeigen - Unity-Foren
- Dies ist nicht gerade OpenGL, aber gute Infos: Geometry Shader und Vertex Shader
- Beispiel für einen Billboarding Geometry Shader hier und hier