2016-07-22 20 views
1

アンドロイドデバイス上でopengl es 3.0で単純なキューブをレンダリングしたいがレンダリングしない。これは私のSurfaceViewのセットアップです:OpenGL ES 3.0でアンドリューでキューブが描画されない

public GLContextView(Context context){ 
    super(context); 

    setEGLContextClientVersion(3); 

    setRenderer(renderer); 
} 

コードレンダリング:頂点とインデックスデータと

public void onSurfaceCreated(javax.microedition.khronos.opengles.GL10 unused, javax.microedition.khronos.egl.EGLConfig p2){ 
    GLES30.glEnable(GLES30.GL_DEPTH_TEST); 
    GLES30.glEnable(GLES30.GL_BLEND); 
    GLES30.glEnable(GLES30.GL_CULL_FACE); 
    GLES30.glDepthFunc(GLES30.GL_LEQUAL); 
    GLES30.glCullFace(GLES30.GL_BACK); 

    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

    cubeProgram = RenderHelper.createShaderProgram(Shader.CubeVertexShader, Shader.CubeFragmentShader); 

    int[] array = new int[2]; 
    GLES30.glGenVertexArrays(1, array, 0); 
    vaId = array[0]; 
    GLES30.glBindVertexArray(vaId); 


    GLES30.glGenBuffers(2, array, 0); 
    vbId = array[0]; 
    ibId = array[1]; 

    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbId); 
    GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, RenderCube.vertices.length * 4, RenderCube.vBuffer, GLES30.GL_STATIC_DRAW); 
    GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, 0); 
    GLES30.glEnableVertexAttribArray(positionHandle); 

    GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, ibId); 
    GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, RenderCube.indices.length * 4, RenderCube.iBuffer, GLES30.GL_STATIC_DRAW); 

    colorHandle = GLES30.glGetUniformLocation(cubeProgram, "in_color"); 

    GLES30.glBindVertexArray(0); 
} 

public void onDrawFrame(GL10 p1){ 
    GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT); 

    GLES30.glUseProgram(cubeProgram); 

    GLES30.glBindVertexArray(vaId); 

    GLES30.glUniform4f(colorHandle, 1.0f, 1.0f, 1.0f, 1.0f); 

    GLES30.glDrawElements(GLES30.GL_TRIANGLES, RenderCube.indices.length, GLES30.GL_UNSIGNED_INT, 0); 

} 


public void onSurfaceChanged(GL10 p1, int p2, int p3){ 
    GLES30.glViewport(0, 0, p2, p3); 
} 

RenderCubeクラス:

class RenderCube{ 
    public static float[] vertices = { 
     0.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 1.0f, 

     0.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 0.0f, 
     0.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
    }; 

    public static int[] indices = { 
     0, 3, 1, 0, 2, 3, //Bottom 
     4, 7, 5, 4, 6, 7, //Top 
     0, 5, 1, 0, 4, 5, //Back 
     2, 7, 3, 2, 6, 7, //Front 
     0, 6, 2, 0, 4, 6, //Left 
     1, 7, 3, 1, 5, 7 //Right 
    }; 

    public static FloatBuffer vBuffer = RenderHelper.createFloatBuffer(vertices.length * 4, vertices); 
    public static IntBuffer iBuffer = RenderHelper.createIntBuffer(indices.length * 4, indices); 

}; 

シェーダー:

final class Shader{ 

    public static final String CubeVertexShader = 
    "#version 300 es\n" + 
    "layout (location = 0) in vec3 pos;" + 
    "void main(){" + 
    " gl_Position = vec4(pos, 1.0f);" + 
    "}"; 

    public static final String CubeFragmentShader = 
    "#version 300 es\n" + 
    "precision mediump float;" + 
    "uniform vec4 in_color;" + 
    "out vec4 color;" + 
    "void main(){" + 
    " color = in_color;" + 
    "}"; 
} 

をそれは罰金コンパイルOpenGLエラーはありません。 eが印刷されます。私は間違って何をしていますか?

答えて

1

私はあなたには目に見える三角形がないと思います。

下、上、左、および右の面の三角形は、表示面に直交するため、見えません。だからあなたはそれらの上を見ている、そして彼らは縮退三角形(すなわち、領域がゼロの三角形)として終わる。

あなたが定義した方法では、背面と前面の三角形はすべて時計回りの順番です。これらの4つの三角形のインデックスを拡張し、対応する頂点のちょうどx、y座標を示す:あなたが見ることができるように

0, 5, 1 -> (0.0f, 0.0f), (1.0f, 1.0f), (1.0f, 0.0f) 
0, 4, 5 -> (0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 1.0f) 
2, 7, 3 -> (0.0f, 0.0f), (1.0f, 1.0f), (1.0f, 0.0f) 
2, 6, 7 -> (0.0f, 0.0f), (0.0f, 1.0f), (1.0f, 1.0f) 

、これらの三角形はすべて時計回りです。あなたは、バックフェースのカリング可能にすることを選んだので:

GLES30.glEnable(GLES30.GL_CULL_FACE); 
GLES30.glCullFace(GLES30.GL_BACK); 

を、フロント用のデフォルトの巻線順序が直面しているバックフェースの巻線が時計回りで、これらすべての三角形がカリングされることを意味し、反時計回りです。

さらに、正面はz = 1.0であるため、正面のクリップ平面にも正確に当てはまります。私が仕様を読んでいるところでは、正確にクリッピング面にある図形はまだ表示されているはずです。です。しかし、クリップボリュームの内側にはっきりと配置する方が安全でしょう。

+0

ありがとうございました!私は頂点がデフォルトで反時計回りに定義されていることに気付きませんでした。 – Overblade

関連する問題