2016-11-02 3 views
0

Ich möchte nur eine einfache rechteckige Grenze, zeichnen ein gefülltes Rechteck funktioniert ok, aber ich kann nicht einen einfachen Weg, um nur eine Grenze hier zu zeichnen ist meine Klasse Rectangle.zeichnen Sie grundlegende rechteckige Grenze in OpenGL für Android

Unten ist mein Rechteck-Klasse:

package{ 

     import java.nio.ByteBuffer; 
     import java.nio.ByteOrder; 
     import java.nio.FloatBuffer; 
     import java.nio.ShortBuffer; 
     import javax.microedition.khronos.opengles.GL10; 

     public class Rectangle { 

      private 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 
      }; 


     // The colors mapped to the vertices. 
     float[] colors = { 
       1f, 0f, 0f, 1f, // vertex 0 red 
       1f, 0f, 0f, 1f, // vertex 1 green 
       1f, 0f, 0f, 1f, // vertex 2 blue 
       1f, 0f, 0f, 1f, // vertex 3 magenta 
     }; 

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

      private FloatBuffer vertexBuffer; 
      private ShortBuffer indexBuffer; 

     // Our color buffer. 
     private FloatBuffer colorBuffer; 

     public Rectangle(){ 
      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); 

      // float has 4 bytes, colors (RGBA) * 4 bytes 
      ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4); 
      cbb.order(ByteOrder.nativeOrder()); 
      colorBuffer = cbb.asFloatBuffer(); 
      colorBuffer.put(colors); 
      colorBuffer.position(0); 
     } 

     public void draw(GL10 gl){ 
      gl.glFrontFace(GL10.GL_CCW); 
      gl.glEnable(GL10.GL_CULL_FACE); 
      gl.glCullFace(GL10.GL_BACK); 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
      // Enable the color array buffer to be used during rendering. 
      gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // NEW LINE ADDED. 

      // Point out the where the color buffer is. 
      gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); // NEW LINE ADDED. 
      gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer); 
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glDisable(GL10.GL_CULL_FACE); 
     } 

    } 

Antwort

0

Anders als die meisten 2D-Zeichnungs-APIs OpenGL ES hat kein Konzept eines automatischen „Hub“ für gefüllte Formen. Wenn Sie einen Umriss um einen voll gefüllten Bereich möchten, müssen Sie ihn selbst zeichnen, z. Verwenden Sie GL_LINES oder einen dünnen Streifen aus Dreiecken.

+0

naja, das ist das problem ich möchte rechteckige grenze auf eine kamera vorschau zeichnen, die idee ist einfach wie ein fokus rechteck in der kamera anwendung, ich möchte eine sichere region für den benutzer zeichnen ihre quittung innerhalb und den Bereich ausschneiden – user2641657

+0

Was ist das Problem? Sie kennen die Koordinaten für die Ecken Ihres Rechtecks ​​für Ihre aktuelle Zeichnung, ersetzen Sie das also durch eine Zeichnung von GL_LINES statt GL_TRIANGLES (Sie müssen den Indexpuffer korrigieren, um die richtigen Punkte als Linien zu verknüpfen, da dies anders sein wird zur Dreiecksverbindung). – solidpixel