绘制多边形
1.glVertexPointer (int size, int type, int stride, Buffer pointer)
第一个参数表示坐标的维数,可以是2或者3,如果是2,则坐标为(x,y),z轴默认为0;如果是3,则坐标为(x,y,z)
第二个参数可以是GL10.GL_FIXED或者GL10.GL_FLOAT,如果是GL10.GL_FIXED,则第四个参数为IntBuffer类 型,如果为GL10.GL_FLOAT,则第四个参数为FloatBuffer类型
第三个参数表示步长
2.glDrawArrays (int mode, int first, int count)
第一个参数有三种类型GL10.GL_TRIANGLES、GL10.GL_TRIANGLE_FAN、GL10.GL_TRIANGLE_STRIP
GL_TRIANGLES:每三个顶之间绘制三角形,之间不连接
GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角形
GL_TRIANGLE_STRIP:顺序在每三个顶点之间均绘制三角形。这个方法可以保证从相同的方向上所有以三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形
3.代码
package com.lanhuidong.opengl;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
import com.lanhuidong.opengl.util.BufferToNativeOrder;
public class OpenGLRender implements Renderer {
private static int x = 0x10000 / 4;
private static float f = 0.5f;
private static float[] array = new float[] { -f, 0, 0, 0, (float) (f * Math.sqrt(3) / 2), 0, f, 0, 0 };
private static int[] array2 = new int[] { x, x, 0, x, -x, 0, -x, -x, 0, -x, x, 0 };
private static int[] array3 = new int[] { x, x, 0, -x, x, 0, -2 * x, 0, 0, -x, -x, 0, x, -x, 0, 2 * x, 0, 0 };
private static float[] colorarray = new float[] { 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1 };
/**
* 调用此方法绘制当前窗口
*/
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(-0.5f, 0.5f, -1.0f);
// 画三角行
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
FloatBuffer triangleBuffer = BufferToNativeOrder.getNativeOrderFloatBuffer(array);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleBuffer);//
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glLoadIdentity();
gl.glTranslatef(0.5f, 0.5f, -1.0f);
// 画矩形
IntBuffer quadrangleBuffer = BufferToNativeOrder.getNativeOrderIntBuffer(array2);
gl.glVertexPointer(3, GL10.GL_FIXED, 0, quadrangleBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glLoadIdentity();
gl.glTranslatef(-0.5f, -0.5f, -1.0f);
// 六边形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, BufferToNativeOrder.getNativeOrderIntBuffer(array3));
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 6);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
/**
* 窗口被创建或者窗口大小改变时被调用
*/
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
}
/**
* 窗口被创建或者被重新创建时调用,做初始化工作
*/
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0, 0, 1.0f, 0.5f);
}
}
package com.lanhuidong.opengl.util;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
public class BufferToNativeOrder {
public static IntBuffer getNativeOrderIntBuffer(int[] array){
ByteBuffer buffer = ByteBuffer.allocateDirect(array.length * 4);
buffer.order(ByteOrder.nativeOrder());
IntBuffer intBuffer = buffer.asIntBuffer();
intBuffer.put(array);
intBuffer.position(0);
return intBuffer;
}
public static FloatBuffer getNativeOrderFloatBuffer(float[] array){
ByteBuffer buffer = ByteBuffer.allocateDirect(array.length * 4);
buffer.order(ByteOrder.nativeOrder());
FloatBuffer floatBuffer = buffer.asFloatBuffer();
floatBuffer.put(array);
floatBuffer.position(0);
return floatBuffer;
}
}
效果:
- 大小: 5.7 KB
- 大小: 1.2 KB
分享到:
相关推荐
### OpenGL学习知识点详解 #### 一、OpenGl简介与预备知识 **1.1 引言** 本教程旨在为读者提供一个系统性学习OpenGl的平台。OpenGl是一种跨语言、跨平台的应用程序接口(API),用于渲染二维、三维矢量图形。它是...
标题“Qt Opengl学习绝好资料”说明这是一份优秀的学习资源,它旨在指导读者如何在Qt环境中使用OpenGL进行图形绘制。标题中提到的“学习”和“资料”暗示了本资源的教育性质,它更侧重于入门和基础知识的传递。描述...
收集到的OpenGL学习资料,内容包括: 1.OpenGL着色语言.rar 2.NEHE教程.pdf 3.openglapi.CHM 4.opengl编程与实例.pdf 5.openGL图像系统详解(英).pdf 6.vc下OpenGL开发框架与应用.pdf 7.北大 openGL 课程.pdf
1. **OpenGL官方文档** (opengl.org/developers/documentation):这是所有OpenGL学习者的基础起点。官方网站提供了完整的OpenGL规范、参考手册和API文档,详细介绍了各个函数、枚举和常量的作用。同时,这里也有...
2. 安装 GLUT 工具包:GLUT 不是 OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装。 三、安装 GLUT 工具包 1. 将下载的压缩包解开,将得到 5 个文件 2. 在“我的电脑”中搜索“gl.h”,并找到其所在...
在这个"opengl类学习文件"中,包含了多个关键元素,可以帮助你深入理解并掌握OpenGL编程。 首先,"gltools"可能是一个包含GLUT(OpenGL Utility Toolkit)和其他辅助工具的库,它为OpenGL程序员提供了基本的窗口...
这个“OpenGL.rar”压缩包包含了OpenGL的参考手册,提供了对OpenGL API的详细解释,对于学习和开发使用OpenGL的应用程序至关重要。 OpenGL参考手册通常分为多个部分,包括核心规范、扩展规格、以及编程指南等。手册...
2. **与TC graphics.h的对比**:OpenGL相比TC中的图形接口,提供了更高级别的抽象和更多的功能,同时在操作和性能上更胜一筹,使得创建复杂的图形和游戏成为可能。 3. **OpenGL的优势**:OpenGL是一个工业标准,...
它提供了两个版本,OpenGL ES 1.x系列更侧重于固定功能管线,而OpenGL ES 2.x和3.x系列引入了可编程管线的概念,使开发者能够更好地控制渲染管线和优化性能。在iOS平台上,随着iOS系统的升级,所支持的OpenGL ES版本...
在本篇“Android OpenGL 学习笔记(一)”中,我们将探讨如何在Android平台上使用OpenGL ES进行图形渲染。OpenGL ES是OpenGL的一个轻量级版本,专为嵌入式系统设计,包括移动设备如智能手机和平板电脑。这篇笔记将...
"红宝书"通常指的是"OpenGL编程指南",而"蓝宝书"则是"OpenGL超级宝典",这两本书是OpenGL学习者的重要参考资料。 红宝书,全名《OpenGL编程指南》(The OpenGL Programming Guide),由OpenGL Architecture Review...
本资源集合包含了一套完整的OpenGL学习资料,适合初学者入门。 首先,"OpenGL编程指南第七版"是学习OpenGL的基础书籍,它深入浅出地介绍了OpenGL的工作原理和基本概念,包括上下文创建、窗口系统集成、绘图函数、...
QT OpenGL学习是一个面向初学者和有一定基础的开发者的学习资源,主要关注如何在QT4框架下有效地使用OpenGL进行图形渲染和交互。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形,而QT则是一个强大的...
OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、...
OpenGL 入门学习资料整理 OpenGL 作为当前主流的图形 API 之一,它在一些场合具有比 DirectX 更优越的特性。本文主要介绍了入门的基础知识。 一、OpenGL 的优点 1. 与 C 语言紧密结合 OpenGL 命令最初就是用 C ...
这个“OPENGL学习 3D小雪人”资源是为初学者设计的,旨在帮助他们理解并掌握OpenGL的基础知识,通过创建一个3D小雪人的实例来实践。 3D小雪人的实现涉及多个OpenGL的关键概念和技术: 1. **窗口系统绑定**:在...
openGL 学习手册 自己从网上总结的 希望对大家有用
其次,《OpenGL编程指南》第七版,也被称为“红宝书”,是OpenGL学习的经典之作。这本书全面介绍了OpenGL 4.x版本,包括新的核心模式、固定功能管道的移除、向量和矩阵运算、着色语言GLSL、纹理、帧缓冲对象、几何...
学习笔记OpenGL:VisualStudio2022配置OpenGL环境学习笔记OpenGL:VisualStudio2022配置OpenGL环境学习笔记OpenGL:VisualStudio2022配置OpenGL环境学习笔记OpenGL:VisualStudio2022配置OpenGL环境学习笔记OpenGL:...
### OpenGL学习内容以及参考书籍和网站-2008 #### 一、OpenGL背景与历史 OpenGL(Open Graphics Library)是一种跨平台的应用程序接口(API),用于渲染2D和3D矢量图形。它最初由Silicon Graphics Inc. (SGI) 开发...