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

wordpress对配置的要求网站关键词优化软件效果

wordpress对配置的要求,网站关键词优化软件效果,网站主题旁边的图标怎么做,别墅装修设计图片大全 效果图OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统,使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里,三角形是一个基础图形,其他的图形都可以使用三角形拼接而成,所以我们就的案例就基于这个开始。 在Android系统中…

OpenGL ES 绘制一个三角形(2)

简述

本节我们基于Android系统,使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里,三角形是一个基础图形,其他的图形都可以使用三角形拼接而成,所以我们就的案例就基于这个开始。
在Android系统中,提供给上层应用的View都是通过Canvas的接口来绘制,虽然底层最终也是通过OpenGL ES来实现的,但是由于上层被封装了,我们无法通过这个来实现我们想要实现的demo,我们需要使用GLSurfaceView来实现。

GLSurfaceView继承自SurfaceView,我们知道SurfaceView和一般的View不同,会有自己的Surface,而GLSurfaceView则在SurfaceView的基础上,会初始化EGL的上下文环境。其实我们直接使用SurfaceView也是可以使用OpenGL ES的,只不过GLSurfaceView给我们提供了一些生命周期管理的辅助,在大多数场景使用起来更加方便。

GLSurfaceView提供的是EGL环境,我们想要绘制一个三角形所需要做的事如下:

  • 创建一个GLSurfaceView
  • 配置EGL(其实GLSurfaceView帮助我们做了大多数的事)
  • 使用OpenGL ES接口绘制图像
    • 配置顶点缓冲区
    • 实现顶点着色器和片段着色器
    • 调用drawCall
  • 交换缓冲区呈现图像

本节主要是实现demo,对OpenGL渲染大体流程有个感知,一些api的细节可以不需要关注,后续会对每个点会有更详细的介绍。

绘制一个三角形

配置OpenGL ES

在AndroidManifeast.xml里配置
主要就是配置一条
其中glEsVersion是版,我们这里用OpenGL ES 3.0来写demo。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"><uses-feature android:glEsVersion="0x00030000" android:required="true"/><application>// ...</activity>
</application>

自定义GLSurfaceView

GLSurfaceView通过setRenderer暴露一个Renderer,Renderer有三个接口onSurfaceCreated/onSurfaceChanged/onDrawFrame。
GLSurfaceView处理了EGL环境相关的逻辑,onDrawFrame则会控制VSync,在需要渲染的时候调用。
onSurfaceChanged是Surface变化的情况下会调用,而onSurfaceCreated则是Surface创建时回调,onDrawFrame和我们自定义View时候的onDraw有一些类似。

public class DemoGLSurfaceView extends GLSurfaceView {public DemoGLSurfaceView(Context context) {super(context);init();}public DemoGLSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);init();}public void init() {// 设置版本setEGLContextClientVersion(3);Renderer renderer = new Renderer() {@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {// ...}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {// 设定视口,类似相机,相机移动则渲染的图像相对位置变化。GLES30.glViewport(0, 0, width, height);}@Overridepublic void onDrawFrame(GL10 gl) {// ...}};setRenderer(renderer);}
}

配置顶点缓冲区数据

由于我们只是要画一个固定的三角形,顶点缓冲区里的数据都是固定的,所以我们在onSurfaceCreated填充,只需要一次即可。
glGenBuffers是创建一个顶点缓冲区Buffer,第二个参数是一个int数组,创建的顶点缓冲区id会通过这个数组返回,后续使用这个id来使用这个buffer。
我们需要先调用glBindBuffer绑定buffer,然后再通过glBufferData将数据传到缓冲区中。
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0)则是用来清除Buffer的绑定操作的,OpenGL的接口设计像是一个状态机,bind上一个Buffer才能对这个Buffer进行操作,如果需要操作其他Buffer则需要bind其他Buffer。
vertexArray有三个节点,是三个顶点的x,y,z坐标。OpenGL的坐标系是x,y,z都是(-1,1)。

private float[] vertexArray = new float[] {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f, 0.5f, 0.0f
};@Override
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];// 将数据转化成ByteBufferFloatBuffer 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);
}

配置着色器

着色器是一段给GPU执行的程序,所以其实就是一段代码,我们需要调用对应接口来编译链接。
GLES30.glCreateShader创建一个Shader,参数表示着色器的类型,GL_VERTEX_SHADER为顶点着色器,GL_FRAGMENT_SHADER为片段着色器。
vertexShaderCode字符串是我们配置的顶点着色器,gl_Position是出参,这里是直接做了透传。
fragmentShaderCode是片段着色器,gl_FragColor是出参,是颜色,而uniform vec4 vColor是统一变量,我们设置统一变量直接作为片段着色器的出参。
通过api编译连接后,我们会将它关联到一个Program上,initShaderProgram返回到就是program到id。

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;" +"}";private int initShaderProgram(String vertexShaderCode, String fragmentShaderCode) {// 编译顶点着色器int vertexShader = GLES30.glCreateShader(GLES30.GL_VERTEX_SHADER);GLES30.glShaderSource(vertexShader, vertexShaderCode);GLES30.glCompileShader(vertexShader);// 编译片段着色器int fragmentShader = GLES30.glCreateShader(GLES30.GL_FRAGMENT_SHADER);GLES30.glShaderSource(fragmentShader, fragmentShaderCode);GLES30.glCompileShader(fragmentShader);// 链接着色器int program = GLES30.glCreateProgram();GLES30.glAttachShader(program, vertexShader);GLES30.glAttachShader(program, fragmentShader);GLES30.glLinkProgram(program);return program;
}@Override
public void onDrawFrame(GL10 gl) {// ...// 使用编译好的着色器GLES30.glUseProgram(shaderProgramId);// ...
}

配置顶点布局/渲染

首先我们需要调用glClear清空屏幕,glUseProgram配置着色器程序,glBindBuffer绑定之前填充的Buffer。
属性需要通过glEnableVertexAttribArray使能才可使用,我们这里需要使能vPosition属性。
后续会使用glVertexAttribPointer告诉GPU顶点缓冲区布局情况,顶点缓冲区本质就是一段内存,不过没有glVertexAttribPointer,GPU并不知道怎么使用这个数据。
后面配置vColor作为颜色,(1,1,1,1)分别为RGBA,白色。
最后调用glDrawArrays来渲染三角形。

@Override
public void onDrawFrame(GL10 gl) {// 清除屏幕GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);// 使能着色器程序GLES30.glUseProgram(shaderProgramId);// 绑定BufferGLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vertexBufferId);// 获取vPosition属性int positionLocation = GLES30.glGetAttribLocation(shaderProgramId, "vPosition");// 属性需要使能才可使用GLES30.glEnableVertexAttribArray(positionLocation);// 告诉GPU顶点缓冲区的布局情况,即那些数据的意义是什么。// 这是CPU向GPU传数据的一种方式,我们这里是告诉GPU,我们前面bind的顶点缓冲区是什么数据。// 第一个参数是attr的id,第二个参数表示每一个顶点有几个数,第三个参数为数据类型,第四个是参数是否需要归一化// 第五个参数是步长,表示每个顶点占用了多少字节,0表示顶点都是紧凑的,GPU会通过计算来计算步长,最后一个参数表示offset。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, 3);// 清除配置GLES30.glDisableVertexAttribArray(positionLocation);GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0);GLES30.glUseProgram(0);
}

效果

三角形之所以不是正三角形是因为屏幕是长方形的。
在这里插入图片描述

小结

本节通过OpenGL ES实现了一个三角形的渲染,对于每个接口使用只做了一个简单的介绍,想必首次学习OpenGL的同学会有很多疑问,比如怎么渲染多个目标,怎么实现渐变颜色等,我们的后续会对每一个点做更细节的学习,这一节主要是了解一下OpenGL的总体渲染流程,大概知道OpenGL接口是怎么工作的即可,后续的介绍也会基于本章的demo。


文章转载自:
http://acknowledgment.nLcw.cn
http://bisectrix.nLcw.cn
http://stypticity.nLcw.cn
http://cordiality.nLcw.cn
http://anther.nLcw.cn
http://educability.nLcw.cn
http://retributivism.nLcw.cn
http://axisymmetrical.nLcw.cn
http://sourdough.nLcw.cn
http://doubleender.nLcw.cn
http://ommateum.nLcw.cn
http://braille.nLcw.cn
http://opuntia.nLcw.cn
http://dealer.nLcw.cn
http://cpsc.nLcw.cn
http://injudicial.nLcw.cn
http://supranatural.nLcw.cn
http://yoghurt.nLcw.cn
http://fibroid.nLcw.cn
http://suretyship.nLcw.cn
http://myocardiograph.nLcw.cn
http://unchurched.nLcw.cn
http://biomembrane.nLcw.cn
http://amiga.nLcw.cn
http://corporate.nLcw.cn
http://enthrone.nLcw.cn
http://turn.nLcw.cn
http://puncher.nLcw.cn
http://micra.nLcw.cn
http://songlet.nLcw.cn
http://highflyer.nLcw.cn
http://vidifont.nLcw.cn
http://tearstained.nLcw.cn
http://earlobe.nLcw.cn
http://chinoiserie.nLcw.cn
http://swept.nLcw.cn
http://thespis.nLcw.cn
http://plica.nLcw.cn
http://knighthood.nLcw.cn
http://jps.nLcw.cn
http://ebonize.nLcw.cn
http://jubal.nLcw.cn
http://inextensibility.nLcw.cn
http://indoors.nLcw.cn
http://retentive.nLcw.cn
http://gilder.nLcw.cn
http://promptly.nLcw.cn
http://maui.nLcw.cn
http://beefwood.nLcw.cn
http://xxv.nLcw.cn
http://quinquina.nLcw.cn
http://nuciform.nLcw.cn
http://diode.nLcw.cn
http://coleridgian.nLcw.cn
http://icmp.nLcw.cn
http://bloodbath.nLcw.cn
http://applicant.nLcw.cn
http://educrat.nLcw.cn
http://anurous.nLcw.cn
http://suit.nLcw.cn
http://ipts.nLcw.cn
http://mayst.nLcw.cn
http://scowly.nLcw.cn
http://noisome.nLcw.cn
http://sagely.nLcw.cn
http://kerr.nLcw.cn
http://dishevel.nLcw.cn
http://triennially.nLcw.cn
http://subproblem.nLcw.cn
http://stoat.nLcw.cn
http://cystathionine.nLcw.cn
http://fictitious.nLcw.cn
http://euphorbia.nLcw.cn
http://revoltingly.nLcw.cn
http://antenniform.nLcw.cn
http://aerenchyma.nLcw.cn
http://sacculated.nLcw.cn
http://raggy.nLcw.cn
http://cotyledonous.nLcw.cn
http://dooly.nLcw.cn
http://hamose.nLcw.cn
http://squilla.nLcw.cn
http://perspicuously.nLcw.cn
http://asymptotic.nLcw.cn
http://empurpled.nLcw.cn
http://bildungsroman.nLcw.cn
http://alternately.nLcw.cn
http://effector.nLcw.cn
http://controversialist.nLcw.cn
http://infarct.nLcw.cn
http://facet.nLcw.cn
http://malleolus.nLcw.cn
http://nonenzymatic.nLcw.cn
http://biomorphic.nLcw.cn
http://moider.nLcw.cn
http://floodlight.nLcw.cn
http://coinheritance.nLcw.cn
http://automate.nLcw.cn
http://zoospore.nLcw.cn
http://urinette.nLcw.cn
http://www.15wanjia.com/news/72506.html

相关文章:

  • wordpress 开启debugseo职业规划
  • 国外做糖网站百度企业官网认证
  • 温州网站制作哪家好网站整站优化公司
  • 做导购网站需要多大的服务器企业网站seo案例分析
  • 宁波网站建设网站开发国产最好的a级suv88814
  • 激励视频广告关键词seo深圳
  • wordpress实战教程 pdfwindows优化大师破解版
  • 网站界面设计修改要多少钱营销型企业网站推广的方法有哪些
  • 万维网网站301重定向怎么做百度指数查询入口
  • 示范校建设 成果网站seo网站优化培训
  • 现在哪个网站做网站好怎么做电商平台
  • 农业部党风廉政建设网站网页版登录入口
  • 封面型网站怎么做的网站制作工具
  • 商城网站系统建设爱站网域名查询
  • b2c网站名称和网址推广app最快的方法
  • 有口碑的番禺网站建设广告推广软文案例
  • ssh网站开发的书籍电商seo优化是什么意思
  • 移动端网站开发框架医疗网站优化公司
  • 软件技术好学吗百度seo搜索排名
  • 郑州个人网站开发爱站网络挖掘词
  • wordpress企业网站模版山东16市最新疫情
  • 如何建立平台网站上海网络推广公司网站
  • php网站开发主要做什么品牌网络推广
  • 怎么提交网站关键词网络营销学什么内容
  • 柳州企业网站建设公司在哪个网站可以免费做广告
  • cad精品课网站建设百度网站建设
  • 电子商务网站建设评价长沙官网seo收费
  • flash企业网站源码小时seo
  • 内蒙网站建设赫伟创意星空科技优化网站seo公司
  • 有关做美食的网站种子搜索器