天空穹技术中不再使用立方体模拟天空,而是用一个半球面模拟天空,此半球面上贴上对应的天空纹理,摄像机位于天空穹内部。
效果图
核心代码 半球的绘制
package test.com.opengles11_6;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import android.opengl.GLES20;
/**
* Created by hbin on 2016/10/18.
*/
public class Sky {
final float UNIT_SIZE=100.0f;
//自定义渲染程序的引用
int mProgram;
//总变换矩阵的引用
int muMVPMatrixHandle;
//顶点属性的引用
int maPositionHandle;
//顶点纹理坐标属性的引用
int maTexCoorHandle;
//顶点数据缓冲以及顶点纹理坐标数据缓冲
FloatBuffer mVertexBuffer;
FloatBuffer mTexCoorBuffer;
//顶点数量
int vCount=0;
public Sky(MySurfaceView mv)
{
initVertexData(UNIT_SIZE);
initShader(mv);
}
//初始化顶点数据的方法
public void initVertexData(float radius)
{
float ANGLE_SPAN=18f;
float angleV=90;
ArrayList<Float> alVertix=new ArrayList<Float>();//存放顶点坐标的ArrayList
for(float vAngle=angleV;vAngle>0;vAngle=vAngle-ANGLE_SPAN)//垂直方向angleSpan度一份
{
for(float hAngle=360;hAngle>0;hAngle=hAngle-ANGLE_SPAN)//水平方向angleSpan度一份
{
//纵向横向各到一个角度后计算对应的此点在球面上的四边形顶点坐标
//并构建两个组成四边形的三角形
double xozLength=radius*Math.cos(Math.toRadians(vAngle));
float x1=(float)(xozLength*Math.cos(Math.toRadians(hAngle)));
float z1=(float)(xozLength*Math.sin(Math.toRadians(hAngle)));
float y1=(float)(radius*Math.sin(Math.toRadians(vAngle)));
xozLength=radius*Math.cos(Math.toRadians(vAngle-ANGLE_SPAN));
float x2=(float)(xozLength*Math.cos(Math.toRadians(hAngle)));
float z2=(float)(xozLength*Math.sin(Math.toRadians(hAngle)));
float y2=(float)(radius*Math.sin(Math.toRadians(vAngle-ANGLE_SPAN)));
xozLength=radius*Math.cos(Math.toRadians(vAngle-ANGLE_SPAN));
float x3=(float)(xozLength*Math.cos(Math.toRadians(hAngle-ANGLE_SPAN)));
float z3=(float)(xozLength*Math.sin(Math.toRadians(hAngle-ANGLE_SPAN)));
float y3=(float)(radius*Math.sin(Math.toRadians(vAngle-ANGLE_SPAN)));
xozLength=radius*Math.cos(Math.toRadians(vAngle));
float x4=(float)(xozLength*Math.cos(Math.toRadians(hAngle-ANGLE_SPAN)));
float z4=(float)(xozLength*Math.sin(Math.toRadians(hAngle-ANGLE_SPAN)));
float y4=(float)(radius*Math.sin(Math.toRadians(vAngle)));
//构建第一三角形
alVertix