效果图:
基本原理:
灰度地形图生成技术的基本原理是利用MxN的网格表示地形,同时提供一副对应尺寸的灰度图,根据灰度图中每个像素的灰度来确定网格中顶点的海拔,黑色像素(RGB各个色彩通道的值为0)代表海拔最低的位置,白色像素(RGB中各个色彩通道的值为255)代表海拔最高的位置,实际开发中用如下公式来计算某像素顶点的海拔高度:
实际海拔=最低海拔+最大高差x像素值/255.0
代码如下:
package test.com.opengles11_2;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
/**
* Created by hbin on 2016/9/27.
*/
public class Constant {
public static float[][] yArray;
public static final float LAND_HIGH_ADJUST=-2f;//陆地的高度调整值
public static final float LAND_HIGHEST=20f;//陆地最大高差
//从灰度图片中加载陆地上每个顶点的高度
public static float[][] loadLandforms(Resources resources,int index)
{
Bitmap bt=BitmapFactory.decodeResource(resources, index);//导入灰度图
int colsPlusOne=bt.getWidth();
int rowsPlusOne=bt.getHeight();
float[][] result=new float[rowsPlusOne][colsPlusOne];
//遍历灰度图像
for(int i=0;i<rowsPlusOne;i++)
{
for(int j=0;j<colsPlusOne;j++)
{
int color=bt.getPixel(j,i);//获得指定行列处像素的颜色值
int r=Color.red(color);
int g=Color.green(color);
int b=Color.blue(color);
int h=(r+g+b)/3;
//像素顶点的海拔高度=最大高差X像素值/255.0+最低海拔
result[i][j]=h*LAND_HIGHEST/255+LAND_HIGH_ADJUST;
}
}
return result;
}
}
地形图构造类
package test.com.opengles11_2;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.opengl.GLES20;
/**
* Created by hbin on 2016/9/27.
* 绘制山
*/
public class Mountion {
//单位长度
float UNIT_SIZE=1.0f;
//自定义渲染管线的id
int mProgram;
//总变化矩阵引用的id