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 ?
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