opengles(五) 纹理映射

为了获取更加真实、酷炫的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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值