Cbuffer-spor

Cbuffer-spor h1>

Fa via App Store Les dette innlegget i var app!

Hvordan vet Direct3D om en konstant buffer er for vertex eller pixel shader?

Jeg har et sporsmal om konstante buffere i directX 11. De forvirrer meg og etter a ha sokt pa google de fleste nettsteder leverer du bare provekode uten a forklare hvordan det fungerer. Jeg ser sannsynligvis pa noe, men frem til na ser de ut til meg a jobbe med ren magi. Si at jeg har to konstante buffere i en hlsl-fil:

Og jeg lager en ekvivalent buffer i C ++ -programmet mitt slik:

Og sa oppdaterer jeg en slik:

Hvordan vet DirectX hvilke konstante buffere i min shader skal brukes til VS og hvilken for PS og hvilke buffere i kodene mine samsvarer med hvilke buffere i min hlsl? For eksempel kaller jeg VSSetConstantBuffers ovenfor og sender argumentene, og det vet automatisk at du kaster de tingene i bufferen per objekt, i motsetning til a prove a sette den i perFrame-bufferen. Sa vidt jeg kan fortelle nar jeg opprettet cbPerObjectBuffer, bundet jeg aldri eksplisitt til cbPerObject-bufferen i min hlsl. Er spornummer avhengig av hvilken rekkefolge bufferne vises i hlsl? Den eneste maten jeg kan finne ut er at datastrukturene bare definerer et grensesnitt til bufferminnet pa kortet, og det er opp til programmoren a bruke den riktige. For eksempel kan jeg prove a bruke cbPerFrame i min vertex shader og faktisk de samme dataene kan nas pa den maten, men for a fa riktige resultater ma du fa tilgang til det ved a bruke offsets i lysobjektet. Gjor det jeg spor, noe fornuftig? lol.

Nokkeltrinnet du mangler er den implisitte sporoppdraget som oppstar nar du kompilerer en shader. Nar du kompilerer en HLSL-skygge som inneholder et bindbart objekt (det v re seg en Texture2D, RWStructuredBuffer eller cbuffer), ma hver gjenstand tildeles et spornummer. Dette tilsvarer UINT StartSlot-parameteren til f.eks. VSSetConstantBuffers. Du kan eventuelt deklarere et spor eksplisitt ved bruk av f.eks. : Registrer (c0) som et declarations suffiks, men hvis du slipper ut sporet, vil kompilatoren tildele det laveste ledige sporet tilgjengelig.

Nar det gjelder ditt opprinnelige sporsmal, hvordan DidrectX «vet» hvilken cbuffer a binde, vel det gjor det ikke. Det som faktisk skjer er at siden du ser i vertex shader, refererer du bare til en cbuffer, som blir tildelt spor 0 for vertex shader nar du kompilerer den, og den andre blir ignorert. Pa samme mate oppstar det samme for pikselskyggeren, bortsett fra at den andre cbufferen er tilordnet til sporet 0. Dette betyr at nar du tilordner buffere til 0 StartSlot for bade vertex og pixel shader-stadiene, skjer det bare slik at de er de riktige buffere for de shaders. I utgangspunktet skjer det bare a fungere fordi spor 0 er alltid den rette sporet. Nar du kommer til mer avanserte shaders som refererer til flere cbuffer s, vil du bli vant til a tildele slots eksplisitt.

VSSetConstantBuffers star for VertexShaderSetConstantBuffers. Derfor har du ogsa PSSetConstantBuffers for pixel shader.