three.js(五) 地形纹理混合

news/2024/7/7 19:20:11

地形生成通常使用高度图, 而高度图的生成可以使用绘图工具,或者通过分形算法生成,例如square-diamond,  fbm方法。
这里采用简单求平均值+随机波动的方法。




对于一个2^n+1  *  2^n+1 的网格, 中心点的高度是四角点的平均值加随机偏移, 边上中点的高度值是边两端点的平均值加随机偏移。
接着将偏移的幅度缩小, 计算四个较小方块的顶点的高度值。
这样随机生成了高度。


接着构造地形, 地形分割成2^n * 2^n 块, 这样顶点就有 2^n+1  *  2^n+1 个 
    var geo = new THREE.PlaneGeometry(3, 3, WIDTH-1, HEIGHT-1);


上面生成了每个顶点的高度, 需要将高度值传入shader中, 可以直接修改geo中的所有顶点的z值,来修改高度。


我们可以根据地形的高度来混合纹理,例如比较高的位置为石块, 而低洼处为草地, 这个纹理的混合。
c2 = mix(c0, c1, (height-minHeight)/(maxHeight-minHeight))
c0是第一张纹理获取的颜色, c1是第二张纹理获取的颜色, 而minHeight maxHeight 是整个地形高度的方位, height是当前高度。
c2 就是混合后的颜色。
shader如下,两张纹理, 顶点在平面坐标中的位置, 
纹理坐标采用顶点的x, y 坐标的小数部分。
    uniform sampler2D texture_grass;
    uniform sampler2D texture_rock;
    uniform float maxHeight;
    uniform float minHeight;
    varying vec3 pos;




void main( void ) {
        vec2 uv0;
        
        uv0.x = fract(pos.x);
        uv0.y = fract(pos.y);
        
        vec4 c0 = texture2D(texture_grass, uv2);
        vec4 c1 = texture2D(texture_rock, uv2);




        vec4 c2 = mix(c0, c1, (pos.z-minHeight)/(maxHeight-minHeight));


        gl_FragColor = c2;
     

}








而材质:
    var pmat = new THREE.ShaderMaterial({
        uniforms:{
            texture_grass:{type:'t', value:0, texture:THREE.ImageUtils.loadTexture("grassa512.bmp")},
            texture_rock:{type:'t', value:1, texture:THREE.ImageUtils.loadTexture("dirt512.bmp")},
      
            maxHeight:{type:'f', value:0},
            minHeight:{type:'f', value:1},
        },
        attributes:{
        },
        vertexShader: document.getElementById("vert").textContent,
        fragmentShader: document.getElementById("frag").textContent,
        //wireframe:true,
    
    });




其中纹理的值 0, 1 表示GPU内部的纹理编号, 这个数量受硬件限制。


顶点shader


    varying vec3 pos;
void main( void ) {


        pos = position.xyz;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position.xyz, 1);

}






















转载于:https://www.cnblogs.com/liyonghelpme/archive/2012/09/18/4273790.html


http://www.niftyadmin.cn/n/1127262.html

相关文章

加息对股市影响|加息会有什么后果

中国历史上五次加息对股指产生的影响 第一、二次加息(1993年5月15日、7月11日):央行采取了两次升息措施,一年存款利率由6.3%增加到了9.15%。这两次加息,使得首个交易日沪指分别下跌27.43点及23.…

Eclipse 3.0.1插件方案(Java、c#版)

Eclipse 3.0.1插件方案(Java、c#版) Bromon原创 请尊重版权 Eclipse 3.0推出已经好几个月了,但是我一直都在继续使用2.1.4,等的就是各种插件的稳定生机。最近在Eclipse 3.0.1的平台上稍有操练,觉得插件的功能更加丰富强大,安装也…

windows下nginx初次使用

2019独角兽企业重金招聘Python工程师标准>>> 下载地址:https://nginx.org/en/download.html 在nginx.exe目录,打开命令行工具,用命令 启动/关闭/重启nginx start nginx : 启动nginx nginx -s reload :修改配置后重新加…

项目验收总结

一.验收前的准备工作(1)配置现场演示的运行环境,测试系统运行的稳定性,添加适量的演示数据。确保在系统演示过程中不出问题,获得良好的系统演示印象。(2)编写项目汇报PPT&#xff0c…

《两天DBA教程》目录翻译

昨天心血来潮,想到翻译一下目录,看看到底是啥内容。至于之后的翻译计划,要么别人有特殊需求,基本上看自己兴趣,也不会实时跟新,做事情一般都是兴趣做的比较顺畅。我的感受,这真的就是一个使用手…

mkimage command not found - U-Boot images will not be built

编译内核的时候出现错误:"mkimage" command not found - U-Boot images will not be built 参考链接 http://blog.csdn.net/wen0605/article/details/8448907 make uImage的时候要用到uboot/tool/mkimage工具。 将mkimage放到/usr/bin等目录中即可或者将m…

一段奇怪的HTML代码

一段奇怪的HTML代码&#xff0c;居然在IE(IE 6.0)里没有滚动效果&#xff0c;而在FireFox里有&#xff08;相信原意是想做成滚动的&#xff09;&#xff1a; <table cellpadding2 cellspacing0 style"font-size:9pt ;color: ;background: ;align:left ;width:480 ;heig…

加息对股市影响利好还是利空

这个息早就应该要加了&#xff0c;加息未必是利空。加息对房地产业和炒房者打击最大&#xff0c;可能促使部分炒房资金流入股市&#xff1b; 由于美国实行宽松低利率的货币策&#xff0c;中美的息差可能促使更多的海外资金流入中国&#xff0c;这对股市有积极的作用。 <scr…