opengl快速学习

2020-03-16  本文已影响0人  陈桐Caliburn

前言

https://juejin.im/post/5e00bc2051882512454b44f3

opengl学习方法

opengl原理及思考

1、 opengl的安卓支持
    public interface Renderer {
       //视图创建时调用  初始化工作
        void onSurfaceCreated(GL10 gl, EGLConfig config);
        //视图改变时调用  主流程绘制工作
        void onSurfaceChanged(GL10 gl, int width, int height);
        //视图绘制时调用  实时监测工作
        void onDrawFrame(GL10 gl);
    }
2、基本思考

编写代码时刻要考虑,视图与逻辑分离作为第一原则
1、图像基本组成要素是一样的,要抽象出来增加复用性
2、图像修改,要通过回调来操作,避免业务代码写到图像代码中,增加可读性
3、每种图形GLSurfaceView,Renderer代码中,避免过多全局变量,如果渲染器或图形视图过于复杂,要分开写

opengl 整体渲染流程
opengl渲染管线处理流程

顶点着色器 :根据顶点坐标,建立图形模型。
片段着色器:图形填上颜色。

目前手机上opengl使用渲染管线,围绕形状绘制和着色展开工作

   // 声明一个字节缓冲区 FloatBuffer
   private FloatBuffer floatBuffer;
   // 定义顶点数据
   float[] vertexData = new float[16];
   // FloatBuffer 初始化工作并放入顶点数据
   floatBuffer = ByteBuffer
       .allocateDirect(vertexData.length * Constant.BYTES_PRE_FLOAT)
       .order(ByteOrder.nativeOrder())
       .asFloatBuffer()
       .put(vertexData);
attribute vec4 a_Position;
void main()
{
    gl_Position = a_Position; //接收顶点坐标
    gl_PointSize = 30.0; //点大小
}

顶点坐标 a_Position
特殊全局变量 gl_Position 和 gl_PointSize
实战:要提供通用ShapeUtil工具类,便于快速着色

precision mediump float; //精度
uniform vec4 u_Color; //颜色
void main()
{
    gl_FragColor = u_Color;
}

颜色的全局变量 :gl_FragColor
java层颜色赋值:u_Color
精度:mediump
片段着色之后,自动写入缓存,显示在屏幕上

2、opengl代码编写完整流程
public class ShaderHelper {

  //编译着色器
  public static int compileShader(int type, String shaderCode);
  
//创建 OpenGL 程序和着色器链接
  public static int linkProgram(int vertexShaderId, int fragmentShaderId) ;

  //验证OpenGL程序
  public static boolean validateProgram(int programObjectId) ;

  //使用open程序
  public static void  glUseProgram(int program);
}
创建opengl必须在onSurfaceCreated()方法中,才能生效
上一篇 下一篇

猜你喜欢

热点阅读