方形不是在模拟器中绘制的

时间:2013-09-14 09:32:07

标签: android opengl-es

这是来自NeHe的端口的实际代码,但它没有绘制任何东西。为什么??

我的主要活动课程:

     import android.app.Activity;
     import android.opengl.GLSurfaceView;
     import android.os.Bundle;
     /**
     * Our OpenGL program's main activity
     */
    public class Main extends Activity {

   private GLSurfaceView glView;   // Use GLSurfaceView

   // Call back when the activity is started, to initialize the view
   @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glView = new GLSurfaceView(this);           // Allocate a GLSurfaceView
        glView.setEGLContextClientVersion(1);
        glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        glView.setRenderer(new mainRenderer(this)); // Use a custom renderer
        this.setContentView(glView);                // This activity sets to GLSurfaceView
     }

     // Call back when the activity is going into the background
     @Override
     protected void onPause() {
        super.onPause();
        glView.onPause();
     }

     // Call back after onPause()
     @Override
     protected void onResume() {
        super.onResume();
        glView.onResume();
     }
  }

我的渲染器类:

  import javax.microedition.khronos.egl.EGLConfig;
  import javax.microedition.khronos.opengles.GL10;
  import android.content.Context;
  import android.opengl.GLSurfaceView;
  import android.opengl.GLU;
  /**
   *  OpenGL Custom renderer used with GLSurfaceView 
   */
  public class mainRenderer implements GLSurfaceView.Renderer {
     Context context;   // Application's context
     Patrat quad;

     // Constructor with global application context
     public mainRenderer(Context context) {
        this.context = context;

        quad = new Patrat();
     }

     // Call back when the surface is first created or re-created
     @Override
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // Set color's clear-value to black
        gl.glClearDepthf(1.0f);            // Set depth's clear-value to farthest
        gl.glEnable(GL10.GL_DEPTH_TEST);   // Enables depth-buffer for hidden surface removal
        gl.glDepthFunc(GL10.GL_LEQUAL);    // The type of depth testing to do
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  // nice perspective view
        gl.glShadeModel(GL10.GL_SMOOTH);   // Enable smooth shading of color
        gl.glDisable(GL10.GL_DITHER);      // Disable dithering for better performance

        // You OpenGL|ES initialization code here
        // ......
     }

     // Call back after onSurfaceCreated() or whenever the window's size changes
     @Override
     public void onSurfaceChanged(GL10 gl, int width, int height) {
        if (height == 0) height = 1;   // To prevent divide by zero
        float aspect = (float)width / height;

        // Set the viewport (display area) to cover the entire window
        gl.glViewport(0, 0, width, height);

        // Setup perspective projection, with aspect ratio matches viewport
        gl.glMatrixMode(GL10.GL_PROJECTION); // Select projection matrix
        gl.glLoadIdentity();                 // Reset projection matrix
        // Use perspective projection
        GLU.gluPerspective(gl, 45, aspect, 0.1f, 100.f);

        gl.glMatrixMode(GL10.GL_MODELVIEW);  // Select model-view matrix
        gl.glLoadIdentity();                 // Reset

        // You OpenGL|ES display re-sizing code here
        // ......


     }

     // Call back to draw the current frame.
     @Override
     public void onDrawFrame(GL10 gl) {
        // Clear color and depth buffers using clear-value set earlier
       gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        // You OpenGL|ES rendering code here
        // ......

        gl.glLoadIdentity();
        quad.draw(gl);
     }
  }

我的方形课程:

 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
 import javax.microedition.khronos.opengles.GL10;
 /*
  * A square drawn in 2 triangles (using TRIANGLE_STRIP).
  */
 public class Patrat {
    private FloatBuffer vertexBuffer;  // Buffer for vertex-array

    private float[] vertices = {  // Vertices for the square
       -1.0f, -1.0f,  0.0f,  // 0. left-bottom
        1.0f, -1.0f,  0.0f,  // 1. right-bottom
       -1.0f,  1.0f,  0.0f,  // 2. left-top
        1.0f,  1.0f,  0.0f   // 3. right-top
    };

    // Constructor - Setup the vertex buffer
    public Patrat() {
       // Setup vertex array buffer. Vertices in float. A float has 4 bytes
       ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
       vbb.order(ByteOrder.nativeOrder()); // Use native byte order
       vertexBuffer = vbb.asFloatBuffer(); // Convert from byte to float
       vertexBuffer.put(vertices);         // Copy data into buffer
       vertexBuffer.position(0);           // Rewind
    }

    // Render the shape
    public void draw(GL10 gl) {
       // Enable vertex-array and define its buffer
       gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
       gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
       // Draw the primitives from the vertex-array directly
       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
       gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }
 }

有任何解决方案吗?我不能忽视为什么这不起作用......

1 个答案:

答案 0 :(得分:1)

第一次关闭更改vertices设置了10%:

 private float[] vertices = {  // Vertices for the square
  -0.1f, -0.1f,  0.0f,  // 0. left-bottom
  0.1f, -0.1f,  0.0f,  // 1. right-bottom
  -0.1f,  0.1f,  0.0f,  // 2. left-top
  0.1f,  0.1f,  0.0f   // 3. right-top
};

之后我在onDrawFrame(GL10 gl)发现了问题:

您既没有glTranslatef也没有glScalef

将其更改为:

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

    // Reset the Modelview Matrix
    gl.glLoadIdentity();

    // Drawing
    gl.glTranslatef(0.0f, 0.0f, -1.0f);     // move 5 units INTO the screen
                                            // is the same as moving the camera 5 units away
    gl.glScalef(0.5f, 0.5f, 0.5f);          // scale the triangle to 50% 
                                            // otherwise it will be too large

    quad.draw(gl);                      

}