OpenGl开发第一章

一直很想学习openGl但是一直没有时间,这今天项目做的差不多了,终于有时间能好好看看了。

OpenGl其实就是通过GlSurfaceView  跟一个渲染器来实现图形的绘制,简单的来说就是渲染器来进行绘制,在GlSurfaceView中的代码是比较少的,除非是你要做一些别的操作,比如图形的旋转。

第一步,首先要熟悉android Activity 的布局填充,创建一个android项目

创建一个GlSurfaceView类.我这个是为了实现旋转在里边加上了onTouch事件,不需要旋转的可以注释掉不用管

package com.example.opengl_demo;

import android.content.Context;

import android.opengl.GLSurfaceView;

import android.util.AttributeSet;

import android.view.MotionEvent;

public class MySurfaceView extends GLSurfaceView {

private final float TOUCH_SCALE_FACTOR = 180.0f / 320;

private MyRander myRander;

private float mPreviousX;

private float mPreviousY;

public MySurfaceView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

}

public MySurfaceView(Context context) {

super(context);

myRander = new MyRander();

setRenderer(myRander);

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

float x =event.getX();

float y =event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

float dx = x - mPreviousX;

float dy = y - mPreviousY;

// reverse direction of rotation above the mid-line

if (y > getHeight() / 2) {

dx = dx * -1 ;

}

// reverse direction of rotation to left of the mid-line

if (x < getWidth() / 2) {

dy = dy * -1 ;

}

myRander.angle += (dx + dy) * TOUCH_SCALE_FACTOR;

requestRender();

}

mPreviousX = x;

mPreviousY = y;

return true;

}

}

接下来就是  建一个Render渲染类,这就是绘图的主要部分:

package com.example.opengl_demo;

import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL;

import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;

import android.opengl.GLU;

import android.os.SystemClock;

public class MyRander implements GLSurfaceView.Renderer {

private float[] mTriangleArray = { 0f, 1f, 0f, -1f, -1f, 0f, 1f, -1f, 0f };

private float[] mQuadsArray = {

1f,1f,0f,                           //右上

-1f,1f,0f,                          //左上

-1f,-1f,0f,                         //左下

1f,-1f,0f                           //右下

};

private FloatBuffer mQuadsBuffer;

private FloatBuffer mFloatBuffer;

float angle;

@Override

public void onDrawFrame(GL10 gl) {

// 画

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

// 使用相机投影模式

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

gl.glTranslatef(-1.5f, 0.0f, -6.0f);     //第一个参数是说这个矩阵中心点的位置,第二个 中心点上下的位置,第三个深度的位置

/* // 使用眼点

GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);*/

// 设置旋转

/*

* long time =SystemClock.uptimeMillis()%4000L; float angle

* =0.090f*(int)time;

*/

gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);

// 绘制三角形

gl.glColor4f(1f, 0f, 0f, 1f);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFloatBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

//绘制四边形,

gl.glLoadIdentity();

gl.glTranslatef(1.5f, 0.0f, -6.0f); //向右移动了1.5f的距离以后又绘制的矩形,这样不会跟三角形重叠

gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);   //这个还是设置旋转的

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mQuadsBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);这个是绘制矩形的

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

// 屏幕大小改变的时候

gl.glViewport(0, 0, width, height);

float radio = (float) width / height;

gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glLoadIdentity();

gl.glFrustumf(-radio, radio, -1, 1, 1, 10);     //这个是为了让画出来的三角形在屏幕中的位置看起来舒服,你可以去掉试试,会布满整个屏幕

}

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// 当被创建的时候

mFloatBuffer = BufferUtil.floatToBuffer(mTriangleArray);

mQuadsBuffer =BufferUtil.floatToBuffer(mQuadsArray);

gl.glShadeModel(GL10.GL_SMOOTH); // 设置阴影平滑

gl.glClearColor(1f, 1f, 1f, 1f); // 设置清除的时候的颜色

gl.glClearDepthf(1.0f); // 深度缓存

gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glDepthFunc(GL10.GL_LEQUAL);

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 绘制的时候必须调用这个方法,告诉gl你是使用的顶点绘制,如果没有这句代码你就不要想画出东西来了

}

}

主要代码就是这个样子,实现了绘制,。放置位置的调整,旋转的功能。下次试试画一个立方体,画图片,等等

时间: 2024-08-30 02:51:59

OpenGl开发第一章的相关文章

【翻译习作】 Windows Workflow Foundation程序开发-第一章01

第 1 章    欢迎来到工作流的世界 …思想如蝴蝶般飞到我身边 —— Gossard / Vedder (译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲<Even flow>) Windows Workflow可被看作是继COM+和分布式事务协调器(DTC)之后,Windows平台上最令人瞩目的一款中间件产品.它们之间的区别在于:不是每一个软件应用都需要进行分布式事务处理:但几乎每个软件都要在其内部实现工作流.为了能够领会微软设计Windows

Android深度探索(卷1)HAL与驱动开发 第一章&#160;Android系统移植与驱动开发概述 读书笔记

Android深度探索(卷1)HAL与驱动开发 第一章 Android系统移植与驱动开发概述 读书笔记 本章是 Android系统移植与驱动开发概述性的具体讲解.首先,Android被分为了四层架构.在最底层的是Linux内核 .然后分别是C/C++代码库.Android SDK A和应用程序.而Android的移植又分为系统移植和应用移植.系统移植要实现Android操作系统在其他硬件平台上运行起来,其中的关键是Linux的内核.内核必须要完成对平台上运行的各个硬件的识别.所以这就需要Linu

【翻译习作】 Windows Workflow Foundation程序开发-第一章05

1.3      开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程序把这个招人烦的产品经理替换掉.这个例程无法向你展示WF平台的全部功能,但它可以让你领略到如何用WF创建并运行工作流. 在开始之前,我们需要下载并安装.NET 3.0框架.安装程序可以在 http://netfx3.com 找到.Visual Studio 2005的所有版本都支持在.NET 3.0

【翻译习作】 Windows Workflow Foundation程序开发-第一章03

1.2.2.Visual Studio 2005扩展包 微软也为Windows Workflow开发者提供了Visual Studio 2005扩展包.扩展包将许多功能集成到Visual Studio里,其中就包括一个用于编制工作流的可视化设计器.下面就是可视化设计器的截屏图. 这个设计器的窗口式样与我们所熟悉的Windows和Web表单设计器保持一致.Toolbox(工具箱)窗口中列出了可以拖放到设计器台面上的所有活动.我们也可以把自定义的活动添加到Toolbox中去.一旦把一个活动放置到设计

Android深度探索(卷1)HAL与驱动开发第一章总结

Android系统在2015年占全球市场份额的的81.6%,而且近几年一直持增长趋势,走在大街上,随处可见的安卓手机,毋庸置疑,安卓已经成为当前智能手机操作系统的老大.当我们想要搞明白Android驱动开发的时候,其实就是在学习linux驱动开发的过程,只不过安卓增加了一个HAL,这是Android特有的.Google这样设计的原因有很多,例如由于Linux内核基于CPL开源协议,而很多驱动厂商不想开放源代码,所以增加HAL层后,可已经Linux驱动的业务逻辑放在HAL层. Android的系统

Android深度探索HAL与驱动开发-——第一章

第一章主要介绍的是Android体系结构和各层组成,以及对如何搭建Windows.Linux和NDK下的开发环境相应的进行学习. (1)在Android体系结构中:自上而下分为应用程序.应用程序架构.函数库以及Linux内核.在应用程序中采用java编写,使用者直接操作应用程序:在构架中实现多种功能模块:安卓函数库包含多种能被系统中不同的组件使用:Android内核重点介绍了IPC和PM. (2)接着在搭建windows开发环境中需要安装JDK(步骤:下载.安装.测试).Eclipse(步骤:下

Android深度探索--HAL与驱动开发第一章读后感

第一章:Android系统移植与驱动开发概述 第一章其实就是对安卓与Linux驱动做了一个总体的介绍. 现如今,Android已经成为现在智能手机操作系统的老大,市场占有率已经远远超过iOS,主要的原因主要在于Android的可移植,所有人都可以利用Android的源代码制作属于自己的系统,而且Android的体系结构也近乎完美.但在移植过程中进行最多开发的就是支持各种硬件设备Linux的驱动程序,所以讲移植必定先讲Liunx驱动开发. Android的体系结构主要由Linux内核.C/C++代

如鹏网 静态Web开发 第一章:html

第一章:html 本章主干知识点: 1.最基本的html文件的格式是什么? 2.常用标签:font.列表(ul.ol.li).img 3.表格标签:table.tr.td:表格的合并. 4.超链接.新窗口中打开的超链接.超链接锚点. 5.框架:frameset 6.表单:input(文本.radio.checkbox.隐藏字段.submit):select下拉列表:textarea:label: 7.div和span的区别. -----------------------------------

android深度探索 HAL及驱动开发 第一章

第一章 android系统移植与驱动开发概述对安卓和linux驱动做了一个总体介绍为特定设备定制安卓的过程叫做移植android 系统架构分为四层:1.linux内核 2.C/C++代码库 3.Android SDK API 4.应用程序android移植分为两部分:应用移植:将应用程序移植到某一个特定硬件平台上系统移植:让android操作系统在某一个特定硬件平台上运行android移植主要工作:移植linux驱动移植HAL查看linux内核版本的方法:方法一:在终端中运行 uname -a方