2011-07-20 23 views
1

私の人生の間、OpenGL ESとJavaを使って簡単なスプライト描画を画面に表示できません。グラフィックスプログラミングは間違いなく私の弱点であり、OpenGLでの私のさびしさは、それほど助けにはならない。私はTexture&Quad Drawing間違ったAndroid OpenGL ES

は、私が試したどのような画面

にテクスチャクワッドをレンダリングするためにクワッドクラスを使用して何をしようとしている

私はglDrawTexfOES、すべてを使用していましたダンディーだった。しかし、いくつかの点検では、私はより堅牢なシステムを構築するために必要な翻訳と回転を使用することができないことを認識しました。だから、私はテクスチャードクワッドに行くことにしました。これは、ずっと前に、私は大学でそれをやっただけです。

問題

私のテクスチャが画面全体を取ってしまい、正しくマッピングされていない、それは私がやや不機嫌になります。私は私のコードといくつかの専門家の意見にいくつかの目をすることができることを期待していた。

結果

これである必要があります:

Correct Image

しかし、このです:

Incorrect Image

は、事前に、ありがとうございました!

マイクワッドクラス:

public class Quad 
{ 
    private float _Vertices[] = 
     { 
      -1.0f, 1.0f, 0.0f, // Top left 
      -1.0f, -1.0f, 0.0f, // Bottom left 
      1.0f, -1.0f, 0.0f, // Bottom right 
      1.0f, 1.0f, 0.0f, // Top right 
     }; 

    private float _TextureCoords[] = 
     { 
      0.0f, 1.0f, 
      1.0f, 1.0f, 
      0.0f, 0.0f, 
      1.0f, 0.0f 
     }; 

    private FloatBuffer _VertexBuffer; 
    private ShortBuffer _IndexBuffer; 
    private FloatBuffer _TextureBuffer; 

    private short[] _Indices = { 0, 1, 2, 0, 2, 3 }; 

    public Quad() 
    { 
     Setup(); 
    } 

    public void Setup() 
    { 
     ByteBuffer vbb = ByteBuffer.allocateDirect(_Vertices.length * 4); 
     vbb.order(ByteOrder.nativeOrder()); 

     _VertexBuffer = vbb.asFloatBuffer(); 
     _VertexBuffer.put(_Vertices); 
     _VertexBuffer.position(0); 

     ByteBuffer ibb = ByteBuffer.allocateDirect(_Indices.length * 2); 
     ibb.order(ByteOrder.nativeOrder()); 

     _IndexBuffer = ibb.asShortBuffer(); 

     _IndexBuffer.put(_Indices); 
     _IndexBuffer.position(0); 

     ByteBuffer tbb = ByteBuffer.allocateDirect(_TextureCoords.length * 4); 
     tbb.order(ByteOrder.nativeOrder()); 

     _TextureBuffer = tbb.asFloatBuffer(); 
     _TextureBuffer.put(_TextureCoords); 
     _TextureBuffer.position(0); 
    } 

    public void Draw(GL10 gl, Texture texture) 
    {    
     gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.getID()); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _TextureBuffer); 

     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _VertexBuffer); 
     gl.glDrawElements(GL10.GL_TRIANGLES, _Indices.length, 
       GL10.GL_UNSIGNED_SHORT, _IndexBuffer); 
    } 
} 

私のレンダラ:

public class FoxRenderer implements Renderer 
{ 
private Context _Context; 
private Quad _Quad; 

private int _Width; 
private int _Height; 

public FoxRenderer(Context context, Game game) 
{ 
    // Assignment 
    _Context = context; 
    _Game = game; 

    _Quad = new Quad(); 
} 

@Override 
public void onDrawFrame(GL10 gl) 
{ 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 

    _Quad.Draw(gl, _Game.getGameData().TextureSystem.GetTexture("buddha")); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    _Width = width; 
    _Height = height; 

    gl.glViewport(0, 0, width, height); 

    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f); 
} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    // Initialize various OpenGL elements 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

    gl.glClearColor(1f, 1f, 1f, 1); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

    // Disabling certain elements for performance 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glDisable(GL10.GL_LIGHTING); 

    // Stuff for rendering quads 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 

    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

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

そして、念のため、私のテクスチャロード:私はとの問題を解決することになった

public void LoadTexture(String name, int resource) 
{ 
    Texture texture = new Texture(); 

    // LOADING TEXTURE CODE 
    int[] temp = new int[ 1 ]; 

    _GL10.glGenTextures(1, temp, 0); 

    // Get newly generated OpenGL texture ID and bind it and store in our texture class 
    int id = temp[ 0 ]; 
    _GL10.glBindTexture(GL10.GL_TEXTURE_2D, id); 
    texture.setID(id); 

    _GL10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); 
    _GL10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); 
    _GL10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
    _GL10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 
    _GL10.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    // Load actual resource into bitmap 
    Bitmap bitmap = BitmapFactory.decodeResource(_Context.getResources(), resource); 

    // Not 100% sure what this does 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    texture.setWidth(bitmap.getWidth()); 
    texture.setHeight(bitmap.getHeight()); 

    _Map.put(name, texture); 

    bitmap.recycle(); 
} 

答えて

2

私が扱っているグラフィックスエンジニアの助けを借りてください。ちょうど私のonSurfaceChangedを変更するために必要な:、

private static float _Vertices[] = 
{ 
    -0.5f, -0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
    0.5f, 0.5f, 0.0f, 
    -0.5f, 0.5f, 0.0f, 
}; 

そして今、すべては私が望むように動作します:

gl.glFrontFace(GL10.GL_CW); 

そして、私の頂点を変更:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    _Width = width; 
    _Height = height; 

    gl.glViewport(0, 0, width, height); 

     gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadIdentity(); 
     gl.glOrthof(0.0f, width, height, 0.0f, 0.0f, 1.0f); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
} 

はまた、クロックワイズ巻きに変更ほとんどのエンジンでスクリーンスペースのように動作することを含む(正のYの下)。

+0

この回答を受け入れる必要があります。 –

+0

ハハ、私は計画しています:)私は自分の答えを受け入れる前に、明らかに8時間以上待たなければなりません。しかし、すべての助けをありがとう!大いに感謝しました! –