layout: post
title: “中级Shader教程15 地形渲染”
date: 2018-04-23 16:09:03
author: Jiepeng Tan
categories:
- shader tutorial
tags: shader_tutorial mountain shader
img_path: /assets/img/blog/ShaderTutorial2D/Snow
mathjax: true
Shader 视频教程
1.前置知识链接
1.FBM请参考这篇文章中给出的链接
2.ranymarching 框架
2.抽取地形shader 通用函数
在处理类地形raymarching的过程中,为了优化,在raycast阶段会有一个大循环,为了性能,我们在这里采样的精度低一点,在计算法线的时候精度高一点,因为计算法线的时候,只有一次。
所以我们分为三种不同精度的Map函数,同样为了减少重复代码,我们使用宏来展开
#define Terrain(pos,NUM)\
float2 p = pos.xz*.9/_MaxTerrianH;\
float a = 0.0;\
float b = 0.491;\
float2 d = float2(0.0,0.);\
for( int i=0; i<NUM; i++ ){\
float n = Noised(p).x;\
a += b*n;\
b *= 0.49;\
p = p*2.01;\
}\
return float2(pos.y - _MaxTerrianH*a,1.);
float2 TerrainL(float3 pos){
Terrain(pos,5.);
}
float2 TerrainM(float3 pos){
Terrain(pos,9.);
}
float2 TerrainH(float3 pos){
Terrain(pos,15.);
}
float RaycastTerrain(float3 ro, float3 rd) {
_MRCRO_RAY_CAST(ro,rd,10000.,TerrainL);
}
float3 NormalTerrian( in float3 pos, float rz ){
_MACRO_CALC_NORMAL(pos,rz,TerrainH);
<