|
|
这个是在做基于GPU的LOD技术学习中写的一个程序,当时对<GPU精粹2>介绍的一种LOD技术反复研究,发现很难实现,于是写了这个测试程序.
该示例使用fault formation算法生成地形数据,之后进行平滑处理,最后把高度数据转存成bmp文件,程序在首次执行时检查有没有之前生成的高度数据文件,没有就使用fault formation算法生成高度图.
主函数读入4张纹理,在shader中对pos的y值做判断,计算出每个高度对应的一个纹理系数.
shader.fx如下:
float4 complex(float3 x)
{
float4 p = float4(1.0f,1.0f,1.0f,0.3f);
float4 low = float4(0.0f,63.0f,126.0f,189.0f);
float4 high = float4(62.0f,125.0f,188.0f,251.0f);
float4 uphigh = float4(124.0f,187.0f,250.0f,313.0f);
x *=33.33f;
x.y = (x.y+70)*4;
float2 uv = float2((x.x+64)/128,(128-x.z)/128)*4.0f;
/*p.w = floor( x.y/192.0f );
p.z = clamp(floor((x.y-p.w*255)/128),0,1);
p.y = clamp(floor((x.y-p.w*255-p.z*255)/64),0,1);
p.x = clamp(floor(x.y-p.w*255-p.z*255-p.y*255),0,1);*/
for( int i =0; i<4; i++ )
{
if(x.y<high)
p = (x.y-low)/62.0f;
else if(x.y == high)
p = 1.0f;
else if(x.y>high)
p = 1.0f-(x.y-high)/62.0f;
if(x.y<low)
p = 0.0f;
else if(x.y>uphigh)
p = 0.0f;
if(x.y<low[1])
p[0] = 1.0f;
}
return p.x*tex2D(lowestSampler,uv)+p.y*tex2D(lowSampler,uv) +p.z*tex2D(highSampler,uv)+p.w*tex2D(highestSampler,uv);
}
该段代码之前并未使用for 循环和 if语句,使用一种顺序语句代替if语句的,它的结果只生成0\1两种结果,但我改用现在这种形式,发现效率也没什么改变,为了可读性,使用分支语句看来也无妨了
itlmy@163.com |
-
|