我正在开发一个统一着色器。着色器必须包含顶点,片段和几何着色器,虽然前两个工作正常,但我遇到了几何着色器的问题。
当我使用下面的代码时,着色器对象着色器刚涂成粉红色,但我看不到着色器编译错误。如果我只删除几何着色器,一切都按预期工作。
当前的实现应该只是将输入数据复制到输出,即什么都不做。
另一件有趣的事情是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
}
}
}
答案 0 :(得分:0)
遇到了问题。如果我没有弄错的话,OpenGL 3.1支持几何着色器。我的硬件实现了OpenGL 3.0