Opengl ES系列学习--glDrawArrays API使用

     本节我们来看一下glDrawArrays API的使用,我们就讲一些常量的知识,生僻少用的就不看了。

     所有实例均有提供源码,下载地址:Opengl ES Source Code

     API中文说明:GLES2.0中文API-glDrawArrays

     Opengl提供的两类绘制API就是glDrawArrays、glDrawElements,绘制三角形序列的三种方式:GL_TRIANGLES、GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN。

     GL_TRIANGLES是以每三个顶点绘制一个三角形,第一个三角形使用顶点v0,v1,v2,第二个使用v3,v4,v5,以此类推。如果顶点的个数n不是3的倍数,那么最后的1个或者2个顶点会被忽略。

     GL_TRIANGLE_STRIP则稍微有点复杂。其规律是:构建当前三角形的顶点的连接顺序依赖于要和前面已经出现过的2个顶点组成三角形的当前顶点的序号的奇偶性(序号从0开始):如果当前顶点是奇数,组成三角形的顶点排列顺序:T = [n-1 n-2 n];如果当前顶点是偶数,组成三角形的顶点排列顺序:T = [n-2 n-1 n];如上图中,第一个三角形,顶点v2序号是2,是偶数,则顶点排列顺序是v0,v1,v2。第二个三角形,顶点v3序号是3,是奇数,则顶点排列顺序是v2,v1,v3;第三个三角形,顶点v4序号是4,是偶数,则顶点排列顺序是v2,v3,v4,以此类推。我们从自己实现的形状也可以看到实际效果。这个顺序是为了保证所有的三角形都是按照相同的方向绘制的,使这个三角形串能够正确形成表面的一部分。对于某些操作,维持方向是很重要的,比如剔除。注意:顶点个数n至少要大于3,否则不能绘制任何三角形。

     GL_TRIANGLE_FAN是类似弧形的绘制,以这种方式画出来的三角形也是连接在一起的,但是区别于Triangle的是它们有一个共同的顶点。这个顶点称为它们的中心顶点。按顺序前三个点组成一个三角形。而后保留该组三角形的最后一个顶点我们暂且记为last,依次按照中心点、last和下一个点组成下一个三角形。并重复该过程。我们可以看到,因为有一个共用的中心点,其他点将以它为中心点依次构建三角形。所以给定点数目为N(N>=3),则所画出的三角形个数为(N - 3 + 1)个三角形。也就是(N - 2)个三角形。结合我们本节要实现的实例来看一下,绘制的形状完全一样,但是按照GL_TRIANGLES方式绘制,一共五个三角形,每个三角形三个顶点,所以一共需要15个顶点;但是如果用GL_TRIANGLE_FAN方式绘制,(N - 2 = 5),所以N等于7,也就是只需要7个顶点就可以绘制出来了,记得不要忘了v1要闭合,否则就会缺一角,可以参考本节最后的图形。

     明白了三种绘制序列,我们来自己实现一下,本节的代码对应OpenGL\learn\src\main\java\com\opengl\learn\GlDrawArraysRender.java文件,该类所有源码如下:

package com.opengl.learn;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.Log;

import com.lime.common.ESShader;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import static android.opengl.GLES20.GL_COL
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenGLES是一个专门用于嵌入式系统和移动设备的图形渲染API,可以用来绘制各种2D和3D图形。下面是一个简单的使用OpenGLES绘制图形的步骤: 1. 创建OpenGL ES上下文,需要使用EGL来完成这个步骤。 2. 配置OpenGL ES的状态,包括背景颜色、深度缓冲区、清除颜色和深度缓冲区等。 3. 创建OpenGL ES对象,包括着色器程序、顶点缓冲区、纹理等。 4. 绘制图形,使用绑定的着色器程序、顶点缓冲区、纹理等,调用OpenGL ES绘制函数进行绘制。 5. 交换前后缓冲区,将绘制结果显示到屏幕上。 下面是一个简单的OpenGL ES绘制三角形的示例代码: ```c++ #include <GLES2/gl2.h> #include <EGL/egl.h> EGLDisplay display; EGLSurface surface; EGLContext context; GLuint programObject; const GLfloat vertices[] = { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; const char *vertexShaderSource = "attribute vec4 a_Position;\n" "void main() {\n" " gl_Position = a_Position;\n" "}\n"; const char *fragmentShaderSource = "precision mediump float;\n" "void main() {\n" " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" "}\n"; void init() { // 创建OpenGL ES上下文 EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_NONE }; EGLint majorVersion; EGLint minorVersion; EGLConfig config; EGLint numConfigs; EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, &majorVersion, &minorVersion); eglChooseConfig(display, configAttribs, &config, 1, &numConfigs); EGLSurface surface = eglCreateWindowSurface(display, config, nativeWindow, NULL); EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL); eglMakeCurrent(display, surface, surface, context); // 配置OpenGL ES状态 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepthf(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); // 创建OpenGL ES对象 GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); programObject = glCreateProgram(); glAttachShader(programObject, vertexShader); glAttachShader(programObject, fragmentShader); glLinkProgram(programObject); glViewport(0, 0, width, height); } void render() { // 清除颜色缓冲区和深度缓冲区 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绑定着色器程序 glUseProgram(programObject); // 绑定顶点缓冲区 GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 设置顶点属性 GLuint positionLocation = glGetAttribLocation(programObject, "a_Position"); glEnableVertexAttribArray(positionLocation); glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); // 绘制三角形 glDrawArrays(GL_TRIANGLES, 0, 3); // 交换前后缓冲区 eglSwapBuffers(display, surface); } int main() { init(); while (true) { render(); } return 0; } ``` 这是一个OpenGL ES 2.0的示例代码,包含了创建OpenGL ES上下文、配置OpenGL ES状态、创建OpenGL ES对象、绘制三角形等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红-旺永福

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值