IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android使用OpenGL ES绘制Slam地图(1.绘制地板) -> 正文阅读

[移动开发]Android使用OpenGL ES绘制Slam地图(1.绘制地板)

需要制作一个Slam地图的3d显示,捣鼓了两个星期终于弄出来了,虽然效果没有达到预期,记录一下(图片随便找的)

首先是顶点着色器

#version 300 es
layout (location = 0) in vec4 vPosition;
layout (location = 1) in vec2 aTextureCord;
uniform mat4 u_Matrix;
//输出纹理坐标(s,t)
out vec2 vTexCord;
void main() {
    gl_Position  = u_Matrix*vPosition;
    gl_PointSize = 10.0;
    vTexCord = aTextureCord;
}

?片段着色器

#version 300 es
precision mediump float;
uniform sampler2D uTextureUnit;
//接收刚才顶点着色器传入的纹理坐标(s,t)
in vec2 vTexCord;
out vec4 vFragColor;
void main() {
    vFragColor = texture(uTextureUnit,vTexCord);
}

?编译链接程序片段

        //编译
        final int vertexShaderId = ShaderUtils.compileVertexShader(ResReadUtils.readResource(R.raw.vertex_plane_shader));
        final int fragmentShaderId = ShaderUtils.compileFragmentShader(ResReadUtils.readResource(R.raw.fragment_plane_shader));
        //链接程序片段
        mProgram = ShaderUtils.linkProgram(vertexShaderId, fragmentShaderId);

        //获取属性位置
        uMatrixLocation = GLES30.glGetUniformLocation(mProgram, "u_Matrix");
        aPositionLocation = GLES30.glGetAttribLocation(mProgram, "vPosition");
        aTextureLocation = GLES30.glGetAttribLocation(mProgram, "aTextureCord");

设置一块地板的矩阵分为几乘几,现在设置的200就是将图片分割为200*200

    //图片生成的位图
    private float bitSize = 1f;
    private float matrixSize = 200;

随机生成坐标数据,并计算顶点坐标和绘制顶点顺序

public void setMapData() {
        //随机生成坐标数据
        List<Point> points = new ArrayList<>();
        for (int i = -200; i < 200; i++) {
            for (int j = -200; j < 200; j++) {
                if ((int) (Math.random() * 2) == 0)
                    points.add(new Point(i, j));

            }
        }
        POSITION_VERTEX = new float[points.size() * 12];
        VERTEX_INDEX = new int[points.size() * 6];
        TEX_VERTEX = new float[points.size() * 8];

        for (int i = 0; i < points.size(); i++) {
            int x = points.get(i).x;
            int y = points.get(i).y;
            TEX_VERTEX[i * 8 + 0] = x % matrixSize / matrixSize;
            TEX_VERTEX[i * 8 + 1] = 1 - (y % matrixSize / matrixSize);
            TEX_VERTEX[i * 8 + 2] = (x % matrixSize - 1) / matrixSize;
            TEX_VERTEX[i * 8 + 3] = 1 - (y % matrixSize / matrixSize);
            TEX_VERTEX[i * 8 + 4] = (x % matrixSize - 1) / matrixSize;
            TEX_VERTEX[i * 8 + 5] = 1 - (y % matrixSize - 1) / matrixSize;
            TEX_VERTEX[i * 8 + 6] = x % matrixSize / matrixSize;
            TEX_VERTEX[i * 8 + 7] = 1 - (y % matrixSize - 1) / matrixSize;

            VERTEX_INDEX[i * 6] = (i * 4);
            VERTEX_INDEX[i * 6 + 1] = (i * 4 + 1);
            VERTEX_INDEX[i * 6 + 2] = (i * 4 + 2);
            VERTEX_INDEX[i * 6 + 3] = (i * 4);
            VERTEX_INDEX[i * 6 + 4] = (i * 4 + 2);
            VERTEX_INDEX[i * 6 + 5] = (i * 4 + 3);

            POSITION_VERTEX[i * 12] = x * 2 + bitSize;
            POSITION_VERTEX[i * 12 + 1] = y * 2 + bitSize;
            POSITION_VERTEX[i * 12 + 2] = 0;

            POSITION_VERTEX[i * 12 + 3] = x * 2 - bitSize;
            POSITION_VERTEX[i * 12 + 4] = y * 2 + bitSize;
            POSITION_VERTEX[i * 12 + 5] = 0;

            POSITION_VERTEX[i * 12 + 6] = x * 2 - bitSize;
            POSITION_VERTEX[i * 12 + 7] = y * 2 - bitSize;
            POSITION_VERTEX[i * 12 + 8] = 0;

            POSITION_VERTEX[i * 12 + 9] = x * 2 + bitSize;
            POSITION_VERTEX[i * 12 + 10] = y * 2 - bitSize;
            POSITION_VERTEX[i * 12 + 11] = 0;
        }
        vertexBuffer = ByteBuffer.allocateDirect(POSITION_VERTEX.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        vertexBuffer.put(POSITION_VERTEX);
        vertexBuffer.position(0);
        mTexVertexBuffer = ByteBuffer.allocateDirect(TEX_VERTEX.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer()
                .put(TEX_VERTEX);
        mTexVertexBuffer.position(0);
        mVertexIndexBuffer = ByteBuffer.allocateDirect(VERTEX_INDEX.length * 4)
                .order(ByteOrder.nativeOrder())
                .asIntBuffer()
                .put(VERTEX_INDEX);
        mVertexIndexBuffer.position(0);

开始绘制

public void draw(float[] mMVPMatrix, int textureId) {
        GLES30.glUseProgram(mProgram);

        //将变换矩阵传入顶点渲染器
        GLES30.glUniformMatrix4fv(uMatrixLocation, 1, false, mMVPMatrix, 0);
        //启用顶点坐标属性
        GLES30.glEnableVertexAttribArray(aPositionLocation);
        GLES30.glVertexAttribPointer(aPositionLocation, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer);
        //启用纹理坐标属性
        GLES30.glEnableVertexAttribArray(aTextureLocation);
        GLES30.glVertexAttribPointer(aTextureLocation, 2, GLES30.GL_FLOAT, false, 0, mTexVertexBuffer);
        //激活纹理
        GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
        //绑定纹理
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);
        // 绘制
        GLES30.glDrawElements(GLES20.GL_TRIANGLES, VERTEX_INDEX.length, GLES20.GL_UNSIGNED_INT, mVertexIndexBuffer);
        //禁止顶点数组的句柄
        GLES30.glDisableVertexAttribArray(aPositionLocation);
        GLES30.glDisableVertexAttribArray(aTextureLocation);
    }

绘制结果

所有坐标填满的结果

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 11:02:31  更:2021-07-14 11:03:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 5:29:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码