- 浏览: 48882 次
- 性别:
- 来自: 深圳
最新评论
package com.opengl.test; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.CharBuffer; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import javax.microedition.khronos.opengles.GL11ExtensionPack; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.opengl.GLUtils; import android.os.Bundle; import android.util.Log; /** * Demonstrate how to use the OES_texture_cube_map extension, available on some * high-end OpenGL ES 1.x GPUs. */ public class TestActivity extends Activity { private GLSurfaceView mGLSurfaceView; private class Renderer implements GLSurfaceView.Renderer { private boolean mContextSupportsCubeMap = true; private Grid mGrid; private int mCubeMapTextureID; private boolean mUseTexGen = false; private float mAngle; public void onDrawFrame(GL10 gl) { checkGLError(gl); if (mContextSupportsCubeMap) { gl.glClearColor(0,0,1,0); //设置背景色 } else { // Current context doesn't support cube maps. // Indicate this by drawing a red background. gl.glClearColor(1,0,0,0); } gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//清楚缓存 gl.glEnable(GL10.GL_DEPTH_TEST);//深度检测 gl.glMatrixMode(GL10.GL_MODELVIEW);//设置当前矩阵为模式矩阵 gl.glLoadIdentity(); GLU.gluLookAt(gl, 0, 0, -2, 0f, 0f, 0f, 0f, 1.0f, 0.0f);//调整视点。 gl.glRotatef(mAngle, 0, 1, 0);//绕Y轴旋转 gl.glRotatef(mAngle*0.25f, 1, 0, 0);//绕X轴旋转 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); checkGLError(gl); // mContextSupportsCubeMap = true; if (mContextSupportsCubeMap) { gl.glActiveTexture(GL10.GL_TEXTURE0); checkGLError(gl); gl.glEnable(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP); checkGLError(gl); gl.glBindTexture(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP, mCubeMapTextureID); checkGLError(gl); GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl; gl11ep.glTexGeni(GL11ExtensionPack.GL_TEXTURE_GEN_STR,//自动生成纹理坐标 GL11ExtensionPack.GL_TEXTURE_GEN_MODE, GL11ExtensionPack.GL_REFLECTION_MAP); checkGLError(gl); gl.glEnable(GL11ExtensionPack.GL_TEXTURE_GEN_STR); checkGLError(gl); gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_DECAL);//自动生成纹理贴图 } checkGLError(gl); mGrid.draw(gl); if (mContextSupportsCubeMap) { gl.glDisable(GL11ExtensionPack.GL_TEXTURE_GEN_STR); } checkGLError(gl); mAngle += 1.2f; } public void onSurfaceChanged(GL10 gl, int width, int height) { checkGLError(gl); 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); checkGLError(gl); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { checkGLError(gl); // This test needs to be done each time a context is created, // because different contexts may support different extensions. mContextSupportsCubeMap = checkIfContextSupportsCubeMap(gl);//当前设备是否支持环境纹理 mGrid = generateTorusGrid(gl, 30, 30, 3.0f, 0.75f); if (mContextSupportsCubeMap) { int[] cubeMapResourceIds = new int[]{//为环境纹理的6个面设置图片。 R.raw.skycubemap0, R.raw.skycubemap1, R.raw.skycubemap2, R.raw.skycubemap3, R.raw.skycubemap4, R.raw.skycubemap5}; mCubeMapTextureID = generateCubeMap(gl, cubeMapResourceIds); } checkGLError(gl); } private int generateCubeMap(GL10 gl, int[] resourceIds) { checkGLError(gl); int[] ids = new int[1]; gl.glGenTextures(1, ids, 0);//自动生成纹理ID int cubeMapTextureId = ids[0]; gl.glBindTexture(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP, cubeMapTextureId);//绑定纹理 gl.glTexParameterf(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP,//设定纹理过滤参数 GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); for (int face = 0; face < 6; face++) { InputStream is = getResources().openRawResource(resourceIds[face]); Bitmap bitmap; try { bitmap = BitmapFactory.decodeStream(is); } finally { try { is.close(); } catch(IOException e) { Log.e("CubeMap", "Could not decode texture for face " + Integer.toString(face)); } } GLUtils.texImage2D(GL11ExtensionPack.GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0,//将图片映射到纹理上 bitmap, 0); bitmap.recycle(); } checkGLError(gl); return cubeMapTextureId; } private Grid generateTorusGrid(GL gl, int uSteps, int vSteps, float majorRadius, float minorRadius) {//圆环建模 Grid grid = new Grid(uSteps + 1, vSteps + 1); for (int j = 0; j <= vSteps; j++) { double angleV = Math.PI * 2 * j / vSteps; float cosV = (float) Math.cos(angleV); float sinV = (float) Math.sin(angleV); for (int i = 0; i <= uSteps; i++) { double angleU = Math.PI * 2 * i / uSteps; float cosU = (float) Math.cos(angleU); float sinU = (float) Math.sin(angleU); float d = majorRadius+minorRadius*cosU; float x = d*cosV; float y = d*(-sinV); float z = minorRadius * sinU; float nx = cosV * cosU; float ny = -sinV * cosU; float nz = sinU; float length = (float) Math.sqrt(nx*nx + ny*ny + nz*nz); nx /= length; ny /= length; nz /= length; grid.set(i, j, x, y, z, nx, ny, nz); } } grid.createBufferObjects(gl); return grid; } private boolean checkIfContextSupportsCubeMap(GL10 gl) { return checkIfContextSupportsExtension(gl, "GL_OES_texture_cube_map"); } /** * This is not the fastest way to check for an extension, but fine if * we are only checking for a few extensions each time a context is created. * @param gl * @param extension * @return true if the extension is present in the current context. */ private boolean checkIfContextSupportsExtension(GL10 gl, String extension) { String extensions = " " + gl.glGetString(GL10.GL_EXTENSIONS) + " "; // The extensions string is padded with spaces between extensions, but not // necessarily at the beginning or end. For simplicity, add spaces at the // beginning and end of the extensions string and the extension string. // This means we can avoid special-case checks for the first or last // extension, as well as avoid special-case checks when an extension name // is the same as the first part of another extension name. return extensions.indexOf(" " + extension + " ") >= 0; } } /** A grid is a topologically rectangular array of vertices. * * This grid class is customized for the vertex data required for this * example. * * The vertex and index data are held in VBO objects because on most * GPUs VBO objects are the fastest way of rendering static vertex * and index data. * */ private static class Grid { // Size of vertex data elements in bytes: final static int FLOAT_SIZE = 4; final static int CHAR_SIZE = 2; // Vertex structure: // float x, y, z; // float nx, ny, nx; final static int VERTEX_SIZE = 6 * FLOAT_SIZE; final static int VERTEX_NORMAL_BUFFER_INDEX_OFFSET = 3; private int mVertexBufferObjectId; private int mElementBufferObjectId; // These buffers are used to hold the vertex and index data while // constructing the grid. Once createBufferObjects() is called // the buffers are nulled out to save memory. private ByteBuffer mVertexByteBuffer; private FloatBuffer mVertexBuffer; private CharBuffer mIndexBuffer; private int mW; private int mH; private int mIndexCount; public Grid(int w, int h) { if (w < 0 || w >= 65536) { throw new IllegalArgumentException("w"); } if (h < 0 || h >= 65536) { throw new IllegalArgumentException("h"); } if (w * h >= 65536) { throw new IllegalArgumentException("w * h >= 65536"); } mW = w; mH = h; int size = w * h; mVertexByteBuffer = ByteBuffer.allocateDirect(VERTEX_SIZE * size) .order(ByteOrder.nativeOrder());//顶点缓存 mVertexBuffer = mVertexByteBuffer.asFloatBuffer(); int quadW = mW - 1; int quadH = mH - 1; int quadCount = quadW * quadH; int indexCount = quadCount * 6; mIndexCount = indexCount; mIndexBuffer = ByteBuffer.allocateDirect(CHAR_SIZE * indexCount) .order(ByteOrder.nativeOrder()).asCharBuffer();//索引缓存 /* * Initialize triangle list mesh. * * [0]-----[ 1] ... * | / | * | / | * | / | * [w]-----[w+1] ... * | | * */ { int i = 0; for (int y = 0; y < quadH; y++) { for (int x = 0; x < quadW; x++) { char a = (char) (y * mW + x); char b = (char) (y * mW + x + 1); char c = (char) ((y + 1) * mW + x); char d = (char) ((y + 1) * mW + x + 1); mIndexBuffer.put(i++, a); mIndexBuffer.put(i++, c); mIndexBuffer.put(i++, b); mIndexBuffer.put(i++, b); mIndexBuffer.put(i++, c); mIndexBuffer.put(i++, d); } } } } public void set(int i, int j, float x, float y, float z, float nx, float ny, float nz) {//设置顶点坐标 if (i < 0 || i >= mW) { throw new IllegalArgumentException("i"); } if (j < 0 || j >= mH) { throw new IllegalArgumentException("j"); } int index = mW * j + i; mVertexBuffer.position(index * VERTEX_SIZE / FLOAT_SIZE); mVertexBuffer.put(x); mVertexBuffer.put(y); mVertexBuffer.put(z); mVertexBuffer.put(nx); mVertexBuffer.put(ny); mVertexBuffer.put(nz); } public void createBufferObjects(GL gl) {//创建缓存 checkGLError(gl); // Generate a the vertex and element buffer IDs int[] vboIds = new int[2]; GL11 gl11 = (GL11) gl; gl11.glGenBuffers(2, vboIds, 0); mVertexBufferObjectId = vboIds[0]; mElementBufferObjectId = vboIds[1]; // Upload the vertex data gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertexBufferObjectId); mVertexByteBuffer.position(0); gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mVertexByteBuffer.capacity(), mVertexByteBuffer, GL11.GL_STATIC_DRAW); gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mElementBufferObjectId); mIndexBuffer.position(0); gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer.capacity() * CHAR_SIZE, mIndexBuffer, GL11.GL_STATIC_DRAW); // We don't need the in-memory data any more mVertexBuffer = null; mVertexByteBuffer = null; mIndexBuffer = null; checkGLError(gl); } public void draw(GL10 gl) {// checkGLError(gl); GL11 gl11 = (GL11) gl; gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertexBufferObjectId); gl11.glVertexPointer(3, GL10.GL_FLOAT, VERTEX_SIZE, 0); gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); gl11.glNormalPointer(GL10.GL_FLOAT, VERTEX_SIZE, VERTEX_NORMAL_BUFFER_INDEX_OFFSET * FLOAT_SIZE);//法向量 gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mElementBufferObjectId); gl11.glDrawElements(GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, 0);//索引法画图 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);//清空顶点数组 gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);//清空索引数组 checkGLError(gl); } } static void checkGLError(GL gl) { int error = ((GL10) gl).glGetError(); if (error != GL10.GL_NO_ERROR) { throw new RuntimeException("GLError 0x" + Integer.toHexString(error)); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create our surface view and set it as the content of our // Activity mGLSurfaceView = new GLSurfaceView(this); mGLSurfaceView.setRenderer(new Renderer()); setContentView(mGLSurfaceView); } @Override protected void onResume() { // Ideally a game should implement onResume() and onPause() // to take appropriate action when the activity looses focus super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { // Ideally a game should implement onResume() and onPause() // to take appropriate action when the activity looses focus super.onPause(); mGLSurfaceView.onPause(); } }
发表评论
-
图片处理
2012-11-28 02:48 0http://www.linuxidc.com/Linux/2 ... -
Api Demo - .graphics(24)>>Cube
2012-08-03 15:18 1226package com.example.android.api ... -
Api Demo - .graphics(24)>>TouchRotateActivity
2012-08-03 15:07 1111package com.example.android.api ... -
opengles 学习关键字
2012-07-24 09:35 671主动渲染、平面着色、透视投影、near、索引法、glLight ... -
Api Demo - .graphics(21)>>StaticTriangleRenderer
2012-07-23 17:51 1265package com.example.android.api ... -
Api Demo - .graphics(20)>>CompressedTextureActivity
2012-07-23 16:50 1387/* * Copyright (C) 2008 The A ... -
Api Demo - .graphics(19)
2012-07-20 22:45 750package com.example.android.api ... -
Api Demo - .graphics(18)
2012-07-20 10:32 838package com.example.android.api ... -
Api Demo - .graphics(17)
2012-07-19 11:43 955/* package com.example.andro ... -
Api Demo - .graphics(16)
2012-07-18 14:54 626package com.example.android.api ... -
Api Demo - .graphics(15)
2012-07-18 12:55 841package com.example.android.api ... -
Api Demo - .graphics(14)
2012-07-18 11:50 840package com.example.android.api ... -
Api Demo - .graphics(13)
2012-07-17 11:38 921//关键字 Paint,MaskFilte,Path,Xfer ... -
Api Demo - .graphics(12)
2012-07-17 10:44 677<?xml version="1.0" ... -
Api Demo - .graphics(11)
2012-07-17 09:53 803//关键字:Shader ,ShapeDrawable pa ... -
Api Demo - .graphics(10)
2012-07-16 17:59 1063/* * Copyright (C) 2008 The A ... -
Api Demo - .graphics(9)
2012-07-16 11:26 771//关键字:颜色合成,JPEG,PNG图片解压,Bitmap压 ... -
Api Demo - .graphics(8)
2012-07-16 10:43 668//关键字:ColorMatrixColorFilter; ... -
Api Demo - .graphics(7)
2012-07-16 09:53 795// 关键字:Porter-Duff package c ... -
Api Demo - .graphics(6)
2012-07-16 08:57 789//关键字:截取画布 p ...
相关推荐
返回json数组的科技头条的api数据jar包
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.7</jdk.version> <spring.version>4.0.1.RELEASE</spring.version> <spring-data-jpa.version>1.6.2.RELEASE</spring-...
- Camera Window >>DEMO - Cinematics >>DEMO - Content Fitter >>DEMO - Forward Focus >>DEMO - Geometry Boundaries - Limit Distance >>DEMO - Limit Speed >>DEMO - Numeric Boundaries >>DEMO - Pan ...
JavaScript人脸识别库Face-api.js的示例,无需安装nodejs,iis本地直接看效果。注意调用摄像头不能用IP访问,只能localhost,远程预览需要HTTPS;iis无扩展名文件若出现404,需在mime类型中添加扩展名【.】类型...
Api-dawn-api-demo.zip,道恩API解调API,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程。
"Face-Detection-JavaScript-demo"和"Face-Detection-JavaScript-master"可能是两个示例项目,它们演示了如何在实际项目中应用face-api.js。通过阅读源代码和运行这些示例,你将更好地理解如何整合face-api.js到你的...
本资源包含海康威视的Web开发控件及其示例(demo),旨在帮助开发者快速集成并实现监控画面在网页上的展示和操作。 1. **海康IE控件**:海康威视的Web开发控件主要针对Internet Explorer浏览器设计,用于在网页上...
根据atmel官方例程sam3x_ek_bertos_http_demo,自己...在keil->Project->Manage->Components,Environment,Books...->Folders/Externsions的 Use GCC的GNU-Tool Folder中指定arm-2012.03-56-arm-none-eabi.exe的安装目录
Api-demo.zip,API平台的演示应用程序框架API平台演示,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程。
<description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot...
这是很据android-serialport-api 自己简化的一个demo ,可以使用。原来android-serial-api的程序很多人反映都不能使用,所以自己写了这个,只有一个activity,可以做为你的学习参考。
<div class="demo-description"> <p>The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a ...
此工程集成了nexus私服,配合我的“nexus搭建和基于spring boot2.x的配置,centos7"博客,可以使用spring boot集成nexus
mybatis-3.2.7.jar source code API configuration.xml settings defaultStatementTimeout 的设置 MyBatisDemo 常用例子 使用3种方法,编写mapper,操作数据库
open-api-sdk-2.0和jackson,京东宙斯开发jar包,宙斯API包,本人开发使用,open-api-sdk-2.0.jar,jackson-core-asl-1.9.8.jar,jackson-mapper-asl-1.9.8.jar,需要朋友可自行下载
标题中的"API-Demo.rar_DEMO_epon_olt"表明这是一个关于EPON(以太网无源光网络)OLT(光线路终端)的API演示示例。这个压缩包可能包含了用于展示如何与PAS5001N OLT设备进行交互的API代码或文档。 描述中的"PMC-...
在压缩包内的文件"API-Demo-v1.0.6",很可能是一个包含源代码、编译后的可执行文件、库文件、或者相关配置文件的文件夹。这个版本号"v1.0.6"表示这是该API-Demo的第六个版本,说明项目已经经过了多次迭代和改进。 ...
《支付宝小程序API-Demo深度解析》 支付宝小程序作为阿里巴巴生态系统的一部分,为开发者提供了一种便捷的构建轻量级应用的方式。API-Demo.zip文件包含了支付宝小程序的官方示例代码,旨在帮助开发者更好地理解和...
MapReduce Java API实例-统计单次出现频率示例代码-MapReduceDemo.rar MapReduce Java API实例-统计单次出现频率示例代码-MapReduceDemo.rar MapReduce Java API实例-统计单次出现频率示例代码-MapReduceDemo.rar
nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'error_view' of bean class [com.demo.controller.action.AuthorAction]: Bean property 'error_view' is not ...