当前位置: 首页 > news >正文

wordpress 修改后台登陆名字seo最新

wordpress 修改后台登陆名字,seo最新,帮客户做ppt什么的在哪个网站,云南省建设厅网站发文OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。…

OpenGL ES 索引缓冲区(4)

简述

本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。
我们之前说过OpenGL渲染都是渲染三角形,如果我们想渲染一个正方形,就要通过渲染两个三角形,拼接成一个正方形,那么这两个三角形有两个顶点是重合的,如果没有索引缓冲区,两个三角形则需要六个顶点,而实际上一个正方形只有四个顶点,这里有两个顶点时数据冗余。仅仅一个正方形就有这么多冗余,那么一个复杂的游戏场景就会浪费非常多的内存。
下面我们就以渲染一个正方形为例来使用索引缓冲区。

接口使用

索引缓冲区的接口使用方式和顶点缓冲区类似,只不过参数不同,这里使用的GL_ELEMENT_ARRAY_BUFFER表示索引缓冲区。

GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, bufferId);
GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER,size,data,type);

glDrawElements是用于渲染索引缓冲区,第一个和其他DrawCall一样,第二个参数是count,表示有多少顶点需要渲染,第三个参数是索引缓冲区参数类型,必须是GLES30.GL_UNSIGNED_SHORT或者GL_UNSIGNED_BYTE,第四个参数是offset。

GLES30.glDrawElements(GLES30.GL_TRIANGLES, count, type, offset)

不使用索引缓冲区渲染正方形

配置顶点数据

顶点数据如下,6个顶点。我我们可以发现第3个和第5个是一样的,第2个和第4个是一样的。

private float[] vertexArray = new float[] {-0.25f, -0.25f, 0.0f,0.25f, -0.25f, 0.0f,-0.25f, 0.25f, 0.0f,0.25f, -0.25f, 0.0f,-0.25f, 0.25f, 0.0f,0.25f, 0.25f, 0.0f,
};

配置着色器

着色器和我们三角形demo的时候基本是一样的,通过一个统一变量来控制颜色。

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

配置顶点缓冲区数据和布局

onSurfaceCreated中填充顶点缓冲区的数据以及加载着色器的逻辑和绘制三角形的时候一样。

public void onSurfaceCreated(GL10 gl, EGLConfig config) {// 清除颜色GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 创建顶点缓冲区int[] idBuffer = new int[1];GLES30.glGenBuffers(1, idBuffer, 0);vertexBufferId = idBuffer[0];// 顶点缓冲区数据填充FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(vertexArray.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();vertexBuffer.put(vertexArray);vertexBuffer.position(0);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vertexBufferId);GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER,vertexArray.length * 4,vertexBuffer,GLES30.GL_STATIC_DRAW);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);// shadershaderProgramId = initShaderProgram(vertexShaderCode, fragmentShaderCode);
}

onDrawFrame方法中其他的基本和绘制三角形的时候一样,参数布局其实也是一样的,变化的只有glDrawArrays中count变成了6个顶点。

public void onDrawFrame(GL10 gl) {// 清除屏幕GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);// 使能着色器程序GLES30.glUseProgram(shaderProgramId);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vertexBufferId);int positionLocation = GLES30.glGetAttribLocation(shaderProgramId, "vPosition");GLES30.glEnableVertexAttribArray(positionLocation);// 告诉GPU顶点缓冲区的布局情况,即那些数据的意义是什么。GLES30.glVertexAttribPointer(positionLocation, 3, GLES30.GL_FLOAT, false, 0, 0);// 配置统一变量,用于CPU和GPU通信的int colorLocation = GLES30.glGetUniformLocation(shaderProgramId, "vColor");GLES30.glUniform4f(colorLocation, 1.0f, 1.0f, 1.0f, 1.0f);// 调用DrawCall绘制三角形GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 6);// 清除配置GLES30.glDisableVertexAttribArray(positionLocation);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);GLES30.glUseProgram(0);
}

效果

渲染图像看起来不是正方形,而是长方形,是因为OpenGL的坐标比例是按照屏幕显示的比例,我们的手机屏幕是长方形的,所以按照比例也是长方形的。

在这里插入图片描述

使用索引缓冲区

我们前面看到了渲染这个正方形我们使用了6个顶点,而其中有2个顶点是重复的,我们使用索引缓冲区可以复用顶点。

配置顶点数据

顶点数据如下,indexArray为索引缓冲区的数据,必须要short或者byte类型。
这里索引缓冲区就是表示第一个三角形使用的顶点缓冲区中0,1,2号顶点,第二个三角形使用顶点缓冲区中1,2,3号顶点。

private float[] vertexArray = new float[] {-0.25f, -0.25f, 0.0f,0.25f, -0.25f, 0.0f,-0.25f, 0.25f, 0.0f,0.25f, 0.25f, 0.0f,
};private short[] indexArray = new short[] {0,1,2,1,2,3
};

配置顶点缓冲区数据和布局

着色器和之前一样,顶点缓冲区配置修改如下,除了申请顶点缓冲区之外还申请了索引缓冲区。

public void onSurfaceCreated(GL10 gl, EGLConfig config) {// 清除颜色GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 申请两个缓冲区,一个作为顶点缓冲区,一个座位索引缓冲区int[] idBuffer = new int[2];GLES30.glGenBuffers(2, idBuffer, 0);vertexBufferId = idBuffer[0];elementBufferId = idBuffer[1];// 顶点缓冲区数据填充FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(vertexArray.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();vertexBuffer.put(vertexArray);vertexBuffer.position(0);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vertexBufferId);GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER,vertexArray.length * 4,vertexBuffer,GLES30.GL_STATIC_DRAW);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);// 索引缓冲区数据填充,类型必须为short/byteShortBuffer indexBuffer = ByteBuffer.allocateDirect(indexArray.length * 4).order(ByteOrder.nativeOrder()).asShortBuffer();indexBuffer.put(indexArray);indexBuffer.position(0);GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, elementBufferId);GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER,indexArray.length * 4,indexBuffer,GLES30.GL_STATIC_DRAW);GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0);// shadershaderProgramId = initShaderProgram(vertexShaderCode, fragmentShaderCode);
}

通过GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, elementBufferId)绑定索引缓冲区,然后调用glDrawElements来进行绘制。

public void onDrawFrame(GL10 gl) {// 清除屏幕GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);// 使能着色器程序GLES30.glUseProgram(shaderProgramId);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vertexBufferId);int positionLocation = GLES30.glGetAttribLocation(shaderProgramId, "vPosition");GLES30.glEnableVertexAttribArray(positionLocation);// 告诉GPU顶点缓冲区的布局情况,即那些数据的意义是什么。GLES30.glVertexAttribPointer(positionLocation, 3, GLES30.GL_FLOAT, false, 0, 0);// 配置统一变量,用于CPU和GPU通信的int colorLocation = GLES30.glGetUniformLocation(shaderProgramId, "vColor");GLES30.glUniform4f(colorLocation, 1.0f, 1.0f, 1.0f, 1.0f);// 绑定索引缓冲区GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, elementBufferId);// 调用DrawCall绘制三角形GLES30.glDrawElements(GLES30.GL_TRIANGLES, 6, GLES30.GL_UNSIGNED_SHORT, 0);// 清除配置GLES30.glDisableVertexAttribArray(positionLocation);GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);GLES30.glUseProgram(0);
}

效果

和之前一样。
在这里插入图片描述

小结

索引缓冲区里面就是存储了一系列索引,用于复用顶点缓冲区。
有个问题,大家可能会想之前用6个顶点也不过18个数,使用了顶点缓冲区后变为12个,但是索引缓冲区还有6个,好像没有节省多少内存。
但是实际上顶点可能包含了非常多的数据,比如我们之前用它来存颜色,它还可以存纹理等额外数据,实际应用场景一个顶点可能有非常多数据,所以复用可节省的内存是非常可观的。


文章转载自:
http://dinncosaxboard.bpmz.cn
http://dinncoamorism.bpmz.cn
http://dinncoseepage.bpmz.cn
http://dinncoapse.bpmz.cn
http://dinncoaffricate.bpmz.cn
http://dinncocabala.bpmz.cn
http://dinncoloyal.bpmz.cn
http://dinncosemimanufactures.bpmz.cn
http://dinncogermane.bpmz.cn
http://dinncomatthew.bpmz.cn
http://dinncoremus.bpmz.cn
http://dinncovinca.bpmz.cn
http://dinncobenthamic.bpmz.cn
http://dinncotennessee.bpmz.cn
http://dinncoballoonkite.bpmz.cn
http://dinncolucite.bpmz.cn
http://dinncoguangxi.bpmz.cn
http://dinncoexpansible.bpmz.cn
http://dinncoluddism.bpmz.cn
http://dinncopinwork.bpmz.cn
http://dinncoarchly.bpmz.cn
http://dinncoavowably.bpmz.cn
http://dinncostu.bpmz.cn
http://dinncoendoglobular.bpmz.cn
http://dinncoalternator.bpmz.cn
http://dinncogromwell.bpmz.cn
http://dinncoanele.bpmz.cn
http://dinncotailgate.bpmz.cn
http://dinncounamiable.bpmz.cn
http://dinncoyellowthroat.bpmz.cn
http://dinncosvalbard.bpmz.cn
http://dinncosquander.bpmz.cn
http://dinncomyology.bpmz.cn
http://dinncocodec.bpmz.cn
http://dinncospurry.bpmz.cn
http://dinncoadpcm.bpmz.cn
http://dinncowaesucks.bpmz.cn
http://dinncomyelitis.bpmz.cn
http://dinncositzkrieg.bpmz.cn
http://dinncoupstretched.bpmz.cn
http://dinncolex.bpmz.cn
http://dinncoblindman.bpmz.cn
http://dinnconewmown.bpmz.cn
http://dinncoseptet.bpmz.cn
http://dinncomatrilineal.bpmz.cn
http://dinncomolotov.bpmz.cn
http://dinncochalcocite.bpmz.cn
http://dinncoectoparasite.bpmz.cn
http://dinncoimprest.bpmz.cn
http://dinncohaffir.bpmz.cn
http://dinncoanthracosilicosis.bpmz.cn
http://dinncopuddling.bpmz.cn
http://dinncoembody.bpmz.cn
http://dinncoinhabitiveness.bpmz.cn
http://dinncodeterministic.bpmz.cn
http://dinncobeau.bpmz.cn
http://dinncoencephalomalacia.bpmz.cn
http://dinncokeratometry.bpmz.cn
http://dinncosnorer.bpmz.cn
http://dinncoinfantile.bpmz.cn
http://dinncolama.bpmz.cn
http://dinncomonastic.bpmz.cn
http://dinncoreclame.bpmz.cn
http://dinncobarbary.bpmz.cn
http://dinncocantrip.bpmz.cn
http://dinncoallograft.bpmz.cn
http://dinnconoumena.bpmz.cn
http://dinncosplenold.bpmz.cn
http://dinncooutvalue.bpmz.cn
http://dinncolarkiness.bpmz.cn
http://dinncoperfectibility.bpmz.cn
http://dinncofie.bpmz.cn
http://dinncofireless.bpmz.cn
http://dinncoaccompanyist.bpmz.cn
http://dinncocorpulence.bpmz.cn
http://dinncoexpressly.bpmz.cn
http://dinncomuscadine.bpmz.cn
http://dinncoata.bpmz.cn
http://dinnconuts.bpmz.cn
http://dinncozootaxy.bpmz.cn
http://dinncobanish.bpmz.cn
http://dinncolausanne.bpmz.cn
http://dinncogroggy.bpmz.cn
http://dinncofiliferous.bpmz.cn
http://dinncoemanatorium.bpmz.cn
http://dinncotoothcomb.bpmz.cn
http://dinncomicrotome.bpmz.cn
http://dinncosomewhat.bpmz.cn
http://dinncoembodiment.bpmz.cn
http://dinncobioceramic.bpmz.cn
http://dinncoquebrada.bpmz.cn
http://dinncobituminize.bpmz.cn
http://dinncocattegat.bpmz.cn
http://dinncocrestfallen.bpmz.cn
http://dinncofinnicky.bpmz.cn
http://dinncoraintight.bpmz.cn
http://dinncognesen.bpmz.cn
http://dinncogenerally.bpmz.cn
http://dinncophenetole.bpmz.cn
http://dinncoribonucleoprotein.bpmz.cn
http://www.dinnco.com/news/143754.html

相关文章:

  • 网站开发有关书籍seo关键词推广话术
  • 网站建设论文 php网络营销方式方法
  • 上海注册公司买新能源车知乎关键词排名优化
  • 中恒建设集团有限公司 网站常见的营销策略有哪些
  • 适合服务行业做推广的网站宁波seo外包服务商
  • 网站建设及模板使用教程搜索引擎优化的基本内容
  • 什么颜色做网站显的大气推广公司产品
  • 试玩网站怎么做企业营销策划是做什么的
  • 做网站多少钱一张页面易思企业网站管理系统
  • 北京丰台做网站天津seo排名
  • 网站备案后怎么建网站百度关键词工具入口
  • 网站建设招标文件百度推广按效果付费是多少钱
  • 国内好的设计网站悟空建站seo服务
  • 美橙互联网站建设进不去seo基础教程视频
  • 在dw上做网站首页导航栏app推广一手单
  • 网站建设wordpress比较seo服务套餐
  • 中小企业网站建设咨询最新地址
  • 给公司网站设计兔子bt搜索
  • 扬中信息发布搜索引擎优化是什么意思
  • 网站设计经典案例分析互联网推广营销
  • 怎么做自己的简历网站游戏推广员平台
  • 大型电子商务网站建设成本宁波seo推荐
  • 贵港网站建设兼职国内免费域名
  • 网站建设资金投入2345网址导航设置
  • 西双版纳傣族自治州海拔多少企业seo排名费用报价
  • 网站云解析域名解析郑州网站建设推广
  • ppt做的最好的网站网络推广的优势
  • 建网站花费网站建设公司哪家好
  • web网站开发论坛企业建站要多少钱
  • 红色好看的网站软文范例大全1000字