2014-04-15 2 views
0

"OpenGLES 환경 만들기"문서를 따르고 있습니다. 나는 삼각형을 만드는 시점에 있습니다. 응용 프로그램은 실행되지만 삼각형은 없습니다.OpenGL Android 안드로이드 삼각형이 보이지 않습니다.

주요 활동

package com.example.testopengl; 

import android.opengl.GLSurfaceView; 
import android.os.Bundle; 
import android.app.Activity; 

public class MainActivity extends Activity { 

    private GLSurfaceView mGLView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     mGLView = new MyGLSurfaceView(this); 
     setContentView (mGLView); 

} 


} 

렌더러 클래스

package com.example.testopengl; 

import javax.microedition.khronos.opengles.GL10; 
import javax.microedition.khronos.egl.EGLConfig; 

import android.opengl.GLES20; 
import android.opengl.GLSurfaceView; 

public class MyGLRenderer implements GLSurfaceView.Renderer { 

    private Triangle mTriangle; 


    public void onSurfaceCreated (GL10 unused, EGLConfig config) { 
     GLES20.glClearColor(0.4f, 0.4f, 0.4f, 0.4f); 
     mTriangle = new Triangle(); 

    } 

    public void onDrawFrame (GL10 unused) { 
    GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); 
    } 

    public void onSurfaceChanged (GL10 unused, int width, int height) { 
     GLES20.glViewport(0, 0, width, height); 
     mTriangle.draw(); 
    } 

    public static int loadShader (int type, String shaderCode) { 
     int shader = GLES20.glCreateShader(type); 

     GLES20.glShaderSource(shader, shaderCode); 
     GLES20.glCompileShader(shader); 

     return shader; 
    } 

} 

표면 View 클래스

package com.example.testopengl; 

import android.content.Context; 
import android.opengl.GLSurfaceView; 

public class MyGLSurfaceView extends GLSurfaceView { 


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

     setEGLContextClientVersion(2); 

     setRenderer(new MyGLRenderer()); 

     setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    } 

} 

삼각형 클래스

package com.example.testopengl; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import android.opengl.GLES20; 

public class Triangle { 

    private final String vertexShaderCode = 
     "attribute vec4 vPosition;" + 
     "void main() {" + 
     " gl_Position = vPosition;" + 
     "}"; 

    private final String fragmentShaderCode = 
     "precision mediump float;" + 
     "uniform vec4 vColor;" + 
     "void main() {"+ 
     " gl_FragColor = vColor;" + 
     "}"; 

    private FloatBuffer vertexBuffer; 
    private final int mProgram; 
    private int mPositionHandle; 
    private int mColorHandle; 

    static final int COORDS_PER_VERTEX = 3; 
    static float triangleCoords[] = { 
     0.0f, 0.622008459f, 0.0f, 
     -0.5f, -0.311004243f, 0.0f, 
     0.5f, -0.311004243f, 0.0f 
    }; 

    private final int vertexCount = triangleCoords.length/COORDS_PER_VERTEX; 
    private final int vertexStride = COORDS_PER_VERTEX * 4; 

    float color [] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f}; 

    public Triangle() { 
     ByteBuffer bb = ByteBuffer.allocateDirect (
       triangleCoords.length * 4); 
     bb.order(ByteOrder.nativeOrder()); 

     vertexBuffer = bb.asFloatBuffer(); 
     vertexBuffer.put(triangleCoords); 
     vertexBuffer.position(0); 

     int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); 
     int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); 

     mProgram = GLES20.glCreateProgram(); 
     GLES20.glAttachShader(mProgram, vertexShader); 
     GLES20.glAttachShader(mProgram, fragmentShader); 
     GLES20.glLinkProgram(mProgram); 

    } 

    public void draw() { 
     GLES20.glUseProgram(mProgram); 
     mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); 
     mColorHandle = GLES20.glGetUniformLocation(mProgram, "vcolor"); 
     GLES20.glUniform4fv(mColorHandle, 1, color, 0); 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
    } 

} 

답변

1

주요 문제는 렌더러의 onDrawFrame() 메서드가 명확하지만 아무 것도 렌더링하지 않는 것입니다. mTriangle.draw() 전화는 onSurfaceChanged() 대신 onDrawFrame()이어야합니다.

나는 glEnableVertexAttribArray()에 대한 전화도 누락되었다고 생각합니다.

관련 문제