使用OpenGL怎么实现ES正交投影

  介绍

这篇文章将为大家详细讲解有关使用OpenGL怎么实现ES正交投影,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>绘制正方形

在最开始绘制的六边形里面好像看起来挺容易的,也没有出现什么问题,接下来不妨忘记前面绘制六边形的代码,让我们按照自己的理解来绘制一个简单的正方形。

按照我的理解,要想在屏幕中间显示一个正方形,效果如下图所示

使用OpenGL怎么实现ES正交投影

应该创建的数据如下图所示

使用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正交投影