Galaxy S上的OpenGL问题

时间:2012-03-21 15:54:57

标签: android opengl-es textures galaxy

我一直在努力为自己建立一个小游戏框架,为Android编写一些基本游戏。我一直在测试索尼Arc和Galaxy SII没有任何问题,但最近我有人用Galaxy S为我做了一些测试,结果很糟糕。

首次运行我没有将我的图像大小设置为2或平方的幂,因此大多数GUI只是大白框。因此,我将所有图像的大小调整为2和平方的力量,以消除那里的任何问题,并修复了一些图像,但我发现一些对象仍显示为白色纹理。我可以告诉它在适当的位置绘图,因为我可以看到白框在游戏中旋转和移动。

我认为这可能是32位图像的问题,所以我把所有图像都缩小到8位,结果是一样的,只有大约一半的纹理似乎正在工作。我还看到某个地方提到了drawable-nodpi文件夹,所以我将所有图片从其他文件夹中移出并放在那里试试(结果相同)

我一直在看这个教程,这是我用来基于我的绘图代码 http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

但是我添加或更改的内容必须搞砸了,我已经将代码包含在下面,对于我错过或做错了的任何人都有什么跳出来的吗?

这是我创建渲染器的地方

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{        
    gl.glEnable(GL10.GL_TEXTURE_2D);            //Enable Texture Mapping
    gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //Black Background
    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do
    //Really Nice Perspective Calculations
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    // for transparency     
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
}

这是我加载纹理的地方

public void loadGLTexture(GL10 gl, Context context, int resourceId) 
{
    // loading texture
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),    resourceId);

    mImageWidth = bitmap.getWidth();
    mImageHeight = bitmap.getHeight();

    // generate one texture pointer
    gl.glGenTextures(1, textures, 0);
    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // create nearest filtered texture
    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_LINEAR);

    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);//i added
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);//i added


    // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    // Clean up
    bitmap.recycle();
}

这就是我画画的地方

public void draw(GL10 gl, float x, float y, float z, float angle, float percentageScale) {
    gl.glPushMatrix();              
    gl.glLoadIdentity();

    gl.glTranslatef(x,y,z);                            

    gl.glScalef(mXScale*percentageScale, mYScale*percentageScale, 1);

    gl.glRotatef(angle, 0, 0, 1);

    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // Point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    // Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    // Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glPopMatrix();
}

我有一个基类(称为纹理)为我的所有精灵做绘图,但由于某些原因,其中一些似乎永远不会被Galaxy S绘制,我最终会得到白盒子。< / p>

有什么想法吗?

关于更好的方法的PS建议当然是受欢迎的,我将是第一个承认我是OpenGL的新手

0 个答案:

没有答案