片段着色器 if else 奇怪的行为
Frag Shader if else odd behaviour
下面是我正在处理的当前着色器系统的简化版本,它将数据从一次分派的计算着色器中提取到顶点程序:v2f,然后将此数据解析为 v2fc - 此结构存储静态添加了 rend 浮点数的数据。
当前手动设置的此浮点值将与外部输入、属性或可能与另一个计算内核相关联。
正如在 frag 程序中看到的,这用于有效地决定是否渲染实例。
我也尝试过使用 'discard' 函数,但我被告知这种方法效率低下。
另外,我尝试将 rend 设为 int,并包含一个 switch 语句。
所有这些方法都给了我相同的结果: else 或 default 情况
无论 switch/if 条件如何,选项始终执行。
我确实有一些使用 c++ 的经验,但主要是 c#,并且对复杂的着色器系统比较陌生,所以如果语法不正确,请原谅我。
非常感谢对此问题的任何建议或解释。
//TODO Rendfiltermethods
Shader "Custom/StarShaderTemp"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color(" Color", Color) = (1, 0.5, 0.5, 1)
_Scale(" Scale ", Float) = 1
_Damping(" Damping Value", Float) = 500
}
SubShader
{
Pass
{
Tags { "RenderType" = "Transparent"}
ZTest Off
ZWrite Off
Cull Off
Blend SrcAlpha One
CGPROGRAM
#pragma target 5.0
#pragma vertex star_vertex
#pragma vertex star_cull
#pragma fragment frag
#pragma exclude_renderers gles
#include "UnityCG.cginc"
#include "StarStructInc.cginc"
StructuredBuffer<Star> stars;
StructuredBuffer<float3> quadPoints;
StructuredBuffer<int> cullint; //Input from cull compute shader for bypassing gifmain compute
sampler2D _MainTex;
sampler2D _O;
sampler2D _B;
sampler2D _A;
sampler2D _F;
sampler2D _G;
sampler2D _K;
sampler2D _M;
sampler2D _Blackhole;
float4 _Color;
float _Scale;
float _CamDist;
float _Damping;
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct v2fc
{
v2f vetwof : v2f;
float rendfloat: float;
};
// vertex shader with no inputs
// uses the system values SV_VertexID and SV_InstanceID to read from compute buffers
v2f star_vertex(uint id : SV_VertexID, uint inst : SV_InstanceID)
{
v2f o;
float3 worldPosition = stars[inst].position;
float3 Qpoint = quadPoints[id] * _Scale * sqrt(_CamDist / _Damping);
o.pos = mul (UNITY_MATRIX_P, mul (UNITY_MATRIX_V, float4(worldPosition, 1.0f)) + float4(Qpoint, 0.0f));
o.uv = quadPoints[id] + 0.5f; //setting UV texture coord center
return o;
}
v2fc star_cull(v2f i)
{
v2fc c;
c.vetwof = i;
c.rendfloat = 6.0;
return c;
}
float4 frag (v2fc i) : COLOR
{
if(i.rendfloat < 5.0)
{
float4 texColn = tex2D (_MainTex, i.vetwof.uv);
return texColn * _Color;
}
else
{
i.vetwof.pos =0;
float4 texColn = tex2D (_MainTex, i.vetwof.uv);
return texColn * _Color;
}
}
ENDCG
}
}
FallBack "Diffuse"
}
else 行为已通过创建 void 函数而不是 success frag ETC 得到纠正。查看编译后的代码后,似乎在优化汇编时使用的分支预测存在问题,因为可以组合片段函数引用。
另一个修复方法是对渲染目标使用多个通道。
下面是我正在处理的当前着色器系统的简化版本,它将数据从一次分派的计算着色器中提取到顶点程序:v2f,然后将此数据解析为 v2fc - 此结构存储静态添加了 rend 浮点数的数据。 当前手动设置的此浮点值将与外部输入、属性或可能与另一个计算内核相关联。
正如在 frag 程序中看到的,这用于有效地决定是否渲染实例。
我也尝试过使用 'discard' 函数,但我被告知这种方法效率低下。 另外,我尝试将 rend 设为 int,并包含一个 switch 语句。
所有这些方法都给了我相同的结果: else 或 default 情况 无论 switch/if 条件如何,选项始终执行。
我确实有一些使用 c++ 的经验,但主要是 c#,并且对复杂的着色器系统比较陌生,所以如果语法不正确,请原谅我。
非常感谢对此问题的任何建议或解释。
//TODO Rendfiltermethods
Shader "Custom/StarShaderTemp"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Color(" Color", Color) = (1, 0.5, 0.5, 1)
_Scale(" Scale ", Float) = 1
_Damping(" Damping Value", Float) = 500
}
SubShader
{
Pass
{
Tags { "RenderType" = "Transparent"}
ZTest Off
ZWrite Off
Cull Off
Blend SrcAlpha One
CGPROGRAM
#pragma target 5.0
#pragma vertex star_vertex
#pragma vertex star_cull
#pragma fragment frag
#pragma exclude_renderers gles
#include "UnityCG.cginc"
#include "StarStructInc.cginc"
StructuredBuffer<Star> stars;
StructuredBuffer<float3> quadPoints;
StructuredBuffer<int> cullint; //Input from cull compute shader for bypassing gifmain compute
sampler2D _MainTex;
sampler2D _O;
sampler2D _B;
sampler2D _A;
sampler2D _F;
sampler2D _G;
sampler2D _K;
sampler2D _M;
sampler2D _Blackhole;
float4 _Color;
float _Scale;
float _CamDist;
float _Damping;
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct v2fc
{
v2f vetwof : v2f;
float rendfloat: float;
};
// vertex shader with no inputs
// uses the system values SV_VertexID and SV_InstanceID to read from compute buffers
v2f star_vertex(uint id : SV_VertexID, uint inst : SV_InstanceID)
{
v2f o;
float3 worldPosition = stars[inst].position;
float3 Qpoint = quadPoints[id] * _Scale * sqrt(_CamDist / _Damping);
o.pos = mul (UNITY_MATRIX_P, mul (UNITY_MATRIX_V, float4(worldPosition, 1.0f)) + float4(Qpoint, 0.0f));
o.uv = quadPoints[id] + 0.5f; //setting UV texture coord center
return o;
}
v2fc star_cull(v2f i)
{
v2fc c;
c.vetwof = i;
c.rendfloat = 6.0;
return c;
}
float4 frag (v2fc i) : COLOR
{
if(i.rendfloat < 5.0)
{
float4 texColn = tex2D (_MainTex, i.vetwof.uv);
return texColn * _Color;
}
else
{
i.vetwof.pos =0;
float4 texColn = tex2D (_MainTex, i.vetwof.uv);
return texColn * _Color;
}
}
ENDCG
}
}
FallBack "Diffuse"
}
else 行为已通过创建 void 函数而不是 success frag ETC 得到纠正。查看编译后的代码后,似乎在优化汇编时使用的分支预测存在问题,因为可以组合片段函数引用。 另一个修复方法是对渲染目标使用多个通道。