이 코드 스 니펫 (cubemap 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 잘 그것을 처리합니다. 목표는 이전 버전과의 호환성입니다.
은 (BTW. 알고리즘에 문제가있는 것입니다,하지만 지금 문제가 아닙니다) 정말 최적화
'CubeOffset()'정의 – Drop
을 추가하십시오. 나는 아마도 텍스처를 미리 계산할 것을 생각했다. – Asylum
그건 그렇고, 최적화의 목적은 무엇인가? 지시 한도에 맞지 않습니까? 얼마나? – Drop