zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    c 开发调试汇总
    中级 makefile
    flex
    asp.net的一个重要发现(Page_Load()的执行次序先控件的事件函数)。
    Google App Engine(GAE)入门教程翻译
    类QQ右下角弹出消息对话框(jQuery插件)
    c#过滤HTML代码
    python源码分析2
    asp.net(C#) 编码解码(HtmlEncode与HtmlEncode)
    js操作html的table,包括添加行,添加列,删除行,删除列,合并单元格(未实现)
  • 原文地址:https://www.cnblogs.com/ThreeThousandBigWorld/p/2699042.html
Copyright © 2011-2022 走看看