GPU RayTracing

参考自:

https://github.com/Ubpa/ToyRTX

使用三种Texture 记录场景数据

1.SceneData

2.MatData

3.PackData

数据:

https://docs.qq.com/sheet/DQ2FqdE1jYWZpTldC?tab=BB08J2

SceneData:

01234
typemat_idhas material childend
OT_Group-1050
5678910
mat_idhas material packData/4childend
OT_Transform01011-5
11121314151617
mat_idhas material packData/4childend
OT_BVHNode-101118-11
18192021
packData/4
OT_Triangle-10

 MatData:

01
type
2(RTX_DIELECTRIC)1.5( refract_idx)

11121314151617
mat_idhas material packData/4childend
OT_BVHNode-101118-11

RayTrace Code:

struct HitRst TraceScene(inout struct Ray ray,inout struct HitRst finalHitRst){
	finalHitRst = Hitrst_InVaild;
	Stack_Push(3.0);
	while(!Stack_Empty()){
		float pIdx = Stack_Pop();
		float idx = At(SceneData, pIdx);

		if(idx <= 0.0){
			idx = -idx;
			float type = At(SceneData,idx);
			if(type == HitableType_Group || type == HitableType_BVH || type == HitableType_TriMesh){

				
				float matIdx = At(SceneData,idx+1.0);
				if(matIdx == -1.0)
					continue;

				float in_tMax = Stack_Pop();
				if (ray.tMax < in_tMax && finalHitRst.isMatCoverable == 1.0){
					finalHitRst.matIdx = matIdx;
					finalHitRst.isMatCoverable = At(SceneData, idx+2.0);
				}
			}
			else if (type == HitableType_Transform) {

				float in_tMax = Stack_Pop();// 进入节点时的tMax
				mat4 tfmMat4;
				GetPackData(At(SceneData,idx+3), tfmMat4);
				Ray_Transform(ray, tfmMat4);

				if(ray.tMax <= in_tMax){
					mat3 normTfmMat3;
					GetPackData((At(SceneData,idx+3.0)+8.0), normTfmMat3);
					Vertex_Transform(finalHitRst.vertex, tfmMat4, normTfmMat3);

					//if(finalHitRst.isMatCoverable == 1.0){
						float matIdx = At(SceneData, idx+1);
						if(matIdx != -1.0){
							finalHitRst.matIdx = matIdx;
							finalHitRst.isMatCoverable = At(SceneData, idx+2);
						}
					//}
				}
			}
			continue;
		}

		Stack_Push(pIdx+1.0);
		float type = At(SceneData,idx);
		if(type == HitableType_Sphere){
			RayIn_Sphere(idx, ray, finalHitRst);
		}
		else if(type == HitableType_Group){
			float matIdx = At(SceneData,idx+1.0);
			if(matIdx != -1.0)
				Stack_Push(ray.tMax);
			Stack_Push(idx+3.0);
		}
		else if(type == HitableType_BVH || type == HitableType_TriMesh){

			if(AABB_Hit(ray,idx+3.0)){
				float matIdx = At(SceneData,idx+1.0);
				if(matIdx != -1.0)
					Stack_Push(ray.tMax);
				Stack_Push(idx+4.0);
			}
		}
		else if(type == HitableType_Transform){
			mat4 invMat;
			GetPackData((At(SceneData,idx+3.0)+4.0),invMat);
			Ray_Transform(ray,invMat);
			Stack_Push(ray.tMax);
			Stack_Push(idx+4.0);

		}
		else if(type == HitableType_Triangle){
			
			RayIn_Triangle(idx, ray, finalHitRst);
		}
		else if(type == HitableType_Volume){
			//RayIn_Volume(idx, ray, finalHitRst);
		}
	}
	return finalHitRst;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值