游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2329|回复: 1

救助OGRE的HLSL

[复制链接]

3

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2009-10-4 16:38:00 | 显示全部楼层 |阅读模式
float4 black={0.0f,0.0f,0.0f,0.0f};
uniform matrix                mWVP;
uniform matrix                mV;
uniform matrix                mP;
uniform texture tex;
uniform texture toontex;
uniform float k;
uniform float4 LightDirection;

//实际纹理
sampler2D tt= sampler_state
{
        Texture = <tex>;
        MinFilter = LINEAR;
        MagFilter = LINEAR;
        MipFilter = LINEAR;

};
//灰度图
sampler2D tx = sampler_state
{
        Texture = <toontex>;
        MinFilter = LINEAR;
        MagFilter = LINEAR;
        MipFilter = LINEAR;
};

struct CVS_INPUT
{
        float4 position : POSITION; //float4
        float4 normal   : NORMAL;   //float3
        float2 texcoord : TEXCOORD0;
};
struct CVS_OUTPUT
{
    float4 position : POSITION;
    float3 texcoord : TEXCOORD0;
};

CVS_OUTPUT CartoonVS(CVS_INPUT input)
{
    CVS_OUTPUT output = (CVS_OUTPUT)0;
       

    output.position = mul(input.position, mVP);


    input.normal.w=0.0f;
    LightDirection.w=0.0f;
    //法向量转换到世界坐标     
    float3 worldNormal = (mul(input.normal, mWVP));
    //光照方向转换到世界坐标
    LightDirection = (mul(LightDirection, mWVP));
    //得到光照与法向量的角度
    float u = dot(LightDirection,worldNormal);
    //保存角度

    if( u < 0.0f )u = 0.0f;

    output.texcoord =float3(input.texcoord,u);//float3(input.texcoord,0);
   
    return output;
}



struct CPS_INPUT
{
      float3 texcoord  : TEXCOORD0;
};

struct CPS_OUTPUT
{
    float4 color : COLOR;
};

CPS_OUTPUT CartoonPS(CPS_INPUT input)
{
    CPS_OUTPUT output = (CPS_OUTPUT)0;
       
    //通过阶层数计算灰度图的颜色
    float4 vIntensity = tex2D(tt, input.texcoord.xy);
    //与实际颜色合成
    vIntensity *= tex2D(tx, float2(input.texcoord.z,0.5f)).r;
    output.color =vIntensity;
   
    return output;
}


struct OUTLINE_INPUT
{
    float4 position : POSITION;
    float4 normal   : NORMAL0;
};

struct OUTLINE_OUTPUT
{
    float4 position : POSITION;
    float4 color : COLOR;
};


OUTLINE_OUTPUT Main(OUTLINE_INPUT input)
{
    OUTLINE_OUTPUT output = (OUTLINE_OUTPUT)0;

    input.position = mul(input.position, mWV);
   
    input.normal.w      = 0.0f;

    input.normal      = mul(input.normal, mWV);

    input.position += k * input.normal;

    output.position = mul(input.position, mP);

    output.color = black;
   
    return output;
}

technique CartoonTech
{
    pass P0
    {
        VertexShader = compile vs_2_0 CartoonVS();
        PixelShader  = compile ps_2_0 CartoonPS();
    }
    pass P1
    {
        VertexShader = compile vs_2_0 Main();
        PixelShader  = NULL;
        CullMode = CW;
    }  
}

这个HLSL 怎么翻译成OGRE脚本可以用的啊
是在搞不懂他那个脚本是怎么搞的,实验了好久好久都不行。[em7] [em7] [em7]
谢谢大家了!

7

主题

57

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2009-10-21 17:00:00 | 显示全部楼层

Re:救助OGRE的HLSL

哈,卡通渲染的shader,帮你顶一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-20 04:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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