介绍
这篇文章将为大家详细讲解有关使用OpenGL怎么实现ES正交投影,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>绘制正方形强>
在最开始绘制的六边形里面好像看起来挺容易的,也没有出现什么问题,接下来不妨忘记前面绘制六边形的代码,让我们按照自己的理解来绘制一个简单的正方形。
按照我的理解,要想在屏幕中间显示一个正方形,效果如下图所示
应该创建的数据如下图所示
即传给渲染管线的顶点数据如下图:
浮动[],vertexArray =, new 浮动[],{ ,,(浮动),-0.5,(浮动),-0.5,0, ,,(浮动),0.5,(浮动),-0.5,0, ,,(浮动),-0.5,(浮动),0.5,0, ,,(浮动),0.5,(浮动),0.5,0 ,,},
于是代码大概是这样子的,这里省略掉与主题无关的代码,颜色用纯色填充,因此在片元着色器中指定颜色,也省略掉一系列矩阵变换。顶点着色器中直接将顶点传给渲染管线,片元着色器中给片元设置固定颜色红色。
矩形。java
public class Rectangle { ,private FloatBuffer  mVertexBuffer; ,private int  mProgram; ,private int  mPositionHandle; ,public 矩形(float r), { initVetexData才能(r); ,} ,public void  initVetexData (float r), {//才能,初始化顶点坐标 浮动[],才能vertexArray =, new 浮动[],{ ,,(浮动),-0.5,(浮动),-0.5,0, ,,(浮动),0.5,(浮动),-0.5,0, ,,(浮动),-0.5,(浮动),0.5,0, ,,(浮动),0.5,(浮动),0.5,0 ,,}; ByteBuffer 才能;buffer =, ByteBuffer.allocateDirect (vertexArray.length *, 4); buffer.order才能(ByteOrder.nativeOrder ()); 时间=mVertexBuffer 才能;buffer.asFloatBuffer (); mVertexBuffer.put才能(vertexArray); mVertexBuffer.position才能(0); int 才能;vertexShader =, loaderShader (vertexShaderCode GLES20.GL_VERTEX_SHADER也); int 才能;fragmentShader =, loaderShader (fragmentShaderCode GLES20.GL_FRAGMENT_SHADER也); 时间=mProgram 才能;GLES20.glCreateProgram (); GLES20.glAttachShader才能(mProgram, vertexShader); GLES20.glAttachShader才能(mProgram, fragmentShader); GLES20.glLinkProgram才能(mProgram); 时间=mPositionHandle 才能;GLES20.glGetAttribLocation (mProgram,“aPosition"); ,} ,public void 画(),{ GLES20.glUseProgram才能(mProgram);//,才能将顶点数据传递到管线、顶点着色器 GLES20.glVertexAttribPointer才能(mPositionHandle,, 3,, GLES20.GL_FLOAT,,假的,,0,,mVertexBuffer); GLES20.glEnableVertexAttribArray才能(mPositionHandle);//,才能绘制图元 GLES20.glDrawArrays才能(GLES20.GL_TRIANGLE_STRIP, 0, 4); ,} ,private int  loaderShader (int 类型,String shaderCode), { int 才能;shader =, GLES20.glCreateShader(类型); GLES20.glShaderSource才能(材质,shaderCode); GLES20.glCompileShader才能(材质); return 才能;材质; ,} ,private String vertexShaderCode =,“attribute vec3 立场;“ ,,+,“void 主要(){“; ,,+,“gl_Position =, vec4(立场,1);“ ,+,才能“}”; ,private String fragmentShaderCode =,“precision mediump 浮动;“ ,,+,“void 主要(){“; ,,+,“gl_FragColor =, vec4 (1 0 0,0);“ ,+,才能“}”; }
RectangleView。java
public class RectangleView extends GLSurfaceView { ,public RectangleView (Context 上下文),{ 超级才能(上下文); setEGLContextClientVersion才能(2); setRenderer才能(new MyRender ()); ,} ,class MyRender  implements GLSurfaceView.Renderer  { private 才能Rectangle 矩形; @Override才能 public 才能;void  onSurfaceCreated (GL10 gl, EGLConfig 配置),{ ,,GLES20.glClearColor (0.5 f, f 0.5,, 0.5 f, 1); ,,rectangle =, new 矩形(0.5度); ,,GLES20.glEnable (GLES20.GL_DEPTH_TEST); ,,} @Override才能 public 才能;void  onSurfaceChanged (GL10 gl, int 宽度,,int 高度),{ ,,GLES20.glViewport(0, 0,宽度,高度); ,,} @Override才能 public 才能;void  onDrawFrame (GL10 gl), { null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null使用OpenGL怎么实现ES正交投影