[Java] android opengl-es 平面贴图 →→→→→进入此内容的聊天室

来自 , 2020-07-14, 写在 Java, 查看 168 次.
URL http://www.code666.cn/view/e46bc064
  1. package dqq.test.texture;
  2.  
  3.  
  4. import java.nio.ByteBuffer;
  5. import java.nio.FloatBuffer;
  6.  
  7.  
  8. import javax.microedition.khronos.egl.EGLConfig;
  9. import javax.microedition.khronos.opengles.GL10;
  10.  
  11.  
  12.  
  13.  
  14. import android.content.Context;
  15. import android.graphics.Bitmap;
  16. import android.graphics.BitmapFactory;
  17. import android.opengl.GLSurfaceView;
  18. import android.opengl.GLUtils;
  19.  
  20.  
  21.  
  22.  
  23. public class MyRenderer implements GLSurfaceView.Renderer{
  24.  
  25.  
  26.      
  27.     private float[] cubeVertices = {
  28.             -0.6f, -0.6f, 0.0f,
  29.             -0.6f, 0.6f,0.0f,
  30.             0.6f, 0.6f, 0.0f,
  31.             0.6f, 0.6f, 0.0f,
  32.             0.6f, -0.6f, 0.0f,
  33.             -0.6f, -0.6f, 0.0f,
  34.         };
  35.      
  36.     // 定义立方体所需要的6个面(一共是12个三角形所需的顶点)
  37.     private byte[] cubeFacets = { 0, 1, 2, 3, 4, 5,
  38.             };
  39.     // 定义纹理贴图的座标数据
  40.     private float[] cubeTextures = {
  41.             1.0000f, 1.0000f,
  42.             1.0000f, 0.0000f,
  43.             0.0000f, 0.0000f,
  44.             0.0000f, 0.0000f,
  45.             0.0000f, 1.0000f,
  46.             1.0000f, 1.0000f,
  47.              
  48. //          0.0f,0.0f,
  49. //          0.0f,1.0f,
  50. //          1.0f,1.0f,
  51. //          1.0f,1.0f,
  52. //          1.0f,0.0f,
  53. //          0.0f,0.0f,
  54.              
  55.         };
  56.  
  57.  
  58.     private Context context;
  59.     private FloatBuffer cubeVerticesBuffer;
  60.     private ByteBuffer cubeFacetsBuffer;
  61.     private FloatBuffer cubeTexturesBuffer;
  62.     // 定义本程序所使用的纹理
  63.     private int texture;
  64.      
  65.      
  66.     MyRenderer(Context main){
  67.          
  68.         this.context = main;
  69.         // 将立方体的顶点位置数据数组包装成FloatBuffer;
  70.         cubeVerticesBuffer = BufferUtil.floatToBuffer(cubeVertices);
  71.         // 将立方体的6个面(12个三角形)的数组包装成ByteBuffer
  72.         cubeFacetsBuffer = BufferUtil.byteToBuffer(cubeFacets);
  73.         // 将立方体的纹理贴图的座标数据包装成FloatBuffer
  74.         cubeTexturesBuffer = BufferUtil.floatToBuffer(cubeTextures);
  75.          
  76.         // 将立方体的顶点位置数据数组包装成FloatBuffer;
  77. //      cubeVerticesBuffer = FloatBuffer.wrap(cubeVertices);
  78. //      // 将立方体的6个面(12个三角形)的数组包装成ByteBuffer
  79. //      cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);
  80. //      // 将立方体的纹理贴图的座标数据包装成FloatBuffer
  81. //      cubeTexturesBuffer = FloatBuffer.wrap(cubeTextures);
  82.          
  83.          
  84.     }
  85.      
  86.      
  87.     @Override
  88.     public void onDrawFrame(GL10 gl) {
  89.         // 清除屏幕缓存和深度缓存
  90.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  91.         // 启用顶点座标数据
  92.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  93.         // 启用贴图座标数组数据
  94.         gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  95.         // 设置当前矩阵模式为模型视图。
  96.         gl.glMatrixMode(GL10.GL_MODELVIEW);
  97.         // --------------------绘制第一个图形---------------------
  98.         gl.glLoadIdentity();
  99.         // 把绘图中心移入屏幕2个单位
  100.         gl.glTranslatef(0f, 0.0f, -2.0f);
  101.         // 旋转图形
  102. //      gl.glRotatef(angley, 0, 1, 0);
  103. //      gl.glRotatef(anglex, 1, 0, 0);
  104.         // 设置顶点的位置数据
  105.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);
  106.         // 设置贴图的的座标数据
  107.         gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);
  108.         // 执行纹理贴图
  109.         gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
  110.         // 按cubeFacetsBuffer指定的面绘制三角形
  111.         gl.glDrawElements(GL10.GL_TRIANGLES, cubeFacetsBuffer.remaining(),
  112.             GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);
  113.         // 绘制结束
  114.         gl.glFinish();
  115.         // 禁用顶点、纹理座标数组
  116.         gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  117.         gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  118.     }
  119.  
  120.  
  121.     @Override
  122.     public void onSurfaceChanged(GL10 gl, int width, int height) {
  123.         // 设置3D视窗的大小及位置
  124.         gl.glViewport(0, 0, width, height);
  125.         // 将当前矩阵模式设为投影矩阵
  126.         gl.glMatrixMode(GL10.GL_PROJECTION);
  127.         // 初始化单位矩阵
  128.         gl.glLoadIdentity();
  129.         // 计算透视视窗的宽度、高度比
  130.         float ratio = (float) width / height;
  131.         // 调用此方法设置透视视窗的空间大小。
  132.         gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
  133.     }
  134.  
  135.  
  136.     @Override
  137.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  138.         // 关闭抗抖动
  139.         gl.glDisable(GL10.GL_DITHER);
  140.         // 设置系统对透视进行修正
  141.         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
  142.         gl.glClearColor(0, 0, 0, 0);
  143.         // 设置阴影平滑模式
  144.         gl.glShadeModel(GL10.GL_SMOOTH);
  145.         // 启用深度测试
  146.         gl.glEnable(GL10.GL_DEPTH_TEST);
  147.         // 设置深度测试的类型
  148.         gl.glDepthFunc(GL10.GL_LEQUAL);
  149.         // 启用2D纹理贴图
  150.         gl.glEnable(GL10.GL_TEXTURE_2D);
  151.         // 装载纹理
  152.         loadTexture(gl);
  153.     }
  154.      
  155.      
  156.     private void loadTexture(GL10 gl)
  157.     {
  158.         Bitmap bitmap = null;
  159.         try
  160.         {
  161.             // 加载位图
  162.             bitmap = BitmapFactory.decodeResource(context.getResources(),
  163.                 R.drawable.sand);
  164.             int[] textures = new int[1];
  165.             // 指定生成N个纹理(第一个参数指定生成1个纹理),
  166.             // textures数组将负责存储所有纹理的代号。
  167.             gl.glGenTextures(1, textures, 0);
  168.             // 获取textures纹理数组中的第一个纹理
  169.             texture = textures[0];
  170.             // 通知OpenGL将texture纹理绑定到GL10.GL_TEXTURE_2D目标中
  171.             gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
  172.             // 设置纹理被缩小(距离视点很远时被缩小)时候的滤波方式
  173.             gl.glTexParameterf(GL10.GL_TEXTURE_2D,
  174.                 GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
  175.             // 设置纹理被放大(距离视点很近时被方法)时候的滤波方式
  176.             gl.glTexParameterf(GL10.GL_TEXTURE_2D,
  177.                 GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
  178.             // 设置在横向、纵向上都是平铺纹理
  179.             gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
  180.                 GL10.GL_REPEAT);
  181.             gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
  182.                 GL10.GL_REPEAT);
  183.             // 加载位图生成纹理
  184.             GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);       }
  185.         finally
  186.         {
  187.             // 生成纹理之后,回收位图
  188.             if (bitmap != null)
  189.                 bitmap.recycle();
  190.         }
  191.     }
  192.      
  193.  
  194.  
  195. }
  196. //java/6814

回复 "android opengl-es 平面贴图"

这儿你可以回复上面这条便签

captcha