2012-02-19 2 views
1

Я кодирую на платформе Android. Я пытаюсь использовать текстуру (загрузить образ из папки «Активы») для треугольника. Когда мое приложение запускается, оно просто пустое в треугольнике (не текстура, что я хочу).OpenGL ES: Использование текстуры: Пустое белое вместо текстуры Изображение

Я прочитал некоторый другой источник, который говорит, что изображение должно быть мощью двух. И я проверил, мой образ - сила двух. (128 x 128). Это причина, из-за которой у меня головная боль.

Вот мой код: (основной код, который вы должны увидеть в методе Он содержит код, который я использую для визуализации)

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; 
import android.util.Log; 

public class TextureTriangleTest extends Activity{ 

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

    @Override 
    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assets = 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, 0.0f, 1.0f, 
            319.0f, 0.0f, 1.0f, 1.0f, 
            160.0f, 479.0f, 0.5f, 0.0f }); 
     vertices.flip(); 

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

    } 



    class Render implements Renderer{ 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      try { 

       Bitmap bitmap = BitmapFactory.decodeStream(assets.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) { 
       Log.d("", "FAILED LOAD FILE"); 
       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(0, 320, 0, 480, 1, -1); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_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 

     } 

    } 

} 

Мой код только простой пример. У меня есть отладка, и все верно. (например: успешно загружать изображение). Но я не знаю, как отлаживать приложение OpenGL. (Это означает: при отладке я могу просмотреть параметр переменной, но я не знаю, как это происходит, потому что OpenGL слишком сложна, чем Canvas, - что вы просто используете одну строку кода и имеет результат :))

спасибо за помощь :)

ответ

2

Ох. Я исправил целые мои решения, а ниже - мой полный код. Я отправил сюда, для которого попробовал прочитать мой длинный пост (^^) и нуждался в реальном решении :) Спасибо SteveL предложил мне :)

В моем решении у меня есть некоторые изменения: . Производительность: я добавляю текстуру кода чтения в onSurfaceCreate. секунд. Как говорит Стив. Я пропустил gl.glEnable, и я снова сбросил gl.glBindTexture.

Думает снова, я вижу, что эти ошибки действительно глупы. Просто потому, что я новичок из OpenGL :(

package com.test; 

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.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 
import android.os.Bundle; 

public class ColorTriangleTest extends Activity{ 

    GLSurfaceView glView; 
    ByteBuffer byteBuffer; 
    FloatBuffer vertices; 

    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 

     int VERTEX_SIZE = (2+4)*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, 1, 1, 0, 1, 
            160.0f, 479.0f, 1, 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) { 

      int VERTEX_SIZE = (2+4)*4; 

      gl.glViewport(0, 0, glView.getWidth(), glView.getHeight()); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
      gl.glOrthof(0, 320, 0, 480, 10, -10); 

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

      vertices.position(0); 
      gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices); 
      vertices.position(2); 
      gl.glColorPointer(4, 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 

     } 

    } 

} 
0

Oh. Я исправил свою проблему. Но я не могу объяснить, почему. (Я могу исправлять, потому что мне нравится какой-то учебник в Интернете).

Вот мой код. Я указал несколько строк, которые я изменил. Пожалуйста, скажите мне, почему это работает, пожалуйста:

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; 
import android.util.Log; 

public class TextureTriangleTest extends Activity{ 

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

    @Override 
    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     assets = 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, 0.0f, 1.0f, 
            319.0f, 0.0f, 1.0f, 1.0f, 
            160.0f, 479.0f, 0.5f, 0.0f }); 
     vertices.flip(); 

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

    } 



    class Render implements Renderer{ 

     @Override 
     public void onDrawFrame(GL10 gl) { 

      int a = 0; 
      try { 

       Bitmap bitmap = BitmapFactory.decodeStream(assets.open("bobrgb888.png")); 
       int textureIds[] = new int[1]; 
       gl.glGenTextures(1, textureIds, 0); 
       int textureId = textureIds[0]; 
       a= textureId; 

       gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); //this line 
       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); //and this line 

       bitmap.recycle(); 

      } catch (IOException e) { 
       Log.d("", "FAILED LOAD FILE"); 
       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(0, 320, 0, 480, 1, -1); 

      //Here two lines that I added. Two lines I have declared above in try_catch 
      //So, WHY I NEED TO DECLARE AGAIN ??!!! 
      gl.glEnable(GL10.GL_TEXTURE_2D); 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, a); 

      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_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 

     } 

    } 

} 

Это работает для меня сейчас :) Кто может объяснить, почему ?? !!

+2

Вы не использовали gl.glEnable (GL10.GL_TEXTURE_2D), на Try ... Catch плюс вы unbinded текстуру (на Try ... Catch) с gl.glBindTexture (GL10.GL_TEXTURE_2D, 0); – SteveL

+2

Почему вы загружаете текстуру на каждый кадр? Поместите часть on..try внутри onSurfaceCreated() – SteveL

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