Tôi đang chơi với một shader hình học và tôi tự hỏi tại sao nó không tạo ra hình học cho mỗi đỉnh trong tất cả các lưới?
- Tôi không nghĩ đây là vấn đề của Cull vì các đỉnh giống nhau tạo ra hình học khi bạn xoay quanh và thiết lập
Cull Off
không có gì thay đổi. - Một vấn đề khác có thể là nhân với số 0 ở đâu đó nhưng tôi đã cố gắng loại bỏ càng nhiều biến càng tốt và vẫn có vấn đề.
- Một vấn đề không thể thứ ba có thể là giới hạn số lượng đầu ra ở đâu đó. Tôi đã không đặt bất cứ điều gì rõ ràng để cản trở điều đó.
Tôi nhận thấy vấn đề trên Cube (5/8) và Quad (2/4) nhưng dường như tạo ra tất cả các hình học tốt trên mặt phẳng, hình trụ, v.v ... Sau đây là một số kết quả từ việc sử dụng trình tạo bóng hình học xương trần.
Cube (gần nhất: Unity mặc định, quay lại: .fbx
Khối xuất khẩu 4D ) :
Quad:
Nó dường như hoạt động tốt trên một mặt phẳng (cập nhật: Nó thực sự thiếu một hàng trên mỗi trục)
Mã Shader Unity GeometryShaderTest1.shader
:
Lưu ý: Nếu bạn đang kiểm tra shader và không có gì hiển thị; Xoay máy ảnh của bạn xung quanh để các thông số đang quay đúng hướng để hiển thị.
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"
}
Tài nguyên shader hình học:
- Shader hình học với bóng không hiển thị bóng đúng cách - Diễn đàn Unity
- Đây không chính xác là OpenGL nhưng thông tin tốt: Geometry Shader và Vertex Shader
- Ví dụ shader Billboarding Geometry tại đây và đây