光线追踪--computer shader 输入参数

参考:https://zhuanlan.zhihu.com/p/135144894

GPU以“工作组“”的方式调用shader,每个工作组是三维的(以方便一维、二维图形、三维粒子等多种场景下的计算);

  1. in uvec3 gl_NumWorkGroups;
    分别保存x, y, z方向上的工作组最大个数;

  2. in uvec3 gl_WorkGroupSize
    每个工作组在x, y, z方向上的大小;
    通过 gl_NumWorkGroups和gl_WorkGroupSize可以计算出总共有多少次单独的着色器调用(注:不是有多少个GPU 线程Core,而是调用次数)= (Groups.x * Size.x) * (Groups.y * Size.y) * (Groups.z * Size.z)

  3. in uvec3 gl_WorkGroupID;
    当前工作组在全局工作组中的索引ID;

  4. in uvec3 gl_LocalInvocationID;
    本地工作组中的shader调用的索引,显然其x, y, z取值范围不会超过gl_WorkGroupSize.x y z;

5. in uvec3 gl_GlobalInvocationID;
当前全局调用的索引值,不过它是三维的,需要做扁平化才能作为一个一维索引(比如在1SPP的情况下,该一维索引可以作为Ray-Id);

gl_GlobalInvocationID = gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID;
若z为0,则二维扁平化后:gl_Index = gl_GlobalInvocationID.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x + gl_GlobalInvocationID.x;

  1. in uint gl_LocalInvocationIndex;
    扁平化版本的gl_GlobalInvocationID,其计算方式如下:
    gl_LocalInvocationIndex = gl_LocalInvocationID.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y * gl_WorkGroupSize.x +gl_LocalInvocationID.x;
    注:当gl_NumWorkGroups为1时(此时gl_WorkGroupID为0),gl_LocalInvocationIndex才是全局唯一的;所以实际调试时常常见gl_NumWorkGroups设为1以方便计算。

如果gl_NumWorkGroups不是1,则全局唯一的index计算方式应该如下:
uvec3 uvw = gl_WorkGroupID.xyz * gl_WorkGroupSize.xyz + gl_LocalInvocationID.xyz;
uint gl_Index = uvw.z * gl_NumWorkGroups.x * gl_WorkGroupSize.x * gl_NumWorkGroups.y * gl_WorkGroupSize.y + uvw.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x + uvw.x;

  1. 每个group的size是在computer shader中定义的,比如:
    layout (local_size_x = 16, local_size_y = 16) in;
    groupCount则是在vkCmdDispatch命令中配置;

  2. 如何设置参数groupCount和local_size的参数?
    对于二维图片,其height和width必须是groupCount * local_size的整数倍,而且groupCount * local_size不能太小,否则Computer shader的计算性能会下降;

    参考:https://blog.csdn.net/koibiki/article/details/80590885

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法编写实际的shader代码。但是,我可以为您提供一些关于光线追踪的基本知识和流程,以帮助您开始编写自己的shader光线追踪是一种计算机图形学技术,用于渲染非常逼真的3D图像。它基于光线与物体之间的相互作用来模拟光的传播。在光线追踪中,从相机发射一条射线,并跟踪光线与场景中的物体相交的情况,以确定最终的颜色值。 以下是光线追踪的基本流程: 1. 发射一条射线从相机位置出发,穿过像素点。 2. 检测光线是否与场景中的任何物体相交。 3. 如果光线与物体相交,则计算相交点处的光照值。 4. 如果光线与物体不相交,则返回背景颜色。 5. 重复以上步骤,直到所有像素点都被渲染。 光线追踪的核心是计算光线与物体相交的过程。这可以通过使用光线和物体的几何信息来实现。在shader中,这些信息通常以向量和矩阵的形式表示。 光线追踪还涉及到材质的渲染。不同的材质会对光线的传播产生不同的影响,例如反射、折射、吸收等。在shader中,需要编写特定的函数来计算每种材质的光照效果。 最后,光线追踪还需要考虑阴影的影响。当光线与场景中的物体相交时,需要检查该点是否处于阴影区域中。如果是,则不需要计算该点的光照值。 总的来说,光线追踪是一种非常复杂的技术,需要深入的数学和计算机图形学知识。如果您对此感兴趣,建议先学习光线追踪的基本原理和流程,然后通过编写简单的shader来进行实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值