为了获取更加真实、酷炫的3d物体,就需要用到纹理映射,就相当在前面我们画的形状前再贴一张皮肤上去,下面来看下怎么实现。
首先我们需要知道一张纹理图也是有自己的坐标, 二维纹理的坐标分为 S 轴和 T 轴,左上角坐标为(0, 0)点,最大为1个单位长度,所以长度的取值范围为 0 到 1,在这里说明下,不管纹理的长宽大小如何,它的取值范围都是从 0 到 1,所以假如纹理的高为255,宽为128,他们的取值范围都是 0 到 1;
还有个问题需要注意的是opengl规定纹理图片尺寸的宽和高必须为2的n次方, 如 32 * 256等;
基本原理是:
1.首先图元中的每个顶点都需要在顶点着色器中通过易变变量将纹理坐标传入片元着色器。
2.经过顶点着色器后渲染管线的固定功能部分会根据情况进行插值计算,产生对应到每个片元的用于记录纹理坐标的易变变量值。
3.最后每个片元在片元着色器中根据其接收到的记录纹理坐标的易变变量值到纹理图中提取出对应位置的颜色即可,提取颜色的过程一般称为纹理采样。
下面来看下程序怎么实现的:
public class MyGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer {
private Context mContext;
private Square mSquare;
private float[] mMVPMatrix = new float[16];
private float[] mProjectionMatrix = new float[16];
private float[] mCameraMatrix = new float[16];
public MyGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setEGLContextClientVersion(2);
setRenderer(this);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(0, 0, 0.5f, 0);
mSquare = new Square(mContext);
}
@Override
public void onSurfaceChanged(GL10 gl,