Files
Seele/res/shaders/raytracing/ClosestHit.slang
T

48 lines
2.2 KiB
Plaintext
Raw Normal View History

2024-07-08 13:46:49 +02:00
import Common;
import MaterialParameter;
import LightEnv;
2024-07-10 21:07:10 +02:00
import Scene;
import RayTracingData;
2024-09-27 15:57:37 +02:00
import StaticMeshVertexData;
2024-07-15 17:55:22 +02:00
import Material;
import MATERIAL_FILE_NAME;
2024-07-08 13:46:49 +02:00
// simplification: all BLAS only have 1 geometry
[shader("closesthit")]
2024-07-12 13:33:52 +02:00
void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttributes attr)
2024-07-08 13:46:49 +02:00
{
2024-07-15 17:55:22 +02:00
const float3 barycentricCoords = float3(1.0f - attr.barycentrics.x - attr.barycentrics.y, attr.barycentrics.x, attr.barycentrics.y);
2024-07-08 13:46:49 +02:00
2024-07-15 17:55:22 +02:00
InstanceData inst = pScene.instances[InstanceID()];
MeshData m = pScene.meshData[InstanceID()];
2024-07-12 13:33:52 +02:00
2024-07-15 17:55:22 +02:00
// offset into the index buffer
uint indexOffset = m.firstIndex;
// added to indices to reference correct part of global mesh pool
uint vertexOffset = pScene.meshletInfos[m.meshletOffset].indicesOffset;
uint vertexIndex0 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 0];
uint vertexIndex1 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 1];
uint vertexIndex2 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 2];
VertexAttributes attr0 = pVertexData.getAttributes(vertexIndex0);
VertexAttributes attr1 = pVertexData.getAttributes(vertexIndex1);
VertexAttributes attr2 = pVertexData.getAttributes(vertexIndex2);
FragmentParameter f0 = attr0.getParameter(inst.transformMatrix);
FragmentParameter f1 = attr1.getParameter(inst.transformMatrix);
FragmentParameter f2 = attr2.getParameter(inst.transformMatrix);
FragmentParameter params = FragmentParameter.interpolate(f0, f1, f2, barycentricCoords);
MaterialParameter materialParams = params.getMaterialParameter();
2024-12-25 14:59:08 +01:00
let brdf = Material.prepare(materialParams);
2024-07-16 16:44:56 +02:00
2024-12-25 14:59:08 +01:00
hitValue.material.color = float4(brdf.baseColor, 1);
hitValue.material.emissive = float3(0, 0, 0);
hitValue.shading.position = WorldRayOrigin() + RayTCurrent() * WorldRayDirection();
hitValue.shading.normal = cross(f2.position_WS - f0.position_WS, f1.position_WS - f0.position_WS);
hitValue.shading.normalLight = dot(hitValue.shading.normal, WorldRayDirection()) < 0 ? hitValue.shading.normal : -hitValue.shading.normal;
2024-07-08 13:46:49 +02:00
}