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:
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();