| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #include "Common.hlsl"
- Texture2D<float4> textures[] : register(t0, space1);
- SamplerState gSampler : register(s0, space0);
- struct VertexData
- {
- float2 texcoord;
- float3 normal;
- };
- StructuredBuffer<int> textureIdBuffer : register(t1, space2);
- StructuredBuffer<int> indexBuffer : register(t1, space3);
- StructuredBuffer<VertexData> vertexData : register(t1, space4);
- StructuredBuffer<int> indexOffsetBuffer : register(t1, space5);
- [shader("anyhit")]
- void SimpleBlocksAnyHit(inout HitInfo payload, SimpleBlocksAttributes attrib)
- {
- //payload.colorAndDistance = float4(1, 1, 1, 1.0);
- int instanceId = InstanceID();
- int currentTriangle = PrimitiveIndex();
- int geometryIndex = GeometryIndex();
- int textureId = textureIdBuffer[geometryIndex];
- Texture2D<float4> texture = textures[textureId];
- int index = indexOffsetBuffer[geometryIndex] + currentTriangle * 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();
- }
- }
|