Shader(HLSL)_Diectx_Effect关键字的说明

HLSL:

discard : 忽略,不填充这个像素,同样模版深度也没有

语义POSITIONT 其实没什么用 而且编译不过因为dx内部没有定义,其对应关系为:根据D3DDECLUSAGE_POSITION解释如果顶点格式为POSITION或XYZRHW那么这个顶点缓冲区不会进入vertex processing的 
                     FVF                           usage                       HLSL
            D3DFVF_XYZRHW                  D3DDECLUSAGE_POSITION                   POSITIONT

 

POSITION[n] : shader3.0以下版本中n的值域[0,0],3.0以上为任意数,其作用是用来做顶点混合用的.

比如:在同一个模型的两个不同的动作之间做差值,POSITION = POSITION1 * (1.0 - TWEENFACTOR) + POSITION2 * TWEENFACTOR.

tex2Dproj:

ret tex2Dproj(s, t)

未命名

     当 s 使用的贴图类型为D3DUSAGE_DEPTHSTENCIL(也就是ZBuffer)时,tex2Dproj就用t.z跟s里面的z值作比较,

比较结果会记录在 ret,所以当s为D3DUSAGE_DEPTHSTENCIL时,ret返回的是1或0(float4种四个值都是一样的),当前像素深度值

如果小于s里的z值那么返回1否则返回0.

Diectx:

D3DTSS_TCI_CAMERASPACEPOSITION :

该参数是自动生成纹理中一个,他的意思是是用摄像机空间的顶点作为UV输出,但有个小问题就是摄像机如果距离太远的话画面就会。。

这是相机在 (0,0,250)的位置上的画面:      这是摄像机在(0,0,10)上的UV:

未命名未命名  UV寻址为WRAP

SetRenderTarget:

Directx9.0c在shader中实现MRT

HRESULT SetRenderTarget(

[in] DWORD RenderTargetIndex,

[in] IDirect3DSurface9 *pRenderTarget );

参数:

RenderTargetIndex : 序列号,其最最大值可以通过 D3DCAPS9.NumSimultaneousRTs获得一般是4

pRenderTarget : 渲染表面指针

shader PS COLOR[n]:Output color ,其中n的数值与RenderTargetIndex 一 一对应

CPP:

pdevice->SetRenderTarget(0,MRT1);

pdevice->SetRenderTarget(1,MRT2);

// 渲染

//最后要清除

pdevice->SetRenderTarget(0,MainRT);

pdevice->SetRenderTarget(1,NLL);

HLSL:

struct OUT_PS
{
    float4 fcolor0:COLOR0;
    float4 fcolor1:COLOR1;
};

OUT_PS PS_Main()
{
    OUT_PS psout;
    psout.fcolor0 = float4(1,1,0,1);
    psout.fcolor1 = float4(1,0,1,1);
    return psout;
}

效果图:

未命名

D3DVIEWPORT9:

该结构的 MinZ 和 MaxZ,根据 SDK帮助文档解释当顶点的z小于MinZ大于MaxZ时将被裁减掉。

数学公式: Z` = Z * (MaxZ - MinZ)+MinZ 根据公式可以知道当 MinZ 和 MaxZ为同一值是比如0.3并且深度检测函数设置为lessequal(小于等于)通过,那么在此之后的所有顶点的深度都将被设为0.3

D3DDECLUSAGE_POSITIONT:

使用了D3DDECLUSAGE_POSITIONT的顶点声明

(D3DUSAGE_POSITIONT, 0)顶点元素的存在用来告诉设备输入的顶点数据已经经过了顶点处理(和FVF中设置了D3DFVF_XYZRHW位相似)。在绘制时,如果当前设置的顶点声明中的某一元素具有(D3DUSAGE_POSITIONT, 0)语义,那么整个顶点处理会被略过(就和FVF中设置了D3DFVF_XYZRHW位相似)。

使用(D3DDECLUSAGE_POSITIONT, 0)的顶点声明有一些限制:

  • 此类声明中只能使用数据流零。
  • 顶点元素必须以偏移量递增的方式存储。(就是所有数据都要在一个数据流里面)
  • 数据流中的偏移量必须对齐到DWORD。
  • 一对相同的(用途,用途索引)只能出现一次。
  • 只能使用D3DDECLMETHOD_DEFAULT方法。
  • 其余顶点元素不能具有(D3DDECLUSAGE_POSITION, 0)语义。

此外,此类声明还有一些与驱动程序版本有关的限制。这些限制的存在是因为Direct3D直接把此类声明传送给驱动程序而没有做任何转换。

 

Effect:

ID3DXEffect::CommitChanges:

Propagate state changes that occur inside of an active pass to the device before rendering

重新设置数据以后,使用这个方法确认修改,不然的话,数据不会更新。

也就说该函数要在数据重新设置时候渲染下一个物体之前调用,例如在Pass里渲染2个物体 A,B,用矩阵M1变化A用M2变化B,如果在渲染完A之后渲染B之前没有调用CommitChanges()那么重新设置的矩阵M2是没有效果的B使用的仍然是M1.

代码例子:

g_pEffect->BeginPass(iPass);
g_pEffect->SetMatrix( "matWorld", &M1);
g_pMesh->DrawSubset(0);

g_pEffect->SetMatrix( "matWorld", &M2);

g_pEffect->CommitChanges(); // 如果放在g_pEffect->SetMatrix( "matWorld", &M2);上面将不会有效果
g_pMesh->DrawSubset(0);
g_pEffect->EndPass();

转载于:https://www.cnblogs.com/ThreeThousandBigWorld/archive/2012/09/23/2699042.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值