2010-12-22 164 views
1

我目前有一個非常基本的活動。它創建一個GLSurfaceView並設置渲染器。問題是我看到的是紅色的,它來自glClearColor,沒有紋理。甚至不是白色的區域。另外glGetError()不報告任何內容。Android的OpenGL ES沒有繪製紋理

這裏是渲染:

public class MyRenderer implements Renderer { 

    public MyRenderer(Context context) 
    { 
     mContext = context; 
    } 

    public void onDrawFrame(GL10 gl) { 
     gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

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

     gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); 

     gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertex); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 

     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(-160.0f, 160.0f, -240.0f, 240.0f, 0.1f, 1.0f); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

     float vertexBuffer[] = { 
       -160.0f, -240.0f, 
       -160.0f, 240.0f, 
       160.0f, -240.0f, 
       160.0f, 240.0f 
     }; 

     vertex = ByteBuffer.allocateDirect(8 * 4).asFloatBuffer().put(vertexBuffer); 

     float texCoordsBuffer[] = { 
       0.0f, 0.0f, 
       0.0f, 480.0f/512.0f, 
       320.0f/512.0f, 0.0f, 
       320.0f/512.0f, 480.0f/512.0f 
     }; 

     texCoords = ByteBuffer.allocateDirect(8 * 4).asFloatBuffer().put(texCoordsBuffer); 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inDensity = 240; // needed so that the image will be 512x512 
     Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image, options); 
     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 

     Log.i(TAG, "Bitmap:{w:" + width + " h:" + height + "}"); 

     gl.glEnable(GL10.GL_TEXTURE_2D); 

     texture = new int[1]; 

     gl.glGenTextures(1, texture, 0); 

     gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); 

     gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

     bitmap.recycle(); 

     int error = gl.glGetError(); 
     if (error != GL10.GL_NO_ERROR) 
     { 
      Log.e(TAG, "GL Texture Load Error: " + error); 

     } 


    } 

    private Context mContext; 
    private int texture[]; 
    private FloatBuffer vertex; 
    private FloatBuffer texCoords; 
} 

回答

1

您的代碼有幾個問題:

您需要將緩衝區的字節順序設置爲本地:

vertex.order(ByteOrder.nativeOrder()) 

將數據複製到您的緩衝區後,位置重置爲0:

vertex.position(0) 

(做既爲texCoord以及)。

它可能也有助於將您的近剪裁平面在-1.0而不是.1(在glOrthof中)。

0

//因爲圖像不會是512×512

要具有的OpenGL渲染所需的紋理,紋理尺寸需要一個電源2,即64x64,128x32或256x1024

+0

512是2的冪。2^9 = 512 – NebulaFox 2010-12-22 20:58:36