游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1545|回复: 3

pencil sketch shading

[复制链接]

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
发表于 2007-1-23 21:48:00 | 显示全部楼层 |阅读模式
I study the paper of "Stylized Rendering Techniques For Scalable Real-Time 3D Animation".
In Section3.3, It talk about "pencil sketch shading".
But I don't understand the paper's "ALGORITHM Pencil Sketch" and its implementation.
Did any book or web have the source code of "pencil sketch shading"?

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-1-24 05:22:00 | 显示全部楼层

Re:pencil sketch shading

1。 找美工生成几种密度的确 pencil sketch texture
2。 根据每个点( pixel shader ) 计算 n x L  n(normal) L ( pixel to light ) x( cross product )
3。 根据 n x L 的大小,选择一种密度的 texture, n X L 越小,密度越大
4。 生成一个Texture mapping的转换,可以是线性的,也可以是非线性的。如果做个project view,那就是线性的。然后根据转换的值,取texel就行了。

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2007-1-30 00:35:00 | 显示全部楼层

Re:pencil sketch shading

你是?要用projective texture的技?去??D??
?是我目前的Shader Code

float4x4 matWorldViewProj;       
float4x4 matWorld;       
float4x4 ProjTextureMatrix;

float4 vecLightDir;
float4 vecEye;
float4 vecProjDir;

texture ProjTexMap;
sampler ProjTexMapSampler = sampler_state
{
   Texture = &ltrojTexMap>;
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;   
   AddressU = clamp;
   AddressV = clamp;
   AddressW = clamp;   
};

// -------------------------------------------------------------
// Output channels
// -------------------------------------------------------------
struct VS_OUTPUT
{
    float4 Pos  : POSITION;
    float3 Light : TEXCOORD0;
    float3 Norm : TEXCOORD1;
    float3 View : TEXCOORD2;
};

// -------------------------------------------------------------
// Output channels
// -------------------------------------------------------------
struct VS_OUTPUTPROJTEX
{
    float4 Pos : POSITION;
    float4 Norm : TEXCOORD0;
    float4 Tex : TEXCOORD1;
    float4 Proj : TEXCOORD2;
};


// -------------------------------------------------------------
// vertex shader function (input channels)
// -------------------------------------------------------------
VS_OUTPUT VS(float4 Pos : POSITION, float3 Normal : NORMAL)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;      
    Out.Pos = mul(Pos, matWorldViewProj);                        // transform Position
    Out.Light = vecLightDir;                                                // L
    float3 PosWorld = normalize(mul(Pos, matWorld));
    Out.View = vecEye - PosWorld;                                        // V
    Out.Norm = mul(Normal, matWorld);                                // N
   
   return Out;
}

// -------------------------------------------------------------
// vertex shader function (input channels)
// -------------------------------------------------------------
VS_OUTPUTPROJTEX VSProjTexture(float4 Pos : POSITION, float3 Normal : NORMAL)
{
    VS_OUTPUTPROJTEX Out = (VS_OUTPUTPROJTEX)0;      
    Out.Pos = mul(Pos, matWorldViewProj);                                // transform Position
        Out.Tex = mul(Pos, ProjTextureMatrix);                                // project texture coordinates
       
    float4 PosWorld = normalize(mul(Pos, matWorld));        // vertex in world space
    Out.Norm = normalize(mul(Normal, matWorld));                // normal in world space
    Out.Proj = PosWorld - normalize(vecProjDir);                // projection vector in world space

   return Out;
}

// -------------------------------------------------------------
// Pixel Shader (input channels)utput channel
// -------------------------------------------------------------
float4 PS(float3 Light: TEXCOORD0, float3 Norm : TEXCOORD1, float3 View : TEXCOORD2) : COLOR
{
    float4 diffuse = { 1.0f, 0.0f, 0.0f, 1.0f};
    float4 ambient = {0.1,  0.0,  0.0, 1.0};
       
    float3 Normal = normalize(Norm);
    float3 LightDir = normalize(Light);
    float3 ViewDir = normalize(View);   
    float4 diff = saturate(dot(Normal, LightDir)); // diffuse component

    // compute self-shadowing term
    float shadow = saturate(4* diff);
        
    float3 Reflect = normalize(2 * diff * Normal - LightDir);  // R
    float4 specular = pow(saturate(dot(Reflect, ViewDir)), 8); // R.V^n

    // I = ambient + shadow * (Dcolor * N.L + (R.V)n)
    return ambient + shadow * (diffuse * diff + specular);
}

// -------------------------------------------------------------
// Pixel Shader (input channels):output channel
// -------------------------------------------------------------
float4 PSProjTexture(float4 Norm : TEXCOORD0, float4 Tex: TEXCOORD1, float4 Proj : TEXCOORD2) : COLOR
{
    float3 Normal = {Norm.x,Norm.y,Norm.z};
    float LdotN = dot(Normal, normalize(vecLightDir)); // diffuse component
    float factor;       
    if (LdotN<0.25f)
        factor=0.75f;
    else if (LdotN<0.50f)
        factor=0.5f;
    else if (LdotN<0.75f)
        factor=0.25f;
    else
        factor=0.0f;
   
    Tex.y=Tex.y/4+factor;

    if (dot(Proj, Norm) <= 0.1)
                return Tex.w < 0.0 ? 0.0 : tex2Dproj(ProjTexMapSampler, Tex);
    else
                return 1.0;
}


// -------------------------------------------------------------
//
// -------------------------------------------------------------
technique TShader
{
    pass P0
    {
        // compile shaders
        VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }

    pass P1
    {
        Sampler[0] = (ProjTexMapSampler);               
   
        // enable alpha blending
        AlphaBlendEnable = TRUE;
        SrcBlend         = ZERO;
        DestBlend        = SRCCOLOR;
   
        // compile shaders
        VertexShader = compile vs_1_1 VSProjTexture();
        PixelShader  = compile ps_2_0 PSProjTexture();
    }
}

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-1-30 01:50:00 | 显示全部楼层

Re:pencil sketch shading

大概看了下你的code,没有调试。

在PSProjTexture里,看你的代码好象是4个不同密度的texture竖着排在一起,但是我不知道你的ProjTextureMatrix是怎么设置的。不过如果你的texture的长宽是1:1,在Y方向平均分成4个密度的texture,那么结果应该是正确的。发texture发上来看看吧。如果texture设置正确,结果不正确,那就是projTextureMatrix有错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 10:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表