`
freedomray
  • 浏览: 33537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android opengl纹理贴图无法成功,请指教

 
阅读更多

大家好。

 

今天在学习opengl的,到了纹理贴图这里,按照“生成纹理 -> 绑定纹理 -> 画图”的步骤进行,发现几何图形可以画出来,但是纹理却死活没有出来。尝试了各种设置,都不行,不知道哪里出了问题。现在我把代码贴出来,希望有经验的朋友能给我一点指点。希望大家不吝赐教。

 

 

package com.gl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import test.opengl.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.opengl.GLUtils;
import android.opengl.GLSurfaceView.Renderer;


public class OpenGlRender implements Renderer {  
    private float z = -1;
    private float[] vertices = {
    		0, 0, z,
    		1, 0, z,
    		1, 1, z,
    		0, 1, z,
    		-1, 1, z,
    		-1, 0, z,
    		-1, -1, z,
    		0, -1, z,
    		1, -1, z
    };
    
    private float[] colors = {
    	1, 0, 0, 1, //r, g, b, a
    	0, 1, 0, 1,
    	0, 0, 1, 1,
    	1, 1, 0, 1
    };
    
    private float[] texCoor = {
    	0f, 0f,
    	1f, 0f,
    	0f, 1f,
    	1f, 1f
    };
    private FloatBuffer _clrBuffer;
    private ShortBuffer _indexBuffer;   
    private FloatBuffer _vertexBuffer;   
    private FloatBuffer _texBuffer;
    private int _nrOfVertices = 4;
    
    private int[] mTexIds = new int[2];
    private Bitmap mBm;

    private Context mCtx;

    OpenGlRender(Context ctx){
    	mCtx = ctx;
    }
    
    
    
    @Override  
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {   
        // TODO Auto-generated method stub   
           
    	gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   
    	gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    	gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    	gl.glEnable(GL10.GL_TEXTURE_2D);
    	
    	mBm = BitmapFactory.decodeResource(mCtx.getResources(), R.drawable.fig01_d);
    	updateBitmap(mBm);
    	gl.glGenTextures(1, mTexIds, 0);

    	gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexIds[0]);
    	gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    	gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_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, mBm, 0);
    	
    	
    	
    	mBm.recycle();
    	
        initTriangle();   
    }   
    
    
    private void updateBitmap(Bitmap src){
    	if(src == null)
    		return;
    	
    	int w = pow2(src.getWidth());
    	int h = pow2(src.getHeight());
    	Bitmap b = Bitmap.createBitmap(w, h, 
    			src.hasAlpha() ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
    	Canvas c = new Canvas(b);
    	c.drawBitmap(src, 0, 0, null);
    	src = b;
    }
    
    
    private int pow2(float val){
    	int x = (int) (Math.log(val) / Math.log(2));
    	
    	if((1 << x) >= val)
    		return 1 << x;
    	else
    		return 1 << (1 + x);
    }
    
    
    @Override  
    public void onSurfaceChanged(GL10 gl, int width, int height) {   
        gl.glViewport(0, 0, width, height);   
    }   
    
    private float angle = 0;
    
    @Override  
    public void onDrawFrame(GL10 gl) {  
    	gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   
    	gl.glClearColor(0, 0, 1.0f, 1.0f);   
        gl.glColor4f(1f, 0f, 0f, 1f);   
         
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _texBuffer);
        
        //size: number of coordinates per vertex;
	    //stride: offset between 2 consecutive vertices;
	    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
	    //gl.glColorPointer(4, GL10.GL_FLOAT, 0, _clrBuffer);
	    //gl.glDrawElements(GL10.GL_TRIANGLE_FAN, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);   
	    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, _nrOfVertices);
	    

	    angle++;
    }   
    
    
    private void initTriangle() {   
        // float has 4 bytes   
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);   
        vbb.order(ByteOrder.nativeOrder());   
        _vertexBuffer = vbb.asFloatBuffer();
        _vertexBuffer.put(vertices);
        _vertexBuffer.position(0);
           
        // short has 4 bytes   
        ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);   
        ibb.order(ByteOrder.nativeOrder());   
        _indexBuffer = ibb.asShortBuffer();   
        for(short i = 0; i < _nrOfVertices; i++){
        	_indexBuffer.put(i, i);
        }
        _indexBuffer.position(0);   
        
        
        ByteBuffer clr= ByteBuffer.allocateDirect(colors.length * 4);
        clr.order(ByteOrder.nativeOrder());
        _clrBuffer = clr.asFloatBuffer();
        _clrBuffer.put(colors);
        _clrBuffer.position(0);
        
        
        ByteBuffer tex = ByteBuffer.allocate(texCoor.length * 4);
        tex.order(ByteOrder.nativeOrder());
        _texBuffer = tex.asFloatBuffer();
        _texBuffer.put(texCoor);
        _texBuffer.position(0);
    }   

} 


 


 

 

  • 大小: 2.2 KB
分享到:
评论
3 楼 coohcooh 2011-12-09  
楼上是用哪个SDK开发这个的?2.2吗?我用2.2但是无法运行楼主的代码呢,刚学android,请指教下,谢谢啦
2 楼 freedomray 2011-10-18  
进一步发现,其实并非不可使用FloatBuffer作为纹理坐标,只是在分配内存时有点隐蔽的错误:
ByteBuffer tex = ByteBuffer.allocate(texCoor.length * 4);  


这个地方,其实应该使用:
ByteBuffer tex = ByteBuffer.allocateDirect(texCoor.length * 4);  
1 楼 freedomray 2011-10-18  
发现了错误所在。

原来纹理数组需要用整数,而不能用float。
应该定义为:

int one = 0x10000;
private IntBuffer texIntCoor = IntBuffer.wrap(new int[]{
    		//0, 0, one, 0, 0, one, one, one,
    		0, one, one, one, 0, 0, one, 0, 
    });



在应用纹理的时候,需要使用GL_FIXED类型:
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texIntCoor);

相关推荐

    Android OpenGL 纹理贴图

    本文将深入探讨如何在Android应用程序中使用OpenGL ES进行纹理贴图,这是构建复杂图形场景的关键技术。 纹理贴图是将图像数据(通常是一个二维数组)应用到3D模型表面的过程,使得模型表面具有丰富的视觉效果。在...

    android opengl 纹理贴图

    本主题将深入探讨如何在Android中利用OpenGL ES进行纹理贴图,特别是如何在一个正方体的六个面上应用不同的纹理图片。这个过程涉及到多个关键步骤和技术,包括纹理坐标、纹理单元、纹理对象的创建以及纹理映射等。 ...

    android opengl 纹理贴图笔记

    首先:纹理坐标是这样规定的:左上(0,0),右上(1,0),左下(0,1),右下(1,1),中间(0.5,0.5)其他依次类推

    MFC下实现OpenGL纹理贴图

    在本文中,我们将深入探讨如何在Microsoft Foundation Class (MFC)框架下,使用Visual Studio 2010和OpenGL库来实现纹理贴图,并通过键盘控制物体运动,以创建一个三维魔方展示。MFC是Microsoft提供的一种C++类库,...

    Android代码-OpenGL3D立方体多纹理贴图源码.zip

    这个“Android代码-OpenGL3D立方体多纹理贴图源码.zip”文件显然包含了实现3D立方体并应用多纹理贴图的示例代码,对于学习Android平台上的3D图形编程非常有帮助。 1. **OpenGL基础知识**:在OpenGL中,图形是通过...

    OPENGL_TEXTURE.zip_OPENGL 纹理_Opengl纹理_opengl 贴图_opengl贴图_贴图

    本篇文章将深入探讨OpenGL中的纹理以及如何在OpenGL中实现纹理贴图,特别关注BMP格式的图像。 首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像...

    OpenGL纹理贴图的实例+PPT原理介绍

    OpenGL纹理贴图是一种在3D图形编程中广泛使用的技术,用于在几何模型表面赋予颜色和细节,从而增强视觉效果。本实例结合PPT原理介绍,将深入探讨如何在OpenGL环境中实现纹理贴图,并理解其背后的理论。 纹理贴图是...

    MFC的OpenGL纹理贴图技术

    ### MFC的OpenGL纹理贴图技术 #### 一、引言 在计算机图形学领域,纹理贴图(Texture Mapping)是一种广泛使用的图像处理技术,它能够显著提高三维模型的真实感和视觉效果。本文将深入探讨如何在Microsoft ...

    OpenGL纹理贴图简单例子.zip_OPENGL 纹理_opengl纹理贴图_opengl贴图_纹理贴图_贴图

    在这个“OpenGL纹理贴图简单例子”中,我们将深入探讨如何使用OpenGL进行纹理贴图,这是一种将图像数据(纹理)映射到3D模型表面的技术,以增加视觉细节和真实感。 纹理贴图是OpenGL中的核心概念之一,它涉及到几个...

    opengl纹理贴图

    OpenGL纹理贴图是计算机图形学中的一个重要概念,用于在3D模型上添加视觉细节,使得渲染出来的图像更加逼真和丰富。在VC++6.0环境下,结合MFC(Microsoft Foundation Classes)框架来实现OpenGL纹理贴图,可以构建出...

    Opengl纹理贴图详解源码

    在本"OpenGL纹理贴图详解源码"中,我们将深入探讨如何使用OpenGL进行纹理贴图、光照处理以及碰撞检测,这些是游戏开发和可视化应用中的核心概念。 纹理贴图是将图像数据应用到3D模型表面的技术,它为场景添加了细节...

    opengl纹理贴图源码

    在OpenGL中,纹理贴图是给3D模型增添细节和真实感的关键技术。本教程将深入探讨如何使用VA(Vertex Array)模式实现纹理贴图。 纹理贴图是指将2D图像(纹理)映射到3D模型表面,通过这种方式增加模型的视觉信息。在...

    Android OpenGL 3D 立方体多纹理贴图源码

    这个"Android OpenGL 3D 立方体多纹理贴图源码"是一个很好的学习资源,它涵盖了多个关键的OpenGL ES编程概念。 首先,3D立方体的渲染是OpenGL ES的基本应用之一,它展示了如何构建基本的几何形状。在3D空间中,一个...

    OpenGL.rar_OPENGL 纹理_opengl_opengl 纹理贴图_opengl纹理贴图_镂空效果

    本资源包主要关注的是OpenGL中的纹理贴图技术及其如何实现镂空效果,这在游戏开发、可视化应用和图形设计等领域至关重要。 纹理贴图是OpenGL中用于增强图形表面真实感的关键技术。它允许我们将二维图像(纹理)应用...

    opengl纹理贴图例子

    本示例程序是一个基础的OpenGL应用,主要展示了如何在四面体上实现纹理贴图,这对于初学者理解OpenGL纹理映射的概念非常有帮助。 纹理贴图是将二维图像(纹理)应用到三维模型表面的技术,它极大地增强了三维模型的...

    Android OpenGL纹理的编程框架

    在OpenGL中,纹理是指存储在内存中的图像数据,可以用于给3D模型贴图或者进行复杂的纹理映射。Android应用通常使用`Bitmap`对象来读取图片资源,然后将其转化为OpenGL纹理。这个过程涉及以下步骤: 1. 加载Bitmap:...

    OPENGL纹理贴图正方体

    OPENGL纹理贴图正方体 可旋转,带纹理贴图,可自行更换贴图纹理

    Android应用源码OpenGL 3D立方体多纹理贴图-IT计算机-毕业设计.zip

    在这个名为“Android应用源码OpenGL 3D立方体多纹理贴图”的项目中,开发者将展示如何在Android应用中利用OpenGL ES实现3D立方体,并进行多纹理贴图。 首先,理解OpenGL ES的基本概念至关重要。OpenGL ES提供了一组...

    OpenGL.rar_OPENGL 纹理_Opengl纹理_opengl添加纹理_opengl纹理贴图

    “OpenGL纹理贴图”这个标签表明,这个程序可能还包括了如何在立方体的表面正确地贴图,确保纹理正确对齐且无扭曲。 “OpenGL纹理”和“opengl添加纹理”标签则强调了学习如何创建和应用纹理是OpenGL编程的基本技能...

Global site tag (gtag.js) - Google Analytics