Keresés

Új hozzászólás Aktív témák

  • sghc_toma

    senior tag

    válasz HThomas #3649 üzenetére

    igazából én is innen-onnan szedtem össze minden tudásomat, szóval nem ismerek olyan anyagot, ami átfogóan bemutatja a HLSL-t.. az nVidia developer oldalát szoktam nézegetni ([link]), meg az SDK doksit, illetve a példaprogikat...

  • sghc_toma

    senior tag

    válasz HThomas #3647 üzenetére

    Hello!

    Először is létrehozod a buffert:

    ID3D10Buffer * g_pCBuffer;

    // Fill a buffer description structure
    D3D10_BUFFER_DESC cbDesc;
    cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
    cbDesc.ByteWidth = sizeof(D3DXVECTOR4) * 100;
    cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
    cbDesc.MiscFlags = 0;
    cbDesc.Usage = D3D10_USAGE_DYNAMIC;

    // Create the buffer
    g_pd3dDevice->CreateBuffer(&cbDesc, NULL, &g_pCBuffer);

    // Tell the device that we want to use the buffer
    g_pd3dDevice->PSSetConstantBuffers(0, 1, &g_pCBuffer);

    Aztán az .fx fájlban (vagy ha nem használod az effekt frameworkot akkor értelemszerűen a pixel shader-ed forrásában) létrehozol egy konstans buffer változót:

    cbuffer MyConstantBuffer
    {
    float4 Coordinates[100];
    };

    A buffer adatait a shader-ből simán a Coordinates változót használva éred el.

    A CPU-ról a bufferbe így tudsz másolni:

    D3DXVECTOR4 * data;
    // Map buffer to system memory
    g_pCBuffer->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void **)&data);

    // Fill the buffer
    for (int i = 0; i < 100; ++i)
    {
    data[i].x = 1.0f;
    data[i].y = 0.0f;
    data[i].z = 1.0f;
    data[i].w = 0.0f
    }

    // Unmap buffer
    g_pCBuffer->Unmap();

    Természetesen a for ciklus helyett úgy töltöd fel a tömböt, ahogy csak akarod (memcpy, például).

    Remélem tudtam segíteni. Ja, még valami, amire figyelned kell: egy konstans buffer-ben max 4096db 4*32 bites vektor lehet, és a pixel shader-hez max 14 db cbuffer-t köthetsz.

Új hozzászólás Aktív témák