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

zenyiyizen 2010-11-09 06:24:25
我是一名美工,最近正在学习shader,如下代码是一个可以正常在MAX里编译的发光shader的源代码,关于technique和Pass的Script的注解我一直没弄明白,请哪位朋友给指点一二吧。

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

string ParamID = "0x000001";



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;
}

...全文
620 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
IONPhantom 2011-04-26
  • 打赏
  • 举报
回复
我说的是max script shader 不是单纯的 script

现在的max如果在DirectX模式的编辑模式下使用的是 Shader 渲染,一部分的 Shader 可以在 Max的目录里找到,一部分已经被编译成二进制了看不到.

effect 是微软对 HLSL 的一个扩展,effect存成的文件是 .fx

从 DX11 开始 Effect 系统已经被微软抛弃,不但没进入到 D3D 的核心库以至于连 D3DX 库都被踢出去了,现在只是在例子里面的一个开源项目.DX11 SDK 的所有 DX11 的 Demo 没有一个是使用 Effect 做的,也就是 Effect 已经开始成为过去了

D3D API 是唯一的接口,没有什么新的解决方案(即使是以前的 Effect 实际上最终也是调用 API)
udumbara007 2011-04-26
  • 打赏
  • 举报
回复
这是哪跟哪啊
怎么max的script又冒出shader来了?
max什么时候能编写shader了?
怎么又成了基于DX的了?

fx和cgfx是一种着色器语言的交换格式,它们是可以跨平台使用的,max提供了DX的shader材质,自然就可以在max里预览。和max有啥牵扯啊?

怎么effect又淘汰了?特效不要了啊?
新的替换解决方案是啥啊?
IONPhantom 2011-04-26
  • 打赏
  • 举报
回复
Max Script 的 Shader 是基于 D3DX Effect 扩展的,不是标准,而且 Effect 本身也已经是将要被淘汰的东西了,还是看标准的 HLSL 吧
udumbara007 2011-04-26
  • 打赏
  • 举报
回复
Using SAS
with CgFX and FX file
formats

已经上传了,文档对于anotation中使用的script介绍的十分详细。
udumbara007 2011-04-26
  • 打赏
  • 举报
回复
美工和程序员的思维是有很大差异的,简单的问题说不明白是很正常的
udumbara007 2011-04-26
  • 打赏
  • 举报
回复
technique是实现特效的手段,可以根据硬件的性能设置不同的technique,以便在不同性能的显卡上也能运行,比如在低端显卡上

pass,有点类似photoshop里图层的作用,一层一层叠加,不过有先后顺序,在posteffcet(后期合成)中这个顺序就很重要,最后叠加出最终效果

关于script,你可以在nvidia上查找一个sas帮助,里面有全部的说明。

好了,结贴把分给我吧。
libra101015 2010-12-01
  • 打赏
  • 举报
回复
简单来说
technique 就是要实现某种渲染效果的所有pass
pass 就是显卡进行一次渲染所需的所有资源(PS VS但都不是必须)
Viskag 2010-11-30
  • 打赏
  • 举报
回复
楼主结贴率又是0,悲剧啊
Viskag 2010-11-18
  • 打赏
  • 举报
回复
楼主你如果想学习Shader的话,我认为应该从简单的Shader开始学起,循序渐进,Glow应该是边缘发光的效果,如果一上手就学这么复杂的Shader不合适。作为美工学D3D是让人钦佩的事,我相信如果把DX的SDK前面10多个简单的例子的Shader搞明白了,就基本能看懂Glow,Blur的shader了。至于更高级的如何运用深度缓冲模板缓冲来实现特效需要看下专门讲深度模板的例子,我自己也是实验了很长时间才明白的。
还有程序员喜欢说术语是因为GPU编程本身就很抽象,除了那几个词根本没法用别的方式表达。
jerris 2010-11-18
  • 打赏
  • 举报
回复
technique 包含 pass。
一个technique 至少要有一个pass。


再一次的CG渲染过程中technique只能使用一次。而pass可以多重叠加。
Viskag 2010-11-17
  • 打赏
  • 举报
回复
我的理解是一个Technique里包含了若干了个pass,每个pass包含VS,GS,PS和一些状态设置,结构应该是:
Technique techName
{
pass passName1
{
VS1();
GS1();
PS1();
BlendState(参数);//可以没有,采用默认
RasterizerState(参数);//可以没有,采用默认
DepthStencilState(参数);//可以没有,采用默认
}
pass passName2
}
...
}
...
...
}

基本上pass是一个基本功能单元,点线面数据进入显卡,按照pass描述的流程走,最后显示在屏幕。
若干个pass构成的Technique,Technique可以认为是有意义的功能单元。有些简单的只需要1个pass。
============================================
RenderColorTarget0=xxxxxx,应该是把结果画到xxxxxx这张图上的意思,不确定。

string Script= "RenderColorTarget0=;"
"Draw=Geometry;";
我猜这个pass只是走一遍流程,并不画出图来,目的是为了走Geomitry(这个你应该很难理解)

"ClearSetColor=ClearColor;"
这个是用你指定的ClearColor"作为初始背景颜色,你就在这个背景颜色上画。

"ClearSetDepth=ClearDepth;"
这个是用你指定的ClearDepth"作为全屏初始深度,你就在这个初始深度上画,如果深度比这个还深的话,是画不上去的。一般是1.0吧?

script=0.8,不清楚哪里用到了,应该是程序的其他有用到,不了解也没关系

texture DepthBuffer : RENDERDEPTHSTENCILTARGET是深度模板图,每个像素对应一个32bit的数据,24bit表示深度值,8bit表示模板值(format = "D24S8"; ),这个你是看不了,是在显存里,如果你想看到的话必须把显存里的这段数据Map到内存上再看,实现起来不太方便,而且就算能读到这段数据,直观的看这张图也是一张乱七八糟的图。之所以要搞这张图是为了实现某些效果必须决定有些点要画上去,有些点我们不希望画上去。作为美工应该不需要掌握。
  • 打赏
  • 举报
回复
100,好多分啊!

technique只是初始化一些变量,注册多个pass的用途。
pass 就是多个渲染的状态。

---------------------------------------------
RENDERCOLORTARGET - RENDER COLOR TARGET,应该是自定义的类型

GlowMap1,GlowMap2这个不需要解释,未赋值的意义一般是沿用上一次pass的设定。

pass 中<>的内容是你初始化的部分,看看cpp文件中是怎么设置的。
-----------------------------------------
"Draw=Geometry;"; 是什么意思,为什么有的pass是"Draw=Buffer;"; ?

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

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

(字面的意思)
-----------------------------------------
float Script : STANDARDSGLOBAL ---我猜应该是全局状态的修正值,0.8就是标准状态的80%

texture DepthBuffer : RENDERDEPTHSTENCILTARGET 继续猜,depthbuffer纹理将作为一个蒙版阴影,look,在pass中“RenderDepthStencilTarget=DepthBuffer;”

深度缓冲是cpp应该处理的,hlsl只负责打点。

------------------------------------------
说完,不一定正确,收工。



zenyiyizen 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangci226 的回复:]
建议楼主还是先看看计算机图形学,弄清楚图形管线

这里也不好解释
[/Quote]

我清楚图形管线的流程,我想问的是怎么用HLSL的Script语法去控制它,而不是有人一副高深莫测的样子告诉我要学上几年的3D数学基础并且弄清楚显卡图形管线中渲染的每个步骤,然后用D3D的Device->SetRenderState()或Device->Clear()这样的编程语句,才能实现它!

我想这是很多程序员的通病,当美工想要的效果实现不了时总是他们总是喜欢说着一堆美工不懂的专业术语,然后告诉你这个做不了那个效果没有别人的好……这也是我这个美工为什么要自学D3D编程的原因!

我要做的东西是为美工服务的,美工关心的是怎么实现那个效果,而不是实现那个效果需要用到的矩阵变换是什么!
张赐 2010-11-09
  • 打赏
  • 举报
回复
建议楼主还是先看看计算机图形学,弄清楚图形管线

这里也不好解释
chifagao 2010-11-09
  • 打赏
  • 举报
回复
帮顶了,最近才开始学 shader。我是名程序。
zenyiyizen 2010-11-09
  • 打赏
  • 举报
回复
// 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;"
"Pass=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();
}

}

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

比方说 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程序中使用它们,并且查看它们渲出来的结果。

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧