• 高级着色语言HLSL入门(2


    16.2.1 常量表

    每个着色器有一个常量表,用来保存它的变量。D3DX库通过ID3DXConstantTable接口,提供给应用程序访问着色器的常量表。通过这个接口我们能够在应用程序中设置着色器源代码中的变量。

    我们现在描述ID3DXConstantTable接口的方法列表的实现,全部的列表请查阅Direct3D文档。

    16.2.1.1 取得常量句柄

    为了在应用程序中设置着色器中的一个特定变量,需要有一种方法去引用它,我们能够在应用程序中用D3DXHANDLE引用一个在着色器中的变量,下面的方法返回一个着色器中的变量的D3DXHANDLE,使用时,需要传递一个变量的名字作为参数:

    D3DXHANDLE ID3DXConstantTable::GetConstantByName(

         D3DXHANDLE hConstant, // scope of constant

         LPCSTR pName          // name of constant

    );

    Hconstant——我们要取得的父结构中变量句柄的D3DXHANDLE标识。例如,如果我们想获得一个特定数据结构中单一数据成员的句柄,我们可以传递结构实例的句柄。如果我们获得一个顶级变量的句柄,给这个参数设为NULL。

    PName——我们想获得的句柄的着色器代码中的变量的名字。

    Gets a constant by looking up its name.

    D3DXHANDLE GetConstantByName(
    D3DXHANDLE hConstant,
    LPCSTR pName
    );

    Parameters

    hConstant
    [in] Unique identifier to the parent data structure. If the constant is a top-level parameter (there is no parent data structure), use NULL.
    pName
    [in] Name of the constant.

    Return Values

    Returns a unique identifier to the constant.

    例如,如果在着色器中变量的名字为ViewProjMatrix,并且这是顶级变量,我们这么写:

    // 取得着色器中ViewProjMatrix变量的句柄

    D3DXHANDLE h0;

    h0 = ConstTable->GetConstantByName(0, "ViewProjMatrix");

    16.2.1.2 设置常量

    一旦应用程序有了一个D3DXHANDLE,要引用着色器代码中的具体变量,我们可以在应用程序中使用ID3DXConstantTable::SetXXX方法设置变量。如果我们想设置一个向量数组类型的变量,方法名是SetVectorArray。

    ID3DXConstantTable::SetXXX的一般语法是:

    HRESULT ID3DXConstantTable::SetXXX(

         LPDIRECT3DDEVICE9 pDevice,

         D3DXHANDLE hConstant,

         XXX value

    );

    PDevice:常量表所关联的设备的指针。

    HConstant:我们正在设置的变量句柄的引用。

    Value:我们要把变量设置成的值,XXX是我们设置的要替换的变量类型名,对于有些类型(bool, int, float),传递变量值的COPY,另外一些类型(vectors, matrices, structures),传递值的指针。

    下面的列表描述了我们能用ID3DXConstantTable接口设置的类型列表。这里假定我们有一个有效的设备,和一个有效句柄。

    SetBool—Used to set a Boolean value. Sample call:

    bool b = true;

    ConstTable->SetBool(Device, handle, b);

    Sets a Boolean value.

    HRESULT SetBool(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    BOOL b
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the constant. See D3DXHANDLE.
    b
    [in] Boolean value.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetBoolArray—Used to set a Boolean array. Sample call:

    bool b[3] = {true, false, true};

    ConstTable->SetBoolArray(Device, handle, b, 3);

    Sets an array of Boolean values.

    HRESULT SetBoolArray(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    CONST BOOL* pB,
    UINT Count
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the array of constants. See D3DXHANDLE.
    pB
    [in] Array of Boolean values.
    Count
    [in] Number of Boolean values in the array.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetFloat—Used to set a float. Sample call:

    float f = 3.14f;

    ConstTable->SetFloat(Device, handle, f);

    Sets a floating-point number.

    HRESULT SetFloat(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    FLOAT f
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the constant. See D3DXHANDLE.
    f
    [in] Floating-point number.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetFloatArray—Used to set a float array. Sample call:

    float f[2] = {1.0f, 2.0f};

    ConstTable->SetFloatArray(Device, handle, f, 2);

    Sets an array of floating-point numbers.

    HRESULT SetFloatArray(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    CONST FLOAT* pf,
    UINT Count
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the array of constants. See D3DXHANDLE.
    pf
    [in] Array of floating-point numbers.
    Count
    [in] Number of floating-point values in the array.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetInt—Used to set an integer. Sample call:

    int x = 4;

    ConstTable->SetInt(Device, handle, x);

    Sets an integer value.

    HRESULT SetInt(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    INT n
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the constant. See D3DXHANDLE.
    n
    [in] Integer.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

    SetMatrix—Used to set a 4 × 4 matrix. Sample call:

    D3DXMATRIX M(…);

    ConstTable->SetMatrix(Device, handle, &M);

    Sets a nontransposed matrix.

    HRESULT SetMatrix(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    CONST D3DXMATRIX* pMatrix
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the matrix of constants. See D3DXHANDLE.
    pMatrix
    [in] Pointer to a nontransposed matrix. See D3DXMATRIX.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetMatrixArray—Used to set a 4 × 4 matrix array. Sample call:

    D3DXMATRIX M[4];

    // ...Initialize matrices

    ConstTable->SetMatrixArray(Device, handle, M, 4);

    Sets an array of nontransposed matrices.

    HRESULT SetMatrixArray(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    CONST D3DXMATRIX* pMatrix,
    UINT Count
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to the array of constant matrices.
    pMatrix
    [in] Array of nontransposed matrices.
    Count
    [in] Number of matrices in the array.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.


    SetMatrixPointerArray—Used to set an array of 4 × 4 matrix pointers. Sample call:

    D3DXMATRIX* M[4];

    // ...Allocate and initialize matrix pointers

    ConstTable->SetMatrixPointerArray(Device, handle, M, 4);

    Sets an array of pointers to nontransposed matrices.

    HRESULT SetMatrixPointerArray(
    LPDIRECT3DDEVICE9 pDevice,
    D3DXHANDLE hConstant,
    CONST D3DXMATRIX ** ppMatrix,
    UINT Count
    );

    Parameters

    pDevice
    [in] Pointer to an IDirect3DDevice9 interface, representing the device associated with the constant table.
    hConstant
    [in] Unique identifier to an array of constant matrices.
    ppMatrix
    [in] Array of pointers to nontransposed matrices.
    Count
    [in] Number of matrices in the array.

    Return Values

    If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

    Remarks

    A nontransposed matrix contains row-major data; that is, each vector is contained in a row.

  • 相关阅读:
    C++编写ATM(2)
    【Python排序搜索基本算法】之Dijkstra算法
    Java中List转换为数组,数组转List
    [置顶] 亚信联创实习笔记
    PL/SQL 异常处理程序
    CSS position财产
    malloc()与calloc差异
    Qt5官方demo分析集10——Qt Quick Particles Examples
    栈和堆之间的差
    深入浅出JMS(一)——JMS简要
  • 原文地址:https://www.cnblogs.com/8586/p/1401970.html
Copyright © 2020-2023  润新知