我有这段代码片段(用于立方体贴图PCF过滤)。我想优化它为着色器模型2.我试图消除存储在制服中的排列矩阵的分支,但它需要太多(2x24)。着色器代码优化
float3 l = normalize(ldir);
float3 al = abs(l);
float3 off2, off3, off4;
if(al.x < al.y)
{
if(al.y < al.z)
{
// z is dominant
off2 = CubeOffset(l.zxy, float2(0, 1), texelsize).yzx;
off3 = CubeOffset(l.zxy, float2(1, 0), texelsize).yzx;
off4 = CubeOffset(l.zxy, float2(1, 1), texelsize).yzx;
}
else
{
// y is dominant
off2 = CubeOffset(l.yxz, float2(0, 1), texelsize).yxz;
off3 = CubeOffset(l.yxz, float2(1, 0), texelsize).yxz;
off4 = CubeOffset(l.yxz, float2(1, 1), texelsize).yxz;
}
}
else
{
if(al.x < al.z)
{
// z is dominant
off2 = CubeOffset(l.zxy, float2(0, 1), texelsize).yzx;
off3 = CubeOffset(l.zxy, float2(1, 0), texelsize).yzx;
off4 = CubeOffset(l.zxy, float2(1, 1), texelsize).yzx;
}
else
{
// x is dominant
off2 = CubeOffset(l, float2(0, 1), texelsize);
off3 = CubeOffset(l, float2(1, 0), texelsize);
off4 = CubeOffset(l, float2(1, 1), texelsize);
}
}
也许的数学关系可在比较(al.xyy < al.yzz)和碎冰鸡尾酒之间找到。
UPDATE:定义cubeoffset
float3 CubeOffset(float3 swiz, float2 off, float2 texelsize)
{
float3 ret;
ret.yz = swiz.yz + 2.0f * off * texelsize;
ret.x = sqrt(1.0f - dot(ret.yz, ret.yz));
if(swiz.x < 0)
ret.x *= -1.0f;
return ret;
}
和编译SM 2.0当HLSL错误:
error X5608: Compiled shader code uses too many arithmetic instruction slots (107).
Max. allowed by the target (ps_2_0) is 64.
error X5609: Compiled shader code uses too many instruction slots (111).
Max. allowed by the target (ps_2_0) is 96.
GLSL处理它的罚款。目标是向后兼容。
(顺便说一句,该算法是错误的,但是这不是一个问题,现在)
请提供'CubeOffset()'定义 – Drop
加入;我想(可能)预先将其计算为纹理 – Asylum
顺便说一下,您的优化目标是什么?你不适合指令限制?多少钱? – Drop