Геометрический шейдер не работает (unity3d)
Я разрабатываю шейдер в единстве. Шейдер должен содержать вершинный, фрагментный и геометрический шейдеры, и хотя первые два работают нормально, у меня есть проблемы с геометрическим шейдером.
Когда я использую приведенный ниже код, затененный объект, шейдер просто окрашивается в розовый цвет, но я не вижу ошибок компиляции шейдера. Если я просто удаляю геометрию шейдера, все работает как положено.
Текущая реализация должна просто копировать входные данные в вывод, т.е. ничего не делать.
Еще одна интересная вещь заключается в том, что 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
}
}
}
1 ответ
Есть проблема. Геометрические шейдеры поддерживаются в OpenGL 3.1, если я не ошибаюсь. Мое аппаратное обеспечение реализует OpenGL 3.0