GPU RayTracing

2023-11-06

参考自:

https://github.com/Ubpa/ToyRTX

使用三种Texture 记录场景数据

1.SceneData

2.MatData

3.PackData

数据:

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

SceneData:

0 1 2 3 4
type mat_id has material child end
OT_Group -1 0 5 0
5 6 7 8 9 10
mat_id has material packData/4 child end
OT_Transform 0 1 0 11 -5
11 12 13 14 15 16 17
mat_id has material packData/4 child end
OT_BVHNode -1 0 11 18 -11
18 19 20 21
packData/4
OT_Triangle -1 0

 MatData:

0 1
type
2(RTX_DIELECTRIC) 1.5( refract_idx)

11 12 13 14 15 16 17
mat_id has material packData/4 child end
OT_BVHNode -1 0 11 18 -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;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU RayTracing 的相关文章

  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 纹理的内部格式

    看下面的OpenGL函数 void glTexImage2D GLenum target GLint level GLint internalFormat GLsizei width GLsizei height GLint border
  • 帧缓冲区和在 opengl 中使用着色器

    我对帧缓冲区有点困惑 我想要做的是使用附加了多个纹理的帧缓冲区 填充每个纹理 然后使用着色器组合 混合 所有纹理以创建新的输出 听起来很容易 是的 我也是这么想的 但我不明白 如何将当前绑定的纹理传递给着色器 您需要的是将纹理放入特定的槽中
  • 纹理映射 C++ OpenGL

    我已经阅读了相关内容 包括 Nehe 和此处的解决方案 但我找不到具体的答案 我正在尝试加载一张名为stars jpg 的照片 我想通过使用 uv 坐标映射它来使其成为场景的背景 方法是 glBegin GL QUADS glTexCoor
  • 帧缓冲区/颜色缓冲区?

    有人可以指出我两者是否相同吗 我的意思是我一直在阅读有关它的信息 这里的红皮书说 颜色缓冲区本身可以由多个子缓冲区组成 系统上的帧缓冲区包含所有这些缓冲区 here http glprogramming com red chapter10
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • glColor4f() - alpha 值的效果

    我正在使用 glColor4f 令人惊讶的是 更改 alpha 即第四个参数 不会导致透明度发生任何变化 代码段是 const GLfloat squareVertices 0 5 0 5 0 0 0 5 0 5 0 0 0 5 0 5 0
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 在 3D 场景中实现“抓取”相机平移工具

    在我的场景中 我有想要 抓取 的地形 然后在移动光标时让相机平移 其高度 视图向量 视野等全部保持不变 因此 最初的 抓取 点将是世界空间中的工作点 我希望在拖动时该点保留在光标下方 我当前的解决方案是获取前一个和当前的屏幕点 取消投影它们
  • 移动/调整大小期间 opengl 窗口冻结

    我正在使用 LWJGL 开发游戏 移动窗口时 计划将来添加调整大小代码 渲染循环冻结 我希望它在移动时继续以某种方式运行 LWJGL 不包括 glutMainLoop Display属于OpenGL 而不是Java 相关代码 regular
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • OpenGL - 自动生成 glDrawArrays 的索引/步幅参数

    我正在渲染一个包含大量数据点 gt 1M 的网格结构 我的数据结构如图所示 所以我的索引缓冲区的内容看起来像这样0 100 1 101 2 102 3 103 我对索引缓冲区的巨大尺寸有点恼火 我需要它来定义我的三角形带 是否有可能告诉 O
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni

随机推荐

  • 使用LSTM进行文本分类

    说明 之前写过用lstm模型做的文本分类 但是代码结构非常混乱 读过Bert源码后 决定模仿Bert的结构 自己重新写一遍使用lstm模型的代码 只作为熟悉tensorflow各个api与一个比较清楚的NLP模型结构的练手用 不求更高的准确
  • L1-046 整除光棍

    这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5
  • 关于int *a; int &a; int & *a; int * &a

    上述的四条语句 前面两个很好理解 而后面两个 大部分C 初学者都会比较困惑 今天我也是查阅了一些资料以后才恍然大悟 下面具体来说明一下 int i int a i 这里a是一个指针 它指向变量i int b i 这里b是一个引用 它是变量i
  • linux搭建 PXE 远程安装服务器及无人值守

    注意 新建虚拟机 cpu 2个 内存不能低于4g 内存不低于20g 否则会失败 步骤 root localhost systemctl stop firewalld service 关闭防火墙 root localhost setenfor
  • 修改mysql的时间/时区

    应用背景 有时候会发现数据库存储的时间与当前所在地区的时间不同 尤其是涉及到全球业务的时候 如果有些程序是根据时间判断来进行后面的逻辑 往db中insert数据发现时间不对 尤其是新DB 可能是mysql设置不对 这时由于时区问题影响存入的
  • 【热门框架】Maven怎样进行版本管理?有哪些需要注意事项?

    Maven的版本管理是指对项目的依赖库和发布版本进行管理 可以通过配置pom xml文件来实现 下面是Maven进行版本管理的一些要点和注意事项 依赖库版本管理 在pom xml文件中 可以通过dependencyManagement元素来
  • java 内存分配策略

    1 对象优先在新生代Eden区中进行分配 当Eden区没有足够空间进行分配时 虚拟机进行一次Minor GC 2 大对象直接进入老年代 所谓大对象就是需要大量连续内存空间的java对象 最典型的大对象就是很长的字符串以及数组 3 长期存活的
  • 汇编指令:左移RL和RLC区别

    转载 https www cnblogs com zhangfan2014 p 4583947 html 汇编指令RL和RLC区别 RL是左移指令 参加左移的是8个位 RLC是带进位位的左移 参加左移的共有9个位 设A 0100 0001
  • 跳点搜索算法 (JPS算法) && 效率优化(摘录)

    摘自 腾讯游戏开发精粹 摘录一次加深记忆方便查找 并未盈利 如有侵权 联系作者删除 如感兴趣 请购买原书支持 谢谢配合 JPS主体思路 表现上 JSP算法比A 快很多 实际上快到哪里了 我们大概了解一下 A 会遍历每一个附近的点 然后把符合
  • 【RTT驱动框架分析07】- adc驱动框架分析+adc中断唤醒adc驱动

    ADC adc应用开发 访问 ADC 设备 应用程序通过 RT Thread 提供的 ADC 设备管理接口来访问 ADC 硬件 相关接口如下所示 函数 描述 rt device find 根据 ADC 设备名称查找设备获取设备句柄 rt a
  • xshell5激活

    xshell5产品秘钥 150105 116578 999990 xftp5产品秘钥 150105 116578 999990 xshell5产品秘钥 101210 450789 147200 xftp5产品秘钥 101210 450789
  • 突发奇想-基于重力感应的人体姿态控制型无人机

    基于重力感应的人体姿态控制型无人机 初级阶段目标 短距离重力感应控制 遥控器重力模块直接连接控制 手持遥控器不平稳问题 最终目标 控制系统迁移至人体 进行直接姿态操作 重力感应 压电效应 当晶体受到固定方向外力作用时 内部产生电极化现象 同
  • [YOLO专题-28]:YOLO V5 代码管理 - 如何与官网协同开发自己的项目代码

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122519479 目录 前言
  • C++数组练习题(一)

    在刚开始学习c 的时候刷了很多基础题 这些基础题比较适合初学C 的码友 所以在学完就立即进行了整理 一是为了让初学C 的码友有所参考 二也是为了复习一下所学过知识 但因为当时在整理时 时间有点紧促 可能会出现一些小错误 于是利用五一假期对之
  • Tensorflow:数据特征值的自变量为离散值

    import pandas as pd from sklearn utils import shuffle dataSet pd read csv input mushrooms csv mapPto1Eto0 p 1 e 0 dataSe
  • vite详解

    vite详解 卖菜的小白的博客 CSDN博客 vite 一 认识vite webpack是目前整个前端使用最多的构建工具 但是除了webpack之后也存在其他一些构建工具 比如说rollup parcel gulp vite等等 vite的
  • Twitter开发者账号申请流程

    文章转自 https www jianshu com p cfb741dd52dd 这篇文章主要介绍在最新的推特开发者平台申请账号的流程 首先需要有一个推特账号 其次该推特账号必须是首次申请 因为推特开发者一个账号只能申请一次 申请后被拒绝
  • 【Streamlit学习心得】个人项目实战,并部署在Streamlit Cloud,生成一个公网url随时访问

    Streamlit学习心得 个人项目实战 并部署在Streamlit Cloud 生成一个公网url随时访问 目录 Streamlit学习心得 个人项目实战 并部署在Streamlit Cloud 生成一个公网url随时访问 前言 一 全局
  • TCP的连接

    一 套接字 1 每一条TCP连接有两个端点 TCP连接的端点叫做套接字 socket 或插口 2 套接字 socket IP地址 端口 例如 套接字 socket 192 168 170 1 80 二 TCP连接 1 建立连接时的三次 握手
  • GPU RayTracing

    参考自 https github com Ubpa ToyRTX 使用三种Texture 记录场景数据 1 SceneData 2 MatData 3 PackData 数据 https docs qq com sheet DQ2FqdE1