游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8781|回复: 21

关于technique和pass的注解意义,有人能给解释一下吗?

[复制链接]

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2010-11-9 10:02:00 | 显示全部楼层 |阅读模式
我是一名美工,最近正在学习shader,如下代码是一个可以正常在MAX里编译的发光shader的源代码,关于technique和Pass的Script的注解我一直没弄明白,请哪位朋友给指点一二吧。

----------------------------------------------------------------------------------------------------------

string ParamID = "0x000001";        // this string tells 3ds Max to use the DXSAS compiler



float3 EmissiveColor
<
        string UIName = "Color";
        string UIWidget = "Color";
> = {1.0f, 0.0196078f, 0.0196078f };

float3 GlowColor : Emissive
<
        string UIName = "Color";
        string UIWidget = "Color";
> = {1.0f, 0.25098f, 0.25098f };



//----------------------------------

float4x4 wvp : WorldViewProjection;  
//float4x4 worldI : WorldInverse;  


// Render-to-Texture (RTT) glow example. Copyright NVIDIA (provided 'as is'). Adapted from HammerTime.fx in 3dsmax       
float4 ClearColor : DIFFUSE = {0,0,0,1.0};
float ClearDepth
<
        string UIWidget = "none";
> = 1.0;

float Script : STANDARDSGLOBAL
<
        string UIWidget = "none";
        string ScriptClass = "object";
        string ScriptOrder = "standard";
        string ScriptOutput = "color";

        // Call a script in the main technique.
        string Script = "Technique=Technique?Complete;";

> = 0.8;

#define RTT_SIZE 128

float TexelIncrement <
    string UIName = "Texel Stride for Blur";
    string UIWidget = "None";
> = 1.0f / RTT_SIZE;

texture GlowMap1 : RENDERCOLORTARGET
<  
        float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    int MIPLEVELS = 1;
    string format = "X8R8G8B8";
    string UIWidget = "None";
>;

texture GlowMap2 : RENDERCOLORTARGET
<  
        float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    int MIPLEVELS = 1;
    string format = "X8R8G8B8";
    string UIWidget = "None";
>;

sampler GlowSamp1 = sampler_state  
{
    texture = <GlowMap1>;
    AddressU  = CLAMP;
    AddressV  = CLAMP;
    AddressW  = CLAMP;
    MIPFILTER = NONE;
    MINFILTER = LINEAR;
    MAGFILTER = LINEAR;
};

sampler GlowSamp2 = sampler_state  
{
    texture = <GlowMap2>;
    AddressU  = CLAMP;
    AddressV  = CLAMP;
    AddressW  = CLAMP;
    MIPFILTER = NONE;
    MINFILTER = LINEAR;
    MAGFILTER = LINEAR;
};

texture DepthBuffer : RENDERDEPTHSTENCILTARGET
<
        float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    string format = "D24S8";
    string UIWidget = "None";
>;
// input from application
struct a2v {
float4 position : POSITION;
float2 texCoord : TEXCOORD0;
};

// output to fragment program
struct v2f {
float4 position : POSITION;
float2 texCoord : TEXCOORD0;
};

struct VS_OUTPUT_BLUR
{
    float4 Position   : POSITION;
    float4 TexCoord0   : TEXCOORD0;
    float4 TexCoord1   : TEXCOORD1;
    float4 TexCoord2   : TEXCOORD2;
    float4 TexCoord3   : TEXCOORD3;
    float4 TexCoord4   : TEXCOORD4;
    float4 TexCoord5   : TEXCOORD5;
    float4 TexCoord6   : TEXCOORD6;
    float4 TexCoord7   : TEXCOORD7;
    float4 TexCoord8   : COLOR;   
};

struct VS_OUTPUT
{
           float4 Position   : POSITION;
    float4 Diffuse    : COLOR0;
    float4 TexCoord0   : TEXCOORD0;
};

v2f VS(a2v In)
{
    v2f Out = (v2f)0;
    Out.position = mul(In.position, wvp);                                //transform vert position to homogeneous clip space
    return Out;
}

v2f VS_Quad(a2v In, float3 DEFTexCoord : TEXCOORD0)
{
    v2f Out = (v2f)0;
    Out.position = In.position;
    Out.texCoord = DEFTexCoord;  
    return Out;
}

VS_OUTPUT_BLUR VS_Quad_Vertical_9tap(float3 Position : POSITION,  
                        float3 TexCoord : TEXCOORD0)
{
    VS_OUTPUT_BLUR OUT = (VS_OUTPUT_BLUR)0;
    OUT.Position = float4(Position, 1);
     
    float3 Coord = float3(TexCoord.x + TexelIncrement, TexCoord.y + TexelIncrement, 1);
    OUT.TexCoord0 = float4(Coord.x, Coord.y + TexelIncrement, TexCoord.z, 1);
    OUT.TexCoord1 = float4(Coord.x, Coord.y + TexelIncrement * 2, TexCoord.z, 1);
    OUT.TexCoord2 = float4(Coord.x, Coord.y + TexelIncrement * 3, TexCoord.z, 1);
    OUT.TexCoord3 = float4(Coord.x, Coord.y + TexelIncrement * 4, TexCoord.z, 1);
    OUT.TexCoord4 = float4(Coord.x, Coord.y, TexCoord.z, 1);
    OUT.TexCoord5 = float4(Coord.x, Coord.y - TexelIncrement, TexCoord.z, 1);
    OUT.TexCoord6 = float4(Coord.x, Coord.y - TexelIncrement * 2, TexCoord.z, 1);
    OUT.TexCoord7 = float4(Coord.x, Coord.y - TexelIncrement * 3, TexCoord.z, 1);
    OUT.TexCoord8 = float4(Coord.x, Coord.y - TexelIncrement * 4, TexCoord.z, 1);
    return OUT;
}

VS_OUTPUT_BLUR VS_Quad_Horizontal_9tap(float3 Position : POSITION,  
                        float3 TexCoord : TEXCOORD0)
{
    VS_OUTPUT_BLUR OUT = (VS_OUTPUT_BLUR)0;
    OUT.Position = float4(Position, 1);
     
    float3 Coord = float3(TexCoord.x + TexelIncrement, TexCoord.y + TexelIncrement, 1);
    OUT.TexCoord0 = float4(Coord.x + TexelIncrement, Coord.y, TexCoord.z, 1);
    OUT.TexCoord1 = float4(Coord.x + TexelIncrement * 2, Coord.y, TexCoord.z, 1);
    OUT.TexCoord2 = float4(Coord.x + TexelIncrement * 3, Coord.y, TexCoord.z, 1);
    OUT.TexCoord3 = float4(Coord.x + TexelIncrement * 4, Coord.y, TexCoord.z, 1);
    OUT.TexCoord4 = float4(Coord.x, Coord.y, TexCoord.z, 1);
    OUT.TexCoord5 = float4(Coord.x - TexelIncrement, Coord.y, TexCoord.z, 1);
    OUT.TexCoord6 = float4(Coord.x - TexelIncrement * 2, Coord.y, TexCoord.z, 1);
    OUT.TexCoord7 = float4(Coord.x - TexelIncrement * 3, Coord.y, TexCoord.z, 1);
    OUT.TexCoord8 = float4(Coord.x - TexelIncrement * 4, Coord.y, TexCoord.z, 1);
    return OUT;
}

// map the glow-mask texture to the screen - no lighting
// this shader will draw to a texture
float4 PS_BlurBuffer(v2f In) : COLOR
{   
        float4 Col = float4(1,1,1,1);

        float3 input2 = GlowColor.rgb;

        Col = float4(input2.rgb, 1);
        Col *= float4(1,1,1,1);
        return Col;
}   

// For two-pass blur, we have chosen to do  the horizontal blur FIRST. The
//        vertical pass includes a post-blur scale factor.

// Relative filter weights indexed by distance from 'home' texel
//    This set for 9-texel sampling
#define WT9_0 1.0
#define WT9_1 0.8
#define WT9_2 0.6
#define WT9_3 0.4
#define WT9_4 0.2
#define WT9_NORMALIZE (WT9_0+2.0*(WT9_1+WT9_2+WT9_3+WT9_4))

float4 PS_Blur_Horizontal_9tap(VS_OUTPUT_BLUR IN) : COLOR
{   
    float4 OutCol = (float4)0;
    OutCol += tex2D(GlowSamp1, IN.TexCoord0.xy) * (WT9_1/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord1.xy) * (WT9_2/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord2.xy) * (WT9_3/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord3.xy) * (WT9_4/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord4.xy) * (WT9_0/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord5.xy) * (WT9_1/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord6.xy) * (WT9_2/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord7.xy) * (WT9_3/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp1, IN.TexCoord8.xy) * (WT9_3/WT9_NORMALIZE);
    return OutCol;
}  

float4 PS_Blur_Vertical_9tap(VS_OUTPUT_BLUR IN, v2f In) : COLOR
{   
    float4 OutCol = (float4)0;
    OutCol += tex2D(GlowSamp2, IN.TexCoord0.xy) * (WT9_1/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord1.xy) * (WT9_2/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord2.xy) * (WT9_3/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord3.xy) * (WT9_4/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord4.xy) * (WT9_0/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord5.xy) * (WT9_1/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord6.xy) * (WT9_2/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord7.xy) * (WT9_3/WT9_NORMALIZE);
    OutCol += tex2D(GlowSamp2, IN.TexCoord8.xy) * (WT9_3/WT9_NORMALIZE);
    return OutCol;
}  

// just drawn model itself

float4 PS_MODEL(v2f In) : COLOR
{
        float4 Col = float4(0,0,0,1);

        float3 input1 = EmissiveColor.rgb;

        Col =  float4(input1, 1);
        return Col;
}   

// add glow on top of model

float4 PS_GlowPass(VS_OUTPUT IN) : COLOR
{
        float4 tex = tex2D(GlowSamp1, float2(IN.TexCoord0.x, IN.TexCoord0.y));
        return tex;
}   

technique Complete  
<
        string Script =
                        "ClearSetColor=ClearColor;"
                        "ClearSetDepth=ClearDepth;"
                        &quotass=BlurPass;"               
                "Pass=BlurGlowBuffer_Horz;"
                "Pass=BlurGlowBuffer_Vert;"
                "Pass=ModelPass1;"
                "Pass=GlowPass;";

>          
{

        pass BlurPass
        <
            string Script = "RenderColorTarget0=GlowMap1;"
            "RenderDepthStencilTarget=DepthBuffer;"
                "Clear=Color;"
                "Clear=Depth;"
                "Draw=Geometry;";
        >
        {
                CullMode = none;
                ZEnable = true;         
        VertexShader = compile vs_3_0 VS();
        PixelShader = compile ps_3_0 PS_BlurBuffer();
        }
       

    pass BlurGlowBuffer_Horz  
    <  
            string Script ="RenderColorTarget0=GlowMap2;"
            "RenderDepthStencilTarget=DepthBuffer;"
                "Clear=Color;"
                "Clear=Depth;"
                "Draw=Buffer;";
    >
        {
                CullMode = none;
                ZEnable = false;
                VertexShader = compile vs_3_0 VS_Quad_Horizontal_9tap();
                PixelShader  = compile ps_3_0 PS_Blur_Horizontal_9tap();
    }

    pass BlurGlowBuffer_Vert  
     <
            string Script = "RenderColorTarget0=GlowMap1;"
            "RenderDepthStencilTarget=DepthBuffer;"
                "Clear=Color;"
                "Clear=Depth;"
                "Draw=Buffer;";
    >
        {
                CullMode = none;
                ZEnable = false;
                VertexShader = compile vs_3_0 VS_Quad_Vertical_9tap();
                PixelShader  = compile ps_3_0 PS_Blur_Vertical_9tap();
    }


    pass ModelPass1
    <
           string Script= "RenderColorTarget0=;"
                                                "Draw=Geometry;";
    >
    {
        AlphaBlendEnable = false;
                AlphaTestEnable = FALSE;
                CullMode = cw;
                ZEnable = true;
                VertexShader = compile vs_3_0 VS();
                PixelShader = compile ps_3_0 PS_MODEL();
    }
       
    pass GlowPass
    <
               string Script= "RenderColorTarget0=;"
                "Draw=Buffer;";                 
        >
    {
                CullMode = none;
                ZEnable = false;
                ZWriteEnable = false;
                AlphaBlendEnable = true;
                SrcBlend = One;
                DestBlend = One;
                AlphaTestEnable = FALSE;
                VertexShader = compile vs_3_0 VS_Quad();         
                PixelShader = compile ps_3_0 PS_GlowPass();         
    }
       
}   
------------------------------------------------------------------------------------------------
我弄不明白的是,这些代码是什么意思,如何发生作用的,我没有在DX的SDK帮助文件中找到关于Script这种注解类型的说明。:
string Script= "RenderColorTarget0=;"
"Draw=Buffer;";
string Script= "RenderColorTarget0=;"
"Draw=Geometry;";
string Script = "RenderColorTarget0=GlowMap1;"
"RenderDepthStencilTarget=DepthBuffer;"
"Clear=Color;"
"Clear=Depth;"
"Draw=Buffer;";
string Script =
"ClearSetColor=ClearColor;"
"ClearSetDepth=ClearDepth;"
"Pass=BlurPass;"               
"Pass=BlurGlowBuffer_Horz;"
"Pass=BlurGlowBuffer_Vert;"
"Pass=ModelPass1;"
"Pass=GlowPass;";


还有这些贴图,它们后面的语义代表的是什么意思,是如何在technique和pass中产生作用的:
texture DepthBuffer : RENDERDEPTHSTENCILTARGET
<
    float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    string format = "D24S8";
    string UIWidget = "None";
>;

texture GlowMap1 : RENDERCOLORTARGET
<  
    float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    int MIPLEVELS = 1;
    string format = "X8R8G8B8";
    string UIWidget = "None";
>;

float Script : STANDARDSGLOBAL
<
        string UIWidget = "none";
        string ScriptClass = "object";
        string ScriptOrder = "standard";
        string ScriptOutput = "color";

        // Call a script in the main technique.
        string Script = "Technique=Technique?Complete;";

> = 0.8;

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-11-9 16:20:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

annotation一般用来为shader添加元数据,对shader程序本身是没什么意义的

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2010-11-9 18:01:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

能解释清楚一些吗?比方说 RENDERCOLORTARGET 的语义是什么意思?为什么有的pass是"RenderColorTarget0=GlowMap1;" ,有的pass是"RenderColorTarget0=;" ?

"Draw=Geometry;"; 是什么意思,为什么有的pass是"Draw=Buffer;"; ?

clear=color 和 clear=Buffer是什么意思?

"ClearSetColor=ClearColor;" 和"ClearSetDepth=ClearDepth;"是什么意思?


float Script : STANDARDSGLOBAL 是什么意思?它的那些注解是什么意思?为什么它的初始值是0.8?

texture DepthBuffer : RENDERDEPTHSTENCILTARGET 是渲染出深度缓冲的意思,但是怎么在technique中显示它们渲染出来的结果呢?

我知道深度缓冲和模版缓冲的意思,但是我不知道怎么在shader程序中使用它们,并且查看它们渲出来的结果。

0

主题

22

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2010-11-9 19:27:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

RENDERCOLORTARGET就是渲染到纹理
RenderColorTarget0=GlowMap1表示渲染到纹理GlowMap1中
RenderColorTarget0=;表示恢复到默认值,也就是渲染到后缓冲中

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-11-10 01:11:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

呃,你不是程序,这个还真不太好解释....

1. annotation和大部分变量声明时的semantic对shader程序来说都是透明名的,也就是单纯对shader来说:
texture GlowMap1 : RENDERCOLORTARGET
<  
float2 Dimensions = { RTT_SIZE, RTT_SIZE };
    int MIPLEVELS = 1;
    string format = "X8R8G8B8";
    string UIWidget = "None";
>;

texture GlowMap1;
是一样的。

2. 在directx的effect框架下,可以通过类似GetSemantic和GetAnnotation之类的函数获得semantic和Annotation,并且得到的值都是字符串。

3. semantic和annotaion存在的意义,是为了让shader实现数据驱动式的渲染。
比如程序解析某个pass的annotation时,发现了clear=color 和 clear=Buffer这样的语句,那么就知道在渲染这个pass前,应该先clear backbuffer和depthbuffer。

4. semantic和annotation并没有标准的关键字。
比如,对max来说clear=color的意思是clear backbuffer,对其他程序来说相同的命令也能是clear = backbuffer。HLSL并没有定义annotation的标准,也不要求应用程序*必须*解析annotation,因此
a. 由于annotation只是一个字符串,不同软件下,annotation的关键字会有区别,比如3d max,maya或者fx composer之间的定义就不太一样,它是软件和用户之间的一种协定,不是标准,所以具体某得annotation的用法,你应该查看相关产品的文档。
b. 某些软件可能不想支持shader通过annotation数据驱动渲染,因此会完全忽略annotation,不进行任何解析,导致shader在不同软件下,出现不同行为。



11

主题

80

帖子

146

积分

注册会员

Rank: 2

积分
146
发表于 2010-11-10 09:07:00 | 显示全部楼层

Re: 关于technique和pass的注解意义,有人能给解释一下吗?

美工也要用shader工作了?!

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2010-11-10 14:54:00 | 显示全部楼层

Re: Re:关于technique和pass的注解意义,有人能给解释一下吗?

clayman: Re:关于technique和pass的注解意义,有人能给解释一下吗?

呃,你不是程序,这个还真不太好解释....

1. annotation和大部分变量声明时的semantic对shader程序来说都...


啊,没想到clayman大哥来为我解答,真是太感动了![em6]您的博客和您翻译的前四章《TheCompleteEffectandHLSLGuide》我是经常拜读啊!让我受益菲浅!
看了你刚才的那些解释,我明白了,这些script的注解只是shader程序片断传递给3DMAX编译器的一种信号方式,每个软件对于语义和注解的约定都是不一样的,最近我拿MAX和Virtools的shader语义规则对比过才有所醒悟(我之前一直以为这是DX编程的一种规范呢)。看来如果我想知道这方面的信息,应该去MAX的SDK文档找找关于script注解这方面的约定规范。我说怎么在DX的SDK文档上一直没找到呢。

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2010-11-10 14:58:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

另外,希望您能抽空多在博客上写一些关于shader的技巧和让我们这些新手容易弄混淆的概念知识。不胜感谢!

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2010-11-10 15:18:00 | 显示全部楼层

Re: Re: 关于technique和pass的注解意义,有人能给解释一下吗?

like_new1: Re: 关于technique和pass的注解意义,有人能给解释一下吗?

美工也要用shader工作了?!


我是一名不服输的美工!

以前有一些很机械化的工作,比如贴图的命名、文件的指定、材质的批量设置、模型的改名、蒙皮的权重值改变……本来是只要公司的程序花个一两天就能做出来的小程序。两三分钟就能够自动处理的事情,却总是找各种借口推托,没有时间呀、不太了解呀……让美工自已手工去一个一个的修改,所以我就自学了MAX脚本语言,现在不会再有这种问题困扰我了。

现在为了让引擎实现某种效果,我文档写了一堆、BUG提了一堆,两三年也没有程序去真正用心去改良过。一切依然如旧,效果还是一如既往的差。效果出不来,黑锅还是一如既往的由美工来背。只要那些几年没有更新过的编辑器不崩溃到用不了,就没有人会去理会。所以我现在自学了3D数学,了解图形渲染管线,学习DX,学习shader,学习怎么实现法线贴图,学习什么叫矩阵变换,学习了怎么让效果变得更好一点,学习了怎么才能让光源背部不是那么的死黑……因为我深刻体会到一句话,求人不如求已!

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2010-11-10 20:36:00 | 显示全部楼层

Re:关于technique和pass的注解意义,有人能给解释一下吗?

LZ探索和不服输的精神让人佩服,期待你成为一个技术美工
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-7 04:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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