[Help] sửa outline rigid cell shading ( DX )

Thảo luận trong 'Thư giãn' bắt đầu bởi Bergelmir, 28/8/13.

  1. Bergelmir

    Bergelmir The Lone Traveler from Vault 101

    Tham gia ngày:
    4/1/07
    Bài viết:
    17,559
    Nơi ở:
    BLACK LAMBS
    rigid cellshading

    Mã:
    float4x4	g_mWorld;			//!< ソ・コッネッ ヌ犢ト
    float4x4	g_mWorldView;		//!< ソ・コ・コッネッ ヌ犢ト
    float4x4	g_mWorldViewProj;	//!< ソ・コ・ナオ コッネッ ヌ犢ト
    float3		g_vLightDir;		//!< コ釥ヌ ケ貮・コ、ナヘ (ソタコ・ァニョ キホトテ ア簔リ)
    float3		g_vCameraPos;		//!< トォグカヌ タァト。
    texture		g_tDiffuse;			//!< オサチ・ナリスコテト
    texture		g_tShading;			//!< スヲタフオ・ナリスコテト
    texture		g_tSpecular;		//!< スコニ菁ァキッ ナリスコテト
    
    struct VS_IN
    {
        float3	p	: POSITION;
        float3	n	: NORMAL;
        float2	t	: TEXCOORD0;
    };
    
    struct VS_OUTPUT
    {
        float4	p	: POSITION;
        float2	t0	: TEXCOORD0;
        float	t1	: TEXCOORD1;
        float	t2	: TEXCOORD2;
    };
    
    sampler Samp0 = sampler_state
    {
    	Texture = <g_tDiffuse>;
    	MinFilter = LINEAR;
    	MagFilter = LINEAR;
    	MipFilter = NONE;
    	AddressU = Clamp;
    	AddressV = Clamp;
    };
    
    sampler Samp1 = sampler_state
    {
    	Texture = <g_tShading>;
    	MinFilter = LINEAR;
    	MagFilter = LINEAR;
    	MipFilter = NONE;
    	AddressU = Clamp;
    	AddressV = Clamp;
    };
    
    sampler Samp2 = sampler_state
    {
    	Texture = <g_tSpecular>;
    	MinFilter = LINEAR;
    	MagFilter = LINEAR;
    	MipFilter = NONE;
    	AddressU = Clamp;
    	AddressV = Clamp;
    };
    
    VS_OUTPUT VS(VS_IN In)
    {
        VS_OUTPUT Out = (VS_OUTPUT)0;
        
        Out.p = mul(float4(In.p, 1), matWorldViewProj);
        
        // diffuse texture coordinate
        Out.t0 = In.t;
        
        // calculate shading texture coordinate
        Out.t1 = dot(In.n, g_vLightDir);
    
    	// calculate specular texture coordinate
        float3 vEye = normalize(g_vEye - In.p);
        float3 vHalf = normalize(g_vLightDir + vEye);
        Out.t2 = pow(max(0, dot(In.n, vHalf)), 10);
        
        return Out;
    };
    
    float4 PS(VS_OUTPUT In) : COLOR
    {
    	return tex2D(Samp0, In.t0) * tex1D(Samp1, In.t1) + tex1D(Samp2, In.t2);
    }
    
    technique RigidCellShadingTechnique
    {
        pass P0
        {
            VertexShader = compile vs_1_1 VS();
            PixelShader = compile ps_1_1 PS();
            
            Sampler[0] = Samp0;
            Sampler[1] = Samp1;
            Sampler[2] = Samp2;
            
            Lighting = False;
        }
    }



    skining


    Mã:
    static const int MAX_BONE_MATRIX = 26;
    static const int MAX_BLEND_BONE = 4;
    float4x3 g_aBoneTM[MAX_BONE_MATRIX] : BONEMATRIXARRAY;
    float4x4 g_matViewProj : VIEWPROJECTION;
    float3 g_vecLightDir : LIGHTDIRECTION;
    
    sampler Samp = sampler_state
    {
        Texture = <Tex>;
        MinFilter = LINEAR;
        MagFilter = LINEAR;
        MipFilter = NONE;
    
        AddressU = Clamp;
        AddressV = Clamp;
    };
    
    struct VS_IN
    {
        float3 p : POSITION;
        float4 w : BLENDWEIGHT;
        float4 i : BLENDINDICES;
        float3 n : NORMAL;
        float2 t : TEXCOORD0;
    };
    
    struct VS_OUTPUT
    {
        float4 p : POSITION;
        float4 d : COLOR0;
        float2 t : TEXCOORD0;
    };
    
    VS_OUTPUT VS(VS_IN In)
    {
        VS_OUTPUT Out = (VS_OUTPUT)0;
    
        return Out;
    };
    
    technique SkinningTextureShader
    {
        pass P0
        {
            VertexShader = compile vs_1_1 VS();
            PixelShader = NULL;
        }
    }


    edge_line

    Mã:
    texture  g_txInputTexture;
    sampler2D g_samInputTexturePoint =
    sampler_state
    {
        Texture = <g_txInputTexture>;
        MinFilter = Point;
        MagFilter = Point;
        MipFilter = Point;
        AddressU = Clamp;
        AddressV = Clamp;
    };
    
    texture  g_txEdgeDetect;
    sampler2D g_samEdgeDetectPoint =
    sampler_state
    {
        Texture = <g_txEdgeDetect>;
        MinFilter = Point;
        MagFilter = Point;
        MipFilter = Point;
        AddressU = Clamp;
        AddressV = Clamp;
    };
    
    texture  g_txZInfo;
    sampler2D g_samZInfoPoint =
    sampler_state
    {
        Texture = <g_txZInfo>;
        MinFilter = Point;
        MagFilter = Point;
        MipFilter = Point;
        AddressU = Clamp;
        AddressV = Clamp;
    };
    
    texture  g_txNormalInfo;
    sampler2D g_samNormalInfoPoint =
    sampler_state
    {
        Texture = <g_txNormalInfo>;
        MinFilter = Point;
        MagFilter = Point;
        MipFilter = Point;
        AddressU = Clamp;
        AddressV = Clamp;
    };
    
    float inv_width;
    float inv_height;
    float fFadeZ;
    float fFovAdjust;
    float fEdgeThreshold;
    float fEdgeAlpha = 1.0;
    float3 EdgeColor = {0, 0, 0};
    
    float2 PixelKernel[4] =
    {
        { 0,  1},
        { 1,  0},
        { 0, -1},
        {-1,  0}
    };
    
    float3 LuminanceConv = { 0.2125f, 0.7154f, 0.0721f };
    
    float4 ps_edge_detect( float2 Tex : TEXCOORD0 ) : COLOR
    {
        float4 Orig = tex2D( g_samInputTexturePoint, Tex );
    
        float4 Sum = 0;
    
        for( int i = 0; i < 4; i++ )
            Sum += ( abs( Orig - tex2D( g_samInputTexturePoint, Tex + float2(PixelKernel[i].x * inv_width, PixelKernel[i].y * inv_height) ) ) - 0.5f ) * fEdgeThreshold + 0.5f;
    
        float l  = 1 - saturate( dot( LuminanceConv, Sum ) ) * 5;
    	return float4(l, l, l, 1);
    }
    
    float4 ps_edge_detect_normal( float2 Tex : TEXCOORD0 ) : COLOR
    {
    /*    float4 Orig = tex2D( g_samNormalInfoPoint, Tex );
    
        float4 Sum = 0;
    
        for( int i = 0; i < 4; i++ )
            Sum += ( abs( Orig - tex2D( g_samNormalInfoPoint, Tex + float2(PixelKernel[i].x * inv_width, PixelKernel[i].y * inv_height) ) ) - 0.5f ) * fEdgeThreshold + 0.5f;
    
        float l  = 1 - saturate( dot( LuminanceConv, Sum ) ) * 5;
    	return float4(l, l, l, 1);*/
        float4 Orig = tex2D( g_samNormalInfoPoint, Tex );
    
        float4 Sum = 1;
    
        for( int i = 0; i < 4; i++ )
            Sum -= saturate( 1 - dot( Orig.xyz, tex2D( g_samNormalInfoPoint, Tex + float2(PixelKernel[i].x * inv_width, PixelKernel[i].y * inv_height) ).xyz ) );
    
        return float4(Sum.xyz, 1);
    }
    
    float4 ps_edge_detect_combine( float2 Tex : TEXCOORD0 ) : COLOR
    {
        float4 c1 = tex2D( g_samInputTexturePoint, Tex );
    	float4 c2 = tex2D( g_samEdgeDetectPoint, Tex );
    	float4 c3 = tex2D( g_samZInfoPoint, Tex );
    
    	float fz = 1 - fFadeZ;
    	float alpha = saturate((c3.g- fz) / (.96 - fz));
    	alpha = alpha * alpha;
    
        return lerp(c1, lerp(c1, lerp(float4(EdgeColor.xyz,1), c1, c2.r), fEdgeAlpha), alpha * c3.r);
    	//return c2;
    	//return float4(alpha, alpha, alpha, 1);
    }
    
    technique Render
    {
        pass p0
        {
            PixelShader = compile ps_2_0 ps_edge_detect_normal();
        }
        pass p1
        {
            PixelShader = compile ps_2_0 ps_edge_detect_combine();
        }
    }


    muốn bỏ outline / làm mỏng bớt line thì sửa chỗ nào vậy :-s ?
     
  2. buonnguqua

    buonnguqua Bị anh Tày dộng chày vào họng GameOver Lão Làng GVN

    Tham gia ngày:
    6/2/06
    Bài viết:
    8,266
    Nơi ở:
    Hà Nội City
    Post nhầm thớt rồi
    Thử sửa ở ps_edge_detect_combine, không hiểu thuật toán thì sửa theo đúng ý mình cũng khó lắm
     
  3. duonghiep1

    duonghiep1 C O N T R A

    Tham gia ngày:
    19/11/09
    Bài viết:
    1,659
    Nơi ở:
    Hà nội
    clgt ? Đi vào xong đi ra =)) .
     
  4. demoncat

    demoncat Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    3/11/09
    Bài viết:
    753
    Nơi ở:
    Demon's Land
    quá khó cho đội gamer
     
  5. Bergelmir

    Bergelmir The Lone Traveler from Vault 101

    Tham gia ngày:
    4/1/07
    Bài viết:
    17,559
    Nơi ở:
    BLACK LAMBS
    sửa đc rồi thx bác buonnguqua tại cái edge này nó có 4 mức 1 off và 3 màu khác nhau nữa
     
  6. leonken56

    leonken56 Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    24/12/07
    Bài viết:
    720
    Nơi ở:
    Tp.HCM
    what language is this :5cool_ops:?
     
  7. Trl_lng

    Trl_lng Mario & Luigi

    Tham gia ngày:
    7/7/06
    Bài viết:
    840
    Dafuq did i just read ?.
     

Chia sẻ trang này