Intersection-Shader
Ein Shader, der verwendet wird, um benutzerdefinierte Schnittmengenprimitiven für Lichtstrahl zu implementieren, die ein zugeordnetes Begrenzungsvolumen (Begrenzungsfeld) überschneiden.
Der Schnittpunkt-Shader hat keinen Zugriff auf die Raynutzlast, definiert aber die Schnittmengenattribute für jeden Treffer durch einen Aufruf von ReportHit. Die Behandlung von ReportHit kann den Schnittpunkt-Shader frühzeitig beenden, wenn das Rayflag RAY FLAG ACCEPT FIRST _ _ _ _ HIT_\AND _ \END _ SEARCH festgelegt ist oder AcceptHitAndEndSearch von einem beliebigen Treffer-Shader aufgerufen wird. Andernfalls wird TRUE zurückgegeben, wenn der Treffer akzeptiert wurde, oder FALSE, wenn der Treffer abgelehnt wurde. Dies bedeutet, dass ein beliebiger Treffer-Shader, sofern vorhanden, ausgeführt werden muss, bevor die Steuerung bedingt zum Schnittpunkt-Shader zurückkehrt.
Shadertypattribut
[shader("intersection")]
Beispiel
struct CustomPrimitiveDef { ... };
struct MyAttributes { ... };
struct CustomIntersectionIterator {...};
void InitCustomIntersectionIterator(CustomIntersectionIterator it) {...}
bool IntersectCustomPrimitiveFrontToBack(
CustomPrimitiveDef prim,
inout CustomIntersectionIterator it,
float3 origin, float3 dir,
float rayTMin, inout float curT,
out MyAttributes attr);
[shader("intersection")]
void intersection_main()
{
float THit = RayTCurrent();
MyAttributes attr;
CustomIntersectionIterator it;
InitCustomIntersectionIterator(it);
while(IntersectCustomPrimitiveFrontToBack(
CustomPrimitiveDefinitions[LocalConstants.PrimitiveIndex],
it, ObjectRayOrigin(), ObjectRayDirection(),
RayTMin(), THit, attr))
{
// Exit on the first hit. Note that if the ray has
// RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH or an
// anyhit shader is used and calls AcceptHitAndEndSearch(),
// that would also fully exit this intersection shader (making
// the “break” below moot in that case).
if (ReportHit(THit, /*hitKind*/ 0, attr) && (RayFlags() & RAY_FLAG_FORCE_OPAQUE))
break;
}
}