大家好。
今天在学习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);
}
}
相关推荐
本文将深入探讨如何在Android应用程序中使用OpenGL ES进行纹理贴图,这是构建复杂图形场景的关键技术。 纹理贴图是将图像数据(通常是一个二维数组)应用到3D模型表面的过程,使得模型表面具有丰富的视觉效果。在...
本主题将深入探讨如何在Android中利用OpenGL ES进行纹理贴图,特别是如何在一个正方体的六个面上应用不同的纹理图片。这个过程涉及到多个关键步骤和技术,包括纹理坐标、纹理单元、纹理对象的创建以及纹理映射等。 ...
首先:纹理坐标是这样规定的:左上(0,0),右上(1,0),左下(0,1),右下(1,1),中间(0.5,0.5)其他依次类推
在本文中,我们将深入探讨如何在Microsoft Foundation Class (MFC)框架下,使用Visual Studio 2010和OpenGL库来实现纹理贴图,并通过键盘控制物体运动,以创建一个三维魔方展示。MFC是Microsoft提供的一种C++类库,...
这个“Android代码-OpenGL3D立方体多纹理贴图源码.zip”文件显然包含了实现3D立方体并应用多纹理贴图的示例代码,对于学习Android平台上的3D图形编程非常有帮助。 1. **OpenGL基础知识**:在OpenGL中,图形是通过...
本篇文章将深入探讨OpenGL中的纹理以及如何在OpenGL中实现纹理贴图,特别关注BMP格式的图像。 首先,我们需要了解OpenGL纹理的基本概念。纹理是由像素数据组成的二维数组,这些数据可以是颜色、透明度或其他图像...
OpenGL纹理贴图是一种在3D图形编程中广泛使用的技术,用于在几何模型表面赋予颜色和细节,从而增强视觉效果。本实例结合PPT原理介绍,将深入探讨如何在OpenGL环境中实现纹理贴图,并理解其背后的理论。 纹理贴图是...
### MFC的OpenGL纹理贴图技术 #### 一、引言 在计算机图形学领域,纹理贴图(Texture Mapping)是一种广泛使用的图像处理技术,它能够显著提高三维模型的真实感和视觉效果。本文将深入探讨如何在Microsoft ...
在这个“OpenGL纹理贴图简单例子”中,我们将深入探讨如何使用OpenGL进行纹理贴图,这是一种将图像数据(纹理)映射到3D模型表面的技术,以增加视觉细节和真实感。 纹理贴图是OpenGL中的核心概念之一,它涉及到几个...
OpenGL纹理贴图是计算机图形学中的一个重要概念,用于在3D模型上添加视觉细节,使得渲染出来的图像更加逼真和丰富。在VC++6.0环境下,结合MFC(Microsoft Foundation Classes)框架来实现OpenGL纹理贴图,可以构建出...
在本"OpenGL纹理贴图详解源码"中,我们将深入探讨如何使用OpenGL进行纹理贴图、光照处理以及碰撞检测,这些是游戏开发和可视化应用中的核心概念。 纹理贴图是将图像数据应用到3D模型表面的技术,它为场景添加了细节...
在OpenGL中,纹理贴图是给3D模型增添细节和真实感的关键技术。本教程将深入探讨如何使用VA(Vertex Array)模式实现纹理贴图。 纹理贴图是指将2D图像(纹理)映射到3D模型表面,通过这种方式增加模型的视觉信息。在...
这个"Android OpenGL 3D 立方体多纹理贴图源码"是一个很好的学习资源,它涵盖了多个关键的OpenGL ES编程概念。 首先,3D立方体的渲染是OpenGL ES的基本应用之一,它展示了如何构建基本的几何形状。在3D空间中,一个...
本资源包主要关注的是OpenGL中的纹理贴图技术及其如何实现镂空效果,这在游戏开发、可视化应用和图形设计等领域至关重要。 纹理贴图是OpenGL中用于增强图形表面真实感的关键技术。它允许我们将二维图像(纹理)应用...
本示例程序是一个基础的OpenGL应用,主要展示了如何在四面体上实现纹理贴图,这对于初学者理解OpenGL纹理映射的概念非常有帮助。 纹理贴图是将二维图像(纹理)应用到三维模型表面的技术,它极大地增强了三维模型的...
在OpenGL中,纹理是指存储在内存中的图像数据,可以用于给3D模型贴图或者进行复杂的纹理映射。Android应用通常使用`Bitmap`对象来读取图片资源,然后将其转化为OpenGL纹理。这个过程涉及以下步骤: 1. 加载Bitmap:...
OPENGL纹理贴图正方体 可旋转,带纹理贴图,可自行更换贴图纹理
在这个名为“Android应用源码OpenGL 3D立方体多纹理贴图”的项目中,开发者将展示如何在Android应用中利用OpenGL ES实现3D立方体,并进行多纹理贴图。 首先,理解OpenGL ES的基本概念至关重要。OpenGL ES提供了一组...
“OpenGL纹理贴图”这个标签表明,这个程序可能还包括了如何在立方体的表面正确地贴图,确保纹理正确对齐且无扭曲。 “OpenGL纹理”和“opengl添加纹理”标签则强调了学习如何创建和应用纹理是OpenGL编程的基本技能...