OpenGL ES for Android 绘制矩形和正方形

news/2024/7/24 11:14:27

在这里插入图片描述
前面的文章介绍了如何绘制三角形,在OpenGL ES中没有直接绘制矩形的方式,通过绘制2个三角形的方式绘制矩形。

绘制矩形的顶点shader:

attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}

绘制矩形的片段shader:

precision mediump float;

void main()
{
  gl_FragColor = vec4(1,0,0,1);
}

创建program:

private fun createProgram() {
            var vertexCode =
                AssetsUtils.readAssetsTxt(
                    context = context,
                    filePath = "glsl/triangle_vertex.glsl"
                )
            var fragmentCode =
                AssetsUtils.readAssetsTxt(
                    context = context,
                    filePath = "glsl/triangle_fragment.glsl"
                )
            mProgramHandle = GLTools.createAndLinkProgram(vertexCode, fragmentCode)
        }

triangle_vertex.glsl和triangle_vertex.glsl分别表示顶点shader和片段shader的文件,存放于assets/glsl目录下,readAssetsTxt为读取assets目录下文件的公用方法。

获取参数句柄:

vPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "vPosition")

初始化顶点数据,代码如下:

var vertexBuffer = GLTools.array2Buffer(
            floatArrayOf(
                -0.5f, 0.5f, 0.0f,
                -0.5f, -0.5f, 0.0f,
                0.5f, -0.5f, 0.0f,
                0.5f, 0.5f, 0.0f
            )
        )

初始化索引数据,代码如下:

var index = shortArrayOf(3,2,0,0, 1, 2)
val indexBuffer = GLTools.array2Buffer(index)

绘制:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
            GLES20.glUseProgram(mProgramHandle)

            vertexBuffer.position(0)
            GLES20.glEnableVertexAttribArray(vPositionLoc)
            GLES20.glVertexAttribPointer(vPositionLoc, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer)

            GLES20.glDrawElements(GLES20.GL_TRIANGLES, index.size, GLES20.GL_UNSIGNED_SHORT,indexBuffer)

效果图如下:
在这里插入图片描述
上面设置的顶点虽然都是0.5,但不一定是正方形,0.5表示x轴或者y轴的一半,如果绘制的窗口本身是矩形,那么绘制出来的也是矩形,如何绘制出正方形呢?这需要根据绘制窗口的宽高计算顶点数据,计算方式如下:

override fun onSurfaceChanged(p0: GL10?, width: Int, height: Int) {
            GLES20.glViewport(0, 0, width, height)
            var ratio = width / height.toFloat()
            vertexBuffer = GLTools.array2Buffer(
                floatArrayOf(
                    -0.5f, 0.5f * ratio, 0.0f,
                    -0.5f, -0.5f * ratio, 0.0f,
                    0.5f, -0.5f * ratio, 0.0f,
                    0.5f, 0.5f * ratio, 0.0f
                )
            )
        }

onSurfaceChanged是Renderer实现的方法,这个方法有宽高参数,计算宽高比,保持x轴不变,计算y轴长度,效果如下:
在这里插入图片描述

更多相关阅读:

  • OpenGL ES for Android 总览

  • OpenGL ES for Android 环境搭建

  • OpenGL ES 绘制纹理

  • OpenGL ES for Android 绘制三角形


http://www.niftyadmin.cn/n/1846022.html

相关文章

node-sass安装失败

看尽了网上的帖子,就是安装不上。。最后放弃node-sass,改用dart-sass,如下: package.json中 代码中如果用到了/deep/语法,替换成::v-deep即可

OpenGL ES for Android 绘制立方体

立方体有6个面,8个顶点,因此绘制立方体其实就是绘制6个面。 顶点shader attribute vec4 a_Position; attribute vec4 a_color; varying vec4 v_color; void main() {v_color a_color;gl_Position a_Position; }a_Position为顶点数据,a_co…

[前端面试套餐css+js+vue]第九天

前端面试套餐css:说说flexbox(弹性盒布局模型)属性容器属性成员属性javascript:解释下什么是事件代理?应用场景?应用场景vue:给对象添加新属性界面不刷新?直接添加属性的问题原理分析解决方案css&#xff1…

OpenGL ES for Android 深度测试

什么是深度 深度就像是现实世界中物体与我们自己之间的距离,而在OpenGL中,深度是像素点(可以理解为现实世界中的物体)距离相机的距离,深度信息保存在深度缓存中,深度值越大则离相机越远。 深度测试有什么…

OpenGL ES for Android 绘制旋转的地球

No 图 No Code,我们先来欣赏下旋转的地球: 是不是很酷炫,要想绘制出上面酷炫的效果需要3个步骤: 计算球体顶点数据地球纹理贴图通过MVP矩阵旋转地球 计算球体顶点数据 我们知道OpenGL中最基本的图元是三角形,任何复…

关于阿里巴巴icon矢量图显示空白问题

关于阿里巴巴icon矢量图显示空白问题关于icon显示空白关于icon显示空白 最近在帮着做一些小项目,期间遇到不少问题,也尝试着在网上找问题的答案,接下来就有一个很细节的问题使得我在使用阿里巴巴的iconfont矢量图的时候出现了矢量图在页面中…

小白记录学习Dajngo的第二天

小白学习Django的第二天 用博客记录 python学习 沙雕错误 今天学到了给url命名与url反转的时候 新建了两个app,在两个新建的app下的urls.py文件中导入path模块后的一系列操作后运行项目,结果Pycharm毫不留情的弹出了错误 我再到urls.py中看时发现了这…

关于VC++6.0显示“不能启动工具,操作成功完成”问题

小白迷惑之VC6.0运行错误 今天在上C语言实验课的时候,在运行一个C程序的时候VC6.0显示错误:不能启动工具,操作成功完成 如图: 就像这样,嗯???这是什么情况??…