Ů
ע ¼  
 ӹע
   ʾһ  |  ر
ܰʾ΢֤Ƶ΢ʺŰѹڣ°󶨣°΢  |  ر

ʧŶ-˹

һϷߵĸ˲͡

 
 
 
 
 

־

 
 

Optimize shader  

2015-11-17 18:15:03|  ࣺ ͼȾ |  ǩ |ٱ |ֺС 

  LOFTER ҵƬ  |

Shaderʵʱ
1: HLSL shader ͨ HLSL Compiler ASM shader
2: ASM shader ͨ ASM Compiler P-code
3: P-codeͨCompilerԼHW OptimizerΪӲ Hardware ?-code
4: GPU
HLSL code:                                 float x=(a*abs(f))>(b*abs(f)); 
Assembly code:                         abs r7.w, c2.x mul r2.w, r7.w, c0.x mul r9.w, r7.w, c1.x slt r0.w, r9.w, r2.w 
DirectX? p-code:                        02000023 80080007 a0000002 03000005 80080002 80ff0007 a0000000 03000005 80080009 80ff0007 a0000001 0300000c d00f0000 80ff0009 80ff0002 
Hardware specific ?-code:         983a28f41595 329d8d123c04 329d8d627c08 3b487794333a

shader Ż
1ʹRenderMonkeyȹ߽пӻŻ
2ʹHLSLGLSL㷨Ż
3ʹĵͼshaderŻ
4ضӲŻ

Ϊ¼һЩϸŻ
1ʹùк
Żǰ
float MyDOT(float3 v1, float3 v2) {
     return (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z);
 }
 . . .
float v = MyDOT(N, L); // ʹԶ庯
. . .
Ż
float v = dot(N, L);    // ʹùкϿ

תΪASM
Զ庯
vs_2_0
 . . . 
mul r0.xy, v0, c0 
add r0.w, r0.y, r0.x 
mad oPos, c0.z, v0.z, r0.w 
. . .
к
vs_2_0
. . . 
dp3 r0.w, v0, c1
 . . .
2ʹʵ
- ʹñʸҪʹvector
- ܹʹfloat3Ҫʹfloat4

Żǰ
sampler texMap; 
float4 diff, amb; 
float4 main(float2 t: TEXCOORD0) : COLOR 
    float3 color = tex2D(texMap, t);
    color *= diff + amb;
     return float4(color, 0); 
}

Ż
sampler texMap; 
float4 diff, amb; 
float4 main(float2 t: TEXCOORD0) : COLOR 
    float4 color = tex2D(texMap, t); 
    color *= diff + amb; 
    return color; 
}
תΪASM
Żǰ
ps_2_0
 
def c2, 0, 0, 0, 0 
dcl t0.xy 
dcl_2d s0 
texld r0, t0, s0 
mov r1.xyz, c1 
add r7.xyz, c0, r1 
mul r2.xyz, r7, r0 
mov r2.w, c2.x
mov oC0, r2

Ż
ps_2_0

dcl t0.xy
dcl_2d s0 
texld r0, t0, s0 
mov r1, c1 
add r7, c0, r1 
mul r2, r7, r0 
mov oC0, r2

4
ʹø㣬ʹ㡣
- Ӳ֧
- ֧intģʱܲһЩ룬ҿܾȲͬ
Żǰ
float4 main(int k : TEXCOORD0) : COLOR
 { 
        int n = k / 3; 
        return n; 
}
Ż
float4 main(float k : TEXCOORD0) : COLOR 
        float n = k / 3; 
        return n; 
}
תΪASM
Żǰ
ps_2_0 

def c0, 0.333333, 1, 0, 0 
dcl t0.x 
mul r0.w, t0.x, c0.x 
frc r7.w, r0.w 
cmp r9.w, -r7.w, c0.w, c0.y 
add r4.w, r0.w, -r7.w 
cmp r11.w, r0.w, c0.w, c0.y 
mad r1, r9.w, r11.w, r4.w 
mov oC0, r1

Ż
ps_2_0 

def c0, 0.333333, 0, 0, 0 
dcl t0.x 
mul r0, t0.x, c0.x 
mov oC0, r0

5ʹΪ
ʹһ飬ʹΪ±Ҫʹfloat
Żǰ
float4x4 m[10]; 
float4 main( 
    float4 p: POSITION, 
    float2 ind: BLENDINDICES, 
    float blend: BLENDWEIGHT) 
    : POSITION {
         float4 p1 = mul(p, m[ind.x]); 
         float4 p2 = mul(p, m[ind.y]); 
         return lerp(p1, p2, blend); 
}
Ż
float4x4 m[10]; 
float4 main( 
    float4 p: POSITION, 
    int2 ind: BLENDINDICES, 
    float blend: BLENDWEIGHT) 
    : POSITION {
         float4 p1 = mul(p, m[ind.x]); 
         float4 p2 = mul(p, m[ind.y]); 
         return lerp(p1, p2, blend); 
}
תΪASM
Żǰ
vs_2_0

def c40, 4, 0, 0, 0
dcl_position v0
dcl_blendindices v1
dcl_blendweight v2
frc r0.xy, v1
add r0.xy, -r0, v1
mul r0.xy, r0, c40.x
mova a0.xy, r0
dp4 r0.x, v0, c0[a0.y]
dp4 r0.y, v0, c1[a0.y]
dp4 r0.z, v0, c2[a0.y]
dp4 r0.w, v0, c3[a0.y]
dp4 r1.x, v0, c0[a0.x]
dp4 r1.y, v0, c1[a0.x]
dp4 r1.z, v0, c2[a0.x]
dp4 r1.w, v0, c3[a0.x]
add r0, r0, -r1
mad oPos, v2.x, r0, r1

Ż
vs_2_0

def c40, 4, 0, 0, 0
dcl_position v0
dcl_blendindices v1
dcl_blendweight v2
mul r0.xy, v1, c40.x
mova a0.xy, r0
dp4 r0.x, v0, c0[a0.y]
dp4 r0.y, v0, c1[a0.y]
dp4 r0.z, v0, c2[a0.y]
dp4 r0.w, v0, c3[a0.y]
dp4 r1.x, v0, c0[a0.x]
dp4 r1.y, v0, c1[a0.x]
dp4 r1.z, v0, c2[a0.x]
dp4 r1.w, v0, c3[a0.x]
add r0, r0, -r1
mad oPos, v2.x, r0, r1

6
- ٳ
Żǰ
float scale, bias;
float4 main(float4 Pos : POSITION) : POSITION
{
 return (Pos * scale + bias);
}
Ż
float2 scale_bias;
float4 main(float4 Pos : POSITION) : POSITION
{
 return (Pos * scale_bias.x + scale_bias.y);
}

תΪASM
Żǰ
vs_2_0

dcl_position v0
mul r0, v0, c0.x
add oPos, r0, c1.x
Ż
vs_2_0

dcl_position v0
mad oPos, v0, c0.x, c0.y

7
һ飬Ԫ䵽һЩvectors
Żǰ
float fArray[8];
float4 main(float4 v: COLOR) : COLOR
{
 float a = 0;
 int i;
 for(i = 0; i < 8; i++)
 {
  a += fArray[i];
 }
 return v * a;
}
Ż
float4 fPackedArray[2];
static float fArray[8] = (float[8])fPackedArray;
float4 main(float4 v: COLOR) : COLOR
{
 float a = 0;
 int i;
 for(i = 0; i < 8; i++)
 {
  a += fArray[i];
 }
 return v * a;
}

boolΪstatic
Żǰ
float4 a;
bool b = true;
float4 main(
 float4 i0: TEXCOORD0,
 float4 i1 : TEXCOORD1) :COLOR
{
 if (b)
  return i0+a;
 else
  return i1+a;
}
Ż
float4 a;
static bool b = true;
float4 main(
 float4 i0: TEXCOORD0,
 float4 i1 : TEXCOORD1) :COLOR
{
 if (b)
  return i0+a;
 else
  return i1+a;
}
תΪASM
Żǰ
ps_2_0

dcl t0
dcl t1
add r1, t0, c0
add r0, t1, c0
cmp r0, -c1.x, r0, r1
mov oC0, r0
Ż
ps_2_0

dcl t0
add r0, t0, c0
mov oC0, r0

һԽжݲʹvector
Żǰ
float4 main(float k: COLOR): COLOR
{
 float a, b, c, d;
 a = k + 1;
 b = k + 2;
 c = k + 3;
 d = k + 4;
 return float4(a, b, c, d);
}
Ż
float4 main(float k: COLOR): COLOR
{
 float4 v;
 v = k + float4(1,2,3,4);
 return v;
}
תΪASM
Żǰ
ps_2_0 

def c0, 1, 2, 3, 4
dcl v0.x
add r0.x, v0.x, c0.x
add r0.y, v0.x, c0.y
add r0.z, v0.x, c0.z
add r0.w, v0.x, c0.w
mov oC0, r0
Ż
ps_2_0

def c0, 1, 2, 3, 4
dcl v0.x
add r0, v0.x, c0
mov oC0, r0

10һʸ
ܵʹɫ̶ָ
磺a+b+c+d = a*1+b*1+c*1+d*1 =dot( v4, 1)
Żǰ
float a, b, c, d;
a = k * j;
b = k + j;
c = k - j;
d = j - k;
a = a + b + c + d;
Ż
float4 v;
v.x = k * j;
v.y = k + j;
v.z = k - j;
v.w = j - k;
a = dot(v, 1);
תΪASM
Żǰ
. . . 
mul r0.w, r7.w, r8.w
add r1.w, r7.w, r8.w
sub r2.w, r7.w, r8.w
sub r3.w, r8.w, r7.w
add r0.w, r0.w, r1.w
add r0.w, r0.w, r2.w
add r0.w, r0.w, r3.w
. . . 
Ż
def c0, 1, 0, 0, 0
. . .
mul r0.x, r7.w, r8.w
add r0.y, r7.w, r8.w
sub r0.z, r7.w, r8.w
sub r0.w, r8.w, r7.w
dp4 r0.w, r0, c0.x
. . . 

11Сת
- shaderноת
- ʹתþmul()˷
- ʹþнг˷
Żǰ
float3x4 m;
float4 main(float4 p:POSITION) : POSITION
{
 float3 v;
 v = mul(m, p);
 return float4(v, 1);
}
Ż
float4x3 m;
float4 main(float4 p:POSITION) : POSITION
{
 float3 v;
 v = mul(p, m);
 return float4(v, 1);
}
תΪASM
Żǰ
vs_2_0

def c4, 1, 0, 0, 0
dcl_position v0
mul r0.xyz, v0.x, c0
mad r2.xyz, v0.y, c1, r0
mad r4.xyz, v0.z, c2, r2
mad oPos.xyz, v0.w, c3, r4
mov oPos.w, c4.x
Ż
vs_2_0

def c3, 1, 0, 0, 0
dcl_position v0
m4x3 oPos.xyz, v0, c0
mov oPos.w, c3.x

 
 
Ķ(8)| (0)
Ƽ ת

ʷϵĽ

LOFTERĸ

<#--־Ⱥ־--> <#--Ƽ־--> <#--ü¼--> <#--Ƽ--> <#--Ķ--> <#--ҳƼ--> <#--ʷϵĽ--> <#--Ƽ־--> <#--һƪһƪ--> <#-- ȶ --> <#-- Ź --> <#--ұģṹ--> <#--ģṹ--> <#--ģṹ--> <#--ͶƱ-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ҳ

ҵƬ - ͷ - ֻ - LOFTER APP - Ĵ˲

׹˾Ȩ ©1997-2017