日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL ES实现三棱锥纹理贴图

發布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL ES实现三棱锥纹理贴图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是老師布置的課后作業,閑來無事分享出來,也加深一遍自己的印象~

自己定義一個MyRenderer.java類:

package com.example.shiyan3_2;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLUtils;import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;public class MyRenderer implements Renderer {// 定義三棱椎的4個頂點float[] taperVertices = new float[] {0.0f, 0.5f, 0.0f,-0.5f, -0.5f, -0.2f,0.5f, -0.5f, -0.2f,0.0f, -0.2f, 0.2f};// 定義三棱椎的4個三角面(沒有使用)private byte[] taperFacets = new byte[]{0, 1, 2, // 0、1、2三個頂點組成一個面0, 1, 3, // 0、1、3三個頂點組成一個面1, 2, 3, // 1、2、3三個頂點組成一個面0, 2, 3 // 0、2、3三個頂點組成一個面};//定義紋理貼圖的坐標數據private float[] taperTextures = {1.0000f,1.0000f,1.0000f,0.0000f,0.0000f,0.0000f,0.0000f,1.0000f};// 分別定義三棱椎的4個三角面ByteBuffer i1=ByteBuffer.wrap(new byte[]{0,1,2,});ByteBuffer i2=ByteBuffer.wrap(new byte[]{0,1,3,});ByteBuffer i3=ByteBuffer.wrap(new byte[]{1,2,3});ByteBuffer i4=ByteBuffer.wrap(new byte[]{0,2,3,});Context context;// 定義Open GL ES繪制所需要的Buffer對象FloatBuffer taperVerticesBuffer;//IntBuffer taperColorsBuffer;ByteBuffer taperFacetsBuffer;FloatBuffer taperTexturesBuffer;// 控制旋轉的角度private float rotate;//定義本程序所使用的紋理private int texture;public MyRenderer(Context main){this.context = main;// 將三棱椎的頂點位置數據數組包裝成FloatBuffertaperVerticesBuffer = floatBufferUtil(taperVertices);// 將三棱椎的4個面的數組包裝成ByteBuffertaperFacetsBuffer = ByteBuffer.wrap(taperFacets);//將立方體的紋理貼圖的坐標數據包裝成FLoatBuffertaperTexturesBuffer = floatBufferUtil(taperTextures);}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config){// 關閉抗抖動gl.glDisable(GL10.GL_DITHER);// 設置系統對透視進行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);gl.glClearColor(0, 0, 0, 0);// 設置陰影平滑模式gl.glShadeModel(GL10.GL_SMOOTH);// 啟用深度測試gl.glEnable(GL10.GL_DEPTH_TEST);// 設置深度測試的類型gl.glDepthFunc(GL10.GL_LEQUAL);//啟用2D紋理貼圖gl.glEnable(GL10.GL_TEXTURE_2D);//裝載紋理loadTexture(gl);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height){// 設置3D視窗的大小及位置gl.glViewport(0, 0, width, height);// 將當前矩陣模式設為投影矩陣gl.glMatrixMode(GL10.GL_PROJECTION);// 初始化單位矩陣gl.glLoadIdentity();// 計算透視視窗的寬度、高度比float ratio = (float) width / height;// 調用此方法設置透視視窗的空間大小。gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);}// 繪制圖形的方法int[] tex_id = new int[4];@Overridepublic void onDrawFrame(GL10 gl){// 清除屏幕緩存和深度緩存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 啟用頂點坐標數據gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//啟用貼圖坐標數組數據gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // ①// 設置當前矩陣模式為模型視圖。gl.glMatrixMode(GL10.GL_MODELVIEW);// --------------------繪制圖形---------------------// 重置當前的模型視圖矩陣gl.glLoadIdentity();gl.glTranslatef(0.0f, 0.0f, -1.5f);// 沿著Y軸旋轉gl.glRotatef(rotate, 0f, 0.2f, 0f);// 設置頂點的位置數據gl.glVertexPointer(3, GL10.GL_FLOAT, 0, taperVerticesBuffer);//設置貼圖的坐標數據gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, taperTexturesBuffer); // ②//執行紋理貼圖gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[0]); // ③// 按taperFacetsBuffer指定的面繪制三角形gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, i1.remaining(),GL10.GL_UNSIGNED_BYTE, i1);gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[1]); // ③// 按taperFacetsBuffer指定的面繪制三角形gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, i2.remaining(),GL10.GL_UNSIGNED_BYTE, i2);gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[2]); // ③// 按taperFacetsBuffer指定的面繪制三角形gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, i3.remaining(),GL10.GL_UNSIGNED_BYTE, i3);gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[3]); // ③// 按taperFacetsBuffer指定的面繪制三角形gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, i4.remaining(),GL10.GL_UNSIGNED_BYTE, i4);// 繪制結束gl.glFinish();//禁用頂點、紋理坐標數組gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 旋轉角度增加1rotate+=1;}private void loadTexture(GL10 gl){// 加載位圖Bitmap[] bm = new Bitmap[4];bm[0]=BitmapFactory.decodeResource(context.getResources(),R.drawable.img1);bm[1]=BitmapFactory.decodeResource(context.getResources(),R.drawable.img2);bm[2]=BitmapFactory.decodeResource(context.getResources(),R.drawable.img3);bm[3]=BitmapFactory.decodeResource(context.getResources(),R.drawable.img4);try{int[] textures = new int[1];// 指定生成N個紋理(第一個參數指定生成一個紋理)// textures數組將負責存儲所有紋理的代號IntBuffer textureBuffer = IntBuffer.allocate(4);gl.glGenTextures(4,textureBuffer);tex_id = textureBuffer.array();for(int i=0;i<4;i++){// 獲取textures紋理數組中的第一個紋理//texture = textures[i];// 通知OpenGL將texture紋理綁定到GL10.GL_TEXTURE_2D目標中gl.glBindTexture(GL10.GL_TEXTURE_2D, tex_id[i]);//gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);// 設置紋理被縮小(距離視點很遠時被縮小)時的濾波方式gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);// 設置紋理被放大(距離視點很近時被方法)時的濾波方式gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);// 設置在橫向、縱向上都是平鋪紋理gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);// 加載位圖生成紋理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bm[i], 0);if (bm[i] != null)bm[i].recycle();}}finally {//生成紋理之后,回收位圖}}// 定義一個工具方法,將float[]數組轉換為OpenGL ES所需的FloatBufferprivate FloatBuffer floatBufferUtil(float[] arr){FloatBuffer mBuffer;// 初始化ByteBuffer,長度為arr數組的長度*4,因為一個int占4個字節ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);// 數組排列用nativeOrderqbb.order(ByteOrder.nativeOrder());mBuffer = qbb.asFloatBuffer();mBuffer.put(arr);mBuffer.position(0);return mBuffer;} }

接下來是MainActivity.java:

package com.example.shiyan3_2;import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 創建一個GLSurfaceView,用于顯示OpenGL繪制的圖形GLSurfaceView glView = new GLSurfaceView(this);// 創建GLSurfaceView的內容繪制器MyRenderer myRender = new MyRenderer(this);// 為GLSurfaceView設置繪制器glView.setRenderer(myRender);setContentView(glView);} }

記得加入紋理貼圖,這里圖片的格式是256x256的:

最后展示一下運行結果:

? ? ??

? ?

總結

以上是生活随笔為你收集整理的OpenGL ES实现三棱锥纹理贴图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品在线视频一区二区 | 婷婷久久久久 | 成人做爰66片免费看网站 | 日韩精品一区二区在线播放 | 国产毛片儿| h在线播放 | 欧美黄色大全 | 中文字幕在线视频免费观看 | 揉我啊嗯~喷水了h视频 | 午夜啪视频 | 黄色片国产 | 在线免费观看成人 | 精品在线视频播放 | a在线观看视频 | 人妻互换一区二区激情偷拍 | 国产视频一区在线 | 一区二区三区免费观看视频 | 色综合一区二区三区 | 日韩激情国产 | 国产精品综合视频 | 婷婷伊人综合 | 一区二区三区高清不卡 | 9l视频自拍九色9l视频 | 麻豆偷拍| 福利视频大全 | 亚洲两性视频 | 国产精品老熟女一区二区 | 中文字幕一区二区三区日韩精品 | 69av视频在线观看 | 熟妇熟女乱妇乱女网站 | 成人激情四射 | 九一毛片| 最新日韩在线 | 综合久久五月 | 韩国精品一区二区 | 久久国产一区 | 一级片视频网站 | 国产av日韩一区二区三区精品 | 69精品久久久久久 | 久久久综合精品 | 91免费国产视频 | 亚洲精品久久久久久国 | 日日夜夜精品视频免费 | 亚洲精品在线视频 | 人妻饥渴偷公乱中文字幕 | 精品一区电影 | 一级黄色特级片 | 美女在线不卡 | 呦呦色| 午夜视频精品 | 日韩国产精品视频 | 手机看片1024欧美 | 超碰97干| 国产成人免费视频网站 | 国产69精品麻豆 | 黄色av日韩 | 91视频在线| 国产午夜免费福利 | 欧美激情精品久久久久久 | 色婷婷狠狠 | 青青草视频播放 | 三级网站视频 | 无码人妻一区二区三区av | kk视频在线观看 | yy1111111| 91超碰免费 | 久青草视频 | 欧美一区二区三区在线免费观看 | av青青| 亚洲一区综合 | 男女做激情爱呻吟口述全过程 | 日本久色| 日韩精品第一页 | 欧美一区二区三区在线播放 | 拔擦8x成人一区二区三区 | 日本美女黄色 | 午夜天堂 | 亚洲国产一区二区三区a毛片 | 日韩精品在线第一页 | 国产精品伦理 | 国产av日韩一区二区三区精品 | 中文不卡av | 桃谷绘里香在线观看 | 色噜噜狠狠狠综合曰曰曰88av | 久久一本综合 | 一级黄色片免费看 | 国产精品无码久久久久成人app | 99伊人网| 国产制服丝袜在线 | 精品欧美一区二区精品久久 | 欧美日韩国产电影 | 大肉大捧一进一出好爽视频 | 日韩中文字幕精品 | 国产嫩草在线观看 | 小婕子伦流澡到高潮h | 性色av蜜臀av | 国产免费一区二区三区免费视频 | 国产精品一区二区在线免费观看 | 中文字幕a级片 |