Freigeben über


Ray Generation-Shader

Ein Shader, der TraceRay aufruft, um Strahlen zu generieren. Die anfängliche benutzerdefinierte Raynutzlast für jeden Ray wird der TraceRay-Aufrufwebsite bereitgestellt. CallShader kann auch in Ray-Generation-Shadern verwendet werden, um aufrufbare Shader aufzurufen.

DispatchRays ruft ein Raster von Shaderaufrufen der Strahlgenerierung auf. Jeder Aufruf (Thread) eines Strahlgenerierungs-Shaders kennt seine Position im Gesamtraster, kann über TraceRay beliebige Strahlen erzeugen und arbeitet unabhängig von anderen Aufrufen. Es gibt keine definierte Reihenfolge der Ausführung von Threads untereinander.

Shadertyp-Attribut

[shader("raygeneration")]

Beispiel

struct SceneConstantStructure { ... };
ConstantBuffer<SceneConstantStructure> SceneConstants;
RaytracingAccelerationStructure MyAccelerationStructure : register(t3);
struct MyPayload { ... };

[shader("raygeneration")]
void raygen_main()
{
    RayDesc myRay = {
        SceneConstants.CameraOrigin,
        SceneConstants.TMin,
        computeRayDirection(SceneConstants.LensParams, DispatchRaysIndex(), 
                            DispatchRaysDimensions()),
        SceneConstants.TMax};
    MyPayload payload = { ... };    // init payload
    TraceRay(
        MyAccelerationStructure,
        SceneConstants.RayFlags,
        SceneConstants.InstanceInclusionMask,
        SceneConstants.RayContributionToHitGroupIndex,
        SceneConstants.MultiplierForGeometryContributionToHitGroupIndex,
        SceneConstants.MissShaderIndex,
        myRay,
        payload);
    WriteFinalPixel(DispatchRaysIndex(), payload);
}