2012-02-18 2 views
1

Я изучаю OpenGL ES. Когда я использую текстуру для треугольника, я встречаю ошибку. Вот мой код:Android - OpenGL ES: как текстурировать треугольник

package com.test; 

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

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

import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLUtils; 
import android.os.Bundle; 

public class TexttureTriangleTest extends Activity{ 

    GLSurfaceView glView; 
    ByteBuffer byteBuffer; 
    FloatBuffer vertices; 
    AssetManager assetManager; 

    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assetManager = getAssets(); 

     int VERTEX_SIZE = (2+2)*4; 
     byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     vertices = byteBuffer.asFloatBuffer(); 
     vertices.put(new float[] { 0.0f, 0.0f, 1, 0, 0, 1, 
            319.0f, 0.0f, 0, 1, 0, 1, 
            160.0f, 479.0f, 0, 0, 1, 1}); 
     vertices.flip(); 

     glView = new GLSurfaceView(this); 
     glView.setRenderer(new Render()); 
     setContentView(glView); 
    } 

    class Render implements Renderer{ 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      try { //I think error in this block of code 

       Bitmap bitmap = BitmapFactory.decodeStream(assetManager.open("bobrgb888.png")); 
       int textureIds[] = new int[1]; 
       gl.glGenTextures(1, textureIds, 0); 
       int textureId = textureIds[0]; 
       gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 
       GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
       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_NEAREST); 
       gl.glBindTexture(GL10.GL_TEXTURE_2D, 0); 
       bitmap.recycle(); 

      } catch (IOException e) { 
       throw new RuntimeException("couldn't load asset!"); 
      } 

      gl.glViewport(0, 0, glView.getWidth(), glView.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(340, 0, 420, 0, 0, 0); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 

      int VERTEX_SIZE = (2+2)*4; 
      vertices.position(0); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 
      vertices.position(2); 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 

      gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 




     } 

     @Override 
     public void onSurfaceChanged(GL10 gl, int width, int height) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
      // TODO Auto-generated method stub 

     } 

    } 

} 

Я думаю, что я встретил ошибку в функции и в блоке кода try-catch. Кто может проверить это для меня и научить меня, как исправить это, пожалуйста.

спасибо :)

ответ

1

Я не большой специалист в OpenGL, но, насколько я могу видеть, вот некоторые ошибки в коде йор. Сначала это неправильный размер для ByteBuffer

int VERTEX_SIZE = (2+2)*4; 
byteBuffer = ByteBuffer.allocateDirect(3*VERTEX_SIZE); 

Для вашего vertices массива вашей потребности 18 * 4 размера байта. 18 - число поплавков в vertices, а 4 - количество байтов для каждого поплавка в массиве.

Во-вторых, почему, по-вашему, ваша ошибка в try-catch? Ищите строку ошибки в журнале IDE. Отправьте его здесь, и мы увидим проблему. bobrgb888.png файл должен находиться в папке с ресурсами.

+2

Не могли бы вы объяснить более подробно почему '18'. Я думаю, что «2 + 2», потому что один для нормальной координаты, а другой для координаты текстуры. – hqt

+0

18 - это только размер 'vertices', но он не может помочь в вашей программе. Вам нужно прочитать любой учебник или пример о вершинах, вершинах текстур и граней в OpenGL. Что-то вроде этого [ссылка] http://obviam.net/index.php/opengl-es-android-displaying-graphical-elements-primitives/ [ссылка] – dimetil

+0

ссылка http://obviam.net/index.php/ OpenGL-ES-андроид-отображающее-графические-элементы-примитивы / – dimetil

Смежные вопросы