2012-07-20 116 views
1

我开始使用OpenGL-ES为Android编写游戏,并完成了使用glDrawTexfOES扩展的绘制代码。当我在模拟器上测试它时,它工作正常,但是在我的Samsung Galaxy S2上测试它,似乎所有的纹理都被绘制成白色。Android绘制纹理扩展绘制白色纹理

为了确保我没有犯任何错误,我从教程中复制了源代码并使用相同的结果运行它。我正在使用的教程代码可以看到here

我的纹理是.PNG格式和两个幂,我从R.drawable文件夹中加载,尽管我已经尝试了一些其他位置,例如drawable-nodpi,正如我所看到的那样。

我也检查了我读过的glGenTextures的结果可以给某些手机的奇数值,但似乎给出了正确的值(1,2,3 ..)。

有人知道为什么会发生这种情况,或者建议我可以做一些其他检查来弄清楚什么是错的?

这是我上面链接的示例代码的一个稍作修改的版本,以保持简单。

public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { 

    gl10.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    // Set the background colour to black (rgba). 
    gl10.glClearColor(0.0f, 0.0f, 0.0f, 1); 
    // Enable Flat Shading. 
    gl10.glShadeModel(GL10.GL_FLAT); 
    // We don't need to worry about depth testing! 
    gl10.glDisable(GL10.GL_DEPTH_TEST); 
    // Set OpenGL to optimise for 2D Textures 
    gl10.glEnable(GL10.GL_TEXTURE_2D); 
    // Disable 3D specific features. 
    gl10.glDisable(GL10.GL_DITHER); 
    gl10.glDisable(GL10.GL_LIGHTING); 

    gl10.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 
    // Initial clear of the screen. 
    gl10.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Test for draw texture 

    // Test for device specific extensions 
    String extensions = gl10.glGetString(GL10.GL_EXTENSIONS); 
    boolean drawTexture = extensions.contains("draw_texture"); 
    Log.i("OpenGL Support - ver.:", 
      gl10.glGetString(GL10.GL_VERSION) + " renderer:" + 
      gl10.glGetString(GL10.GL_RENDERER) + " : " + 
      (drawTexture ? "good to go!" : "forget it!!")); 

    // LOAD TEXTURE 

    mTextureName = new int[1]; 

    // Generate Texture ID 
    gl10.glGenTextures(1, mTextureName, 0); 
    assert gl10.glGetError() == GL10.GL_NO_ERROR; 

    // Bind texture id/target (we want 2D of course) 
    gl10.glBindTexture(GL10.GL_TEXTURE_2D, mTextureName[0]); 

    // Open and input stream and read the image 
    InputStream is = mContext.getResources().openRawResource(R.drawable.asteroid); 
    Bitmap bitmap; 
    try { 
     bitmap = BitmapFactory.decodeStream(is); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    // Build our crop region to be the size of the bitmap (ie full image) 
    mCrop = new int[4]; 
    mCrop[0] = 0; 
    mCrop[1] = imageHeight = bitmap.getHeight(); 
    mCrop[2] = imageWidth = bitmap.getWidth(); 
    mCrop[3] = -bitmap.getHeight(); 


    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
    assert gl10.glGetError() == GL10.GL_NO_ERROR; 

    bitmap.recycle(); 
} 

public void onSurfaceChanged(GL10 gl10, int i, int i1) { 

    gl10.glViewport(0, 0, i, i1); 
    /* 
    * Set our projection matrix. This doesn't have to be done each time we 
    * draw, but usually a new projection needs to be set when the viewport 
    * is resized. 
    */ 
    float ratio = (float) i/i1; 
    gl10.glMatrixMode(GL10.GL_PROJECTION); 
    gl10.glLoadIdentity(); 
    gl10.glFrustumf(-ratio, ratio, -1, 1, 1, 10); 
} 


public void onDrawFrame(GL10 gl) { 
    // Just clear the screen and depth buffer. 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Begin drawing 
    //-------------- 
    // These function calls can be experimented with for various effects such as transparency 
    // although certain functionality maybe device specific. 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 

    // Setup correct projection matrix 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0.0f, mWidth, 0.0f, mHeight, 0.0f, 1.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

    // Draw all Textures 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureName[0]); 
    ((GL11)gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCrop, 0); 
    ((GL11Ext)gl).glDrawTexfOES(0, 0, 0, imageWidth, imageHeight); 

    // Finish drawing 
    gl.glDisable(GL10.GL_BLEND); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glPopMatrix(); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glPopMatrix(); 
} 
+0

在银河上试过glGetError? – Tim 2012-07-20 18:42:38

+0

似乎没有引发任何错误,只是返回0(GL_NO_ERROR)我试过的任何地方。 – Greg 2012-07-21 07:59:02

回答

1

您是否试图将drawable-nodpi和其他地方的所有图像?

我不认为这可能很重要,但在附加渲染之前尝试这些行。

glSurfaceView.setZOrderOnTop(true); 
glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
glSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888); 

该错误可能与透明度和PNG格式有关。

如果它不起作用,您可以粘贴与GLSurfaceView和Renderer相关的代码吗?

谢谢!

+0

我已经尝试了只能在drawable-nodpi中显示图像,并且它会得到相同的结果。还添加了他们的线条,并没有改变。 我已经从上面的例子中添加了一个简单渲染类的代码,GLSurfaceView默认只是修改后的渲染器。 – Greg 2012-07-21 13:45:27

+0

代码似乎没问题。你可以在glTexParameteriv调用之前告诉我mCrop的4个值吗? 谢谢。 – charlypu 2012-07-21 14:02:16

+0

数值为[0,64,64,-64] 感谢您的帮助! – Greg 2012-07-21 18:39:37