基于compute shader生成热力图
Requirements
- 由离散的测温点得到炉体表面的热力图
- 测温点分布不均匀,数量较多(如下图)
Solution
我们采用反距离权重差值(IDW)生成连续的热力图。受炉体结构的对称性影响,直接应用三维空间的欧氏距离计算的结果有较大偏差。因此我们将测温点的三维坐标映射成二维坐标
ComputeShader
:测温点向量(x/y/z对于角度/高度/温度) :贴图分辨率,最大高度,用于坐标映射 :IDW参数 :温度区间,用于归一化
将thread id转换为高度角度
在遍历每个温度点计算权重时,为避免0°和360°交界处不平滑,角度差应调整到0-180°之间,则角度差应为(
表示第 测温点) 则
的最终权重为
Code
1 | float2 coord = float2(id.x * 360 / xRes, id.y * yHeight / yRes); |
STEPS
- Initialize:Including parameters for both compute shader and material, RenderTexture & ComputeBuffer.
- Dispatch Compute Shader
- Assign RenderTexture to Material.
- Release buffer.
- Convert to Texture2D for inverse-sampling(Mouse click interaction)
tips
由于角度和高度单位不一致,因此
Result
在Fragment Shader中采用相同的方式,将世界空间的坐标转换为角度和高度进行采样,得到的r值作为uv再采样Gradient贴图,最后效果为