#include "Common.hlsl" Texture2D textures[] : register(t0, space1); SamplerState gSampler : register(s0, space0); struct VertexData { float2 texcoord; float3 normal; }; StructuredBuffer textureIdBuffer : register(t1, space2); StructuredBuffer indexBuffer : register(t1, space3); StructuredBuffer vertexData : register(t1, space4); StructuredBuffer polygonSizeBuffer : register(t1, space5); [shader("anyhit")] void AnyHit(inout HitInfo payload, SimpleBlocksAttributes attrib) { //payload.colorAndDistance = float4(1, 1, 1, 1.0); int instanceId = InstanceID(); int currentTriangle = PrimitiveIndex(); int textureId = 0; for (int i = 0; currentTriangle >= 0; i++) { currentTriangle -= polygonSizeBuffer[i]; textureId = textureIdBuffer[i]; } Texture2D texture = textures[textureId]; int index = PrimitiveIndex() * 3; VertexData v0 = vertexData[indexBuffer[index]]; VertexData v1 = vertexData[indexBuffer[index + 1]]; VertexData v2 = vertexData[indexBuffer[index + 2]]; float2 texcoord = v0.texcoord * (1 - attrib.bary.x - attrib.bary.y) + v1.texcoord * attrib.bary.x + v2.texcoord * attrib.bary.y; float4 color = texture.SampleLevel(gSampler, texcoord, 0); if (color.w == 0.f) { IgnoreHit(); } float distance = RayTCurrent(); bool found = false; for (int i = 0; i < payload.hitCount; i++) { if (payload.distance[i] > distance) { found = true; float4 tmpColor = payload.color[i]; payload.color[i] = color; float tmpDistance = payload.distance[i]; payload.distance[i] = distance; int tmpDayLight = payload.dayLight[i]; payload.dayLight[i] = 0xFFFFFF; int tmpDynamicLight = payload.dynamicLight[i]; payload.dynamicLight[i] = 0xFFFFFF; if (color.w == 1.f) { payload.hitCount = i + 1; } else { for (int j = i + 1; j < payload.hitCount + 1 && j < MAX_TRANSPACENT_HITS; j++) { float4 tmpColor2 = payload.color[j]; float tmpDistance2 = payload.distance[j]; int tmpDayLight2 = payload.dayLight[j]; int tmpDynamicLight2 = payload.dynamicLight[j]; payload.color[j] = tmpColor; payload.distance[j] = tmpDistance; payload.dayLight[j] = tmpDayLight; payload.dynamicLight[j] = tmpDynamicLight; tmpColor = tmpColor2; tmpDistance = tmpDistance2; tmpDayLight = tmpDayLight2; tmpDynamicLight = tmpDynamicLight2; } } break; } else { if (payload.color[i].w == 1.f) { found = true; break; } } } if (!found && payload.hitCount < MAX_TRANSPACENT_HITS) { payload.color[payload.hitCount] = color; payload.distance[payload.hitCount] = distance; payload.dayLight[payload.hitCount] = 0xFFFFFF; payload.dynamicLight[payload.hitCount] = 0xFFFFFF; payload.hitCount++; } if (color.w < 1.f) { IgnoreHit(); } }