Поделиться через


Шейдер создания лучей

Шейдер, вызывающий TraceRay для создания лучей. Начальные пользовательские полезные данные для каждого луча предоставляются на сайт вызова TraceRay . CallShader также можно использовать в шейдерах создания лучей для вызова вызываемых шейдеров.

DispatchRays вызывает сетку вызовов шейдера создания лучей. Каждый вызов (поток) шейдера создания лучей знает свое расположение в общей сетке, может генерировать произвольные лучи с помощью TraceRay и работает независимо от других вызовов. Нет определенного порядка выполнения потоков по отношению друг к другу.

Атрибут типа шейдера

[shader("raygeneration")]

Пример

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);
}