美文网首页
(2)矩阵变换

(2)矩阵变换

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2021-07-01 06:48 被阅读0次

矩阵变换,我们需要将矩阵传递给片元着色器,然后和位置相乘,得到最终的位置,矩阵可以做什么

  • 平移
  • 缩放
  • 旋转
    我们需要做矩阵变换,我们需要将数据传递进去,还有就是计算得到矩阵。
    完整代码:
package com.example.myapplication.learn.shape;

import android.opengl.GLES20;
import android.opengl.Matrix;

import com.example.myapplication.learn.shape.base.BaseGameScreen;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

public class TriangleMatrix extends BaseGameScreen {
    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
                    "uniform mat4 vMatrix;" +
                    "void main() {" +
                    "  gl_Position = vMatrix*vPosition;" +
                    "}";

    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

    static final int COORDS_PER_VERTEX = 3;
    private FloatBuffer vertexBuffer;
    static float triangleCoords[] = {
            0.5f,  0.5f, 0.0f, // top
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f  // bottom right
    };
    private int mProgram ;
    //顶点个数
    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
    //顶点之间的偏移量
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 每个顶点四个字节
    //设置颜色,依次为红绿蓝和透明通道
    float color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    private int mPositionHandle;
    private int mColorHandle;
    private int mMatrixHandler;
    public TriangleMatrix(){

    }

    public void create(){
        ByteBuffer bb = ByteBuffer.allocateDirect(
                triangleCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());

        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(triangleCoords);
        vertexBuffer.position(0);
        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);
        mProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mProgram,vertexShader);
        GLES20.glAttachShader(mProgram,fragmentShader);
        GLES20.glLinkProgram(mProgram);
    }
    //相机位置
    private float[] mViewMatrix=new float[16];
    //透视
    private float[] mProjectMatrix=new float[16];
    //变换矩阵
    private float[] mMVPMatrix=new float[16];

    public void surfaceChange(int width,int height){
        float ratio=(float)width/height;
//        设置相机类型
        Matrix.frustumM(mProjectMatrix,0,-ratio,ratio,-1,1,3,7);
//        设置相机位置
        Matrix.setLookAtM(mViewMatrix, 0,
                0, 0, 7.0f,
                0f, 0f, 0f,
                0f, 1.0f, 0.0f);
        Matrix.multiplyMM(mMVPMatrix,0,mProjectMatrix,0,mViewMatrix,0);
    }

    @Override
    public void dispose() {

    }


    @Override
    public void render() {
        //程序加入到环境里面
        GLES20.glUseProgram(mProgram);
        mMatrixHandler = GLES20.glGetUniformLocation(mProgram,"vMatrix");
        //设置
        GLES20.glUniformMatrix4fv(mMatrixHandler,1,false,mMVPMatrix,0);
        //获取位置句柄
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        //获得句柄
        //准备三角形的坐标数据
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                GLES20.GL_FLOAT, false,
                vertexStride, vertexBuffer);
        //获取片元着色器的vColor成员的句柄
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        //设置绘制三角形的颜色
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
        //绘制三角形
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        //禁止顶点数组的句柄
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
}

重点的几句,修改片元着色器,然后 得到位置,将矩阵传递,至于怎样得到矩阵,后面会有章节说明。可以对比一下案例一.

相关文章

  • (2)矩阵变换

    矩阵变换,我们需要将矩阵传递给片元着色器,然后和位置相乘,得到最终的位置,矩阵可以做什么 平移 缩放 旋转我们需要...

  • 高等代数理论基础55:\lambda-矩阵在初等变换下的标准形

    -矩阵在初等变换下的标准形 初等变换 定义:-矩阵的初等变换 1.矩阵的两行(列)互换位置 2.矩阵的某一行(列)...

  • CGAffineTransform

    CGAffineTransform用于绘制2D图形的仿射变换矩阵。 仿射变换矩阵用于旋转,缩放,平移或倾斜在图形上...

  • CATransform3D

    1.一个无任何变换的默认矩阵常量,可用于使变换后的Layer恢复初始状态 (默认矩阵) 2.判断是不是默认矩阵 3...

  • 线性代数

    向量--> 矩阵和矩阵变换

  • 线性代数 01

    矩阵的初等变换初等变换 秩为r的矩阵初等行变换 逆矩阵求逆矩阵 分块矩阵求逆矩阵分块矩阵 线性相关性线性相关性 R...

  • iOS CGAffineTransform 详解

    CGAffineTransform 定义 用于绘制2D图形的一个仿射变换矩阵。一个仿射变换矩阵用于做旋转、缩放、平...

  • 音视频开发之旅(11) OpenGL ES矩阵变换与坐标系统

    目录 矩阵与矩阵变换 坐标系统 OpenGL的矩阵与矩阵变换 实践:平移、旋转、缩放、3D 资料 收获 一、矩阵与...

  • 04 - OpenGL ES学习之透视投影和正交投影

    上一篇文章介绍了平移变换,旋转变换,缩放变换三种矩阵,这篇文章来说明下两个重要的变换矩阵:透视矩阵和正交矩阵。要了...

  • 矩阵的整体总结_线性代数_day27

    将矩阵看待成视角1:数据 将矩阵看待视角2:系统 将矩阵看待的视角3:变换 将矩阵看待的视角4:空间

网友评论

      本文标题:(2)矩阵变换

      本文链接:https://www.haomeiwen.com/subject/hiedultx.html