2015-03-20 4 views
1

Я учусь Open GL ES 2.0, и я только что сделал 1 легкая игра для 1,0OpenGL ES 1.0 для OpenGL ES 2.0, я не могу нарисовать квадрат

Я следующие учебники, но я не могу понять эту вещь

В OpenGL ES 1.0, если я определяю квадрат, который так:

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

и сделать это таким образом это работает

public void draw(GL10 gl) 
{ 

    gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise 
            // orientation 
    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face 
    gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display) 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable 
                  // texture-coords-array 
                  // (NEW) 
    gl.glTexCoordPointer(3, GL10.GL_FLOAT, 0, texBuffer); // Define 
                  // texture-coords 
                  // buffer (NEW) 

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

    // front 
    gl.glBindTexture(GL10.GL_TEXTURE_2D,TextureLoader.TeclaBlancatextureIDs[0]); 


    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Disable 
                  // texture-coords-array 
                  // (NEW) 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisable(GL10.GL_CULL_FACE); 
    gl.glDisable(GL10.GL_BLEND); 
} 

но в OpenGL ES 2.0, если я делаю это таким образом (с той же самой вершиной), что только написать треугольник:

private void drawSuelo(Suelo suelo) 
{  
    // Pass in the position information 
    suelo.mPositions.position(0);  
    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false, 
      0, suelo.mPositions);   

    GLES20.glEnableVertexAttribArray(mPositionHandle);   

    // Pass in the color information 
    suelo.mColors.position(0); 
    GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false, 
      0, suelo.mColors);   

    GLES20.glEnableVertexAttribArray(mColorHandle); 

    // Pass in the normal information 
    cubo.mCubeNormals.position(0); 
    GLES20.glVertexAttribPointer(mNormalHandle, mNormalDataSize, GLES20.GL_FLOAT, false, 
      0, cubo.mCubeNormals); 

    GLES20.glEnableVertexAttribArray(mNormalHandle); 

    // This multiplies the view matrix by the model matrix, and stores the result in the MVP matrix 
    // (which currently contains model * view). 
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 

    // Pass in the modelview matrix. 
    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0);     

    // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix 
    // (which now contains model * view * projection). 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); 

    // Pass in the combined matrix. 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

    // Pass in the light position in eye space.   
    GLES20.glUniform3f(mLightPosHandle, mLightPosInEyeSpace[0], mLightPosInEyeSpace[1], mLightPosInEyeSpace[2]); 

    // Draw the cube. 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);        
} 

кажется, нужно все это вершины, чтобы нарисовать квадрат

final float[] PositionData = { 

// Top face 
-1.0f, 1.0f, -1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, -1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, -1.0f }; 

Почему это происходит? Почему я скучаю? Есть ли способ в Open GL ES 2.0 написать квадрат с 4 вершинами?

+1

Посмотрите на [ это] (http://developer.android.com/training/graphics/opengl/shapes.html#square) и [demo] (http://developer.android.com/shareables/training/OpenGLES.zip). – Harry

+0

Я вижу, что они используют заказ, но я не могу найти код, в котором квадрат вычерчен (только треугольник) – D4rWiNS

+1

Вы видели демо? – Harry

ответ

2

Вы используете разные примитивные типы. В рабочем ES 1.0 код, у вас есть это:

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

и в ES 2.0 код, который делает только треугольник, когда вы даете ему 4 вершины:

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6); 

Так в коде ES 1.0, вы указываете, что хотите нарисовать треугольную полосу (примитивный тип GL_TRIANGLE_STRIP) с 4 вершинами. Это соответствует двум треугольникам. В коде ES 2.0 вы указываете, что хотите нарисовать два отдельных треугольника (примитивный тип GL_TRIANGLES), которым действительно нужны 6 вершин.

Если вы хотите использовать оригинальные 4 вершины для кода ES 2.0, вы просто должны использовать эквивалентный вызов отрисовки с тем же примитивным типом, который вы использовали в ES 1.0 версии на:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
+0

Спасибо вам очень много, там была проблема, мне кажется, что есть дифферент типов: GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP Полоса, GL_TRIANGLE_FAN, и GL_TRIANGLES какой лучше? или который используется для каждого из них? – D4rWiNS