2016-11-02 2 views
0

Я просто хочу нарисовать простую прямоугольную рамку, заполненный прямоугольник работает нормально, но я не могу найти простой способ просто нарисовать границу, вот мой класс Rectangle.нарисовать основную прямоугольную рамку в OpenGL для android

Ниже мой прямоугольник класс:

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

    } 

ответ

0

В отличие от большинства 2D рисования API для OpenGL ES не имеет понятия автоматического «хода» для заполненных форм. Если вы хотите создать схему вокруг сплошной заполненной области, вам придется ее самостоятельно нарисовать, например. используя GL_LINES или тонкую полосу треугольников.

+0

Хорошо, что вы видите, что проблема заключается в том, что я хочу нарисовать прямоугольную рамку поверх предварительного просмотра камеры, идея проста, как прямоугольник фокуса в приложении камеры, я хочу нарисовать безопасный регион для того, чтобы пользователь разместил их квитанцию внутри и обрезать эту область – user2641657

+0

В чем проблема? Вы знаете координаты для углов вашего прямоугольника для вашей текущей ничьей, поэтому просто замените это на ничью GL_LINES, а не GL_TRIANGLES (вам нужно исправить буфер индекса, чтобы связать правильные точки в виде строк, так как это будет отличаться к треугольному соединению). – solidpixel

Смежные вопросы