OpenGL(1) —— OpenGL 如何取顶点数据以及画一个点

假设我们有三角形的三个点的数据,每个顶点由 (x, y, z) 三个基向量表示,每个纹理由 (u, v) 两个基向量表示。

OpenGL 中处理数据没有像面向语言一样那么结构化的存取,只能使用数组的方式进行存取(开发者需要自己知道数组中每个数据表示什么意思)。

上面的程序块首先将 JVM 中的数据数组 mTriangleVerticeData 转移到直接内存 mTriangleVertices 中,然后再从直接内存中按块读出数据,拷贝到 GPU 存储空间的 aPositionHandle 地址。

我们先来看看绘制的 Shader 程序:

我们在 onDrawFrame() 绘画时也要注意取值使用 GL_POINTS ,这样就会两个 float 一组地取。 gl_PointSize 单位为像素。

假设我们需要画的点为 (0, 0) :

按照上面的步骤,我们首先将 JVM 数据拷贝到直接内存中:

然后在 onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) 方法中通过 glGetUniformLocation 或 glGetAttribLocation 来获取点坐标存储在 GPU 中的位置值,并将直接内存中的点坐标数据拷贝到该地址指针中。最后调用 glEnableVertexAttribArray(aPositionLocation) 来使能 aPositionLocation 。

然后在 onDrawFrame(GL10) 时,指明每一帧的绘制的数据颜色和位置。

其中 glUniform4f 中指明的颜色是 R, G, B, A 排列。上面的 (0.0f, 1.0f, 0.5f, 1.0f) 表示绿色,每个元素的取值范围是 0.0f ~ 1.0f 之间,表示 0~255 的归一化数据。

/fightyz/OpenGLPlayground

checkout 到 a650a852fe91d2ad89ca9deab22306979e8a2c7e