2016-12-05 3 views
0

나는 OpenGL을 배우려고 노력해 왔고 삼각형을 가져와야한다. 내 코드를 렌더링하면 clearColor가 렌더링되지만 삼각형과 정점은 렌더링되지 않는다. 단편 쉐이더는 사람이 문제를 좀 볼 수있는 오류를 반환하지 않고 감사삼각형을 렌더링하기 위해서 OpenGL es 2.0을 얻을 수 없다.

public class MainActivity extends Activity implements GLSurfaceView.Renderer 
{ 
    public static int POSITION_ATTRIBUTE = 0; 
    public int program; 

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

    GLSurfaceView glSurfaceView = new GLSurfaceView(this); 
    glSurfaceView.setEGLContextClientVersion(2); 
    glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
    glSurfaceView.setRenderer(this); 
    setContentView(glSurfaceView); 
} 

@Override 
public void onSurfaceCreated(GL10 unused, EGLConfig config) 
{ 
    // Vertex Shader Source Code 
    String vertexShaderSource = "" + 
     "attribute vec2 position; \n" + 
     "\n" + 
     "void main() \n" + 
     "{ \n" + 
     " gl_Position = vec4(position.x, position.y, 0.0, 1.0); \n" + 
     "} \n" + 
     "\n"; 

    String fragmentShaderSource = "" + 
     "\n" + 
     "\n" + 
     "void main() \n" + 
     "{ \n" + 
     " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); \n" + 
     "} \n" + 
     "\n"; 

    // Write and compile vertex shader 
    int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); 
    GLES20.glShaderSource(vertexShader, vertexShaderSource); 
    GLES20.glCompileShader(vertexShader); 
    Log.i("Vertex Shader", "Compile Log: " + GLES20.glGetShaderInfoLog(vertexShader)); 

    // Write and compile fragment shader 
    int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); 
    GLES20.glShaderSource(fragmentShader, fragmentShaderSource); 
    GLES20.glCompileShader(fragmentShader); 
    Log.i("Fragment Shader", "Compile Log: " + GLES20.glGetShaderInfoLog(fragmentShader)); 

    // Link the shaders into a program object 
    program = GLES20.glCreateProgram(); 
    GLES20.glAttachShader(program, vertexShader); 
    GLES20.glAttachShader(program, fragmentShader); 
    // Links the variables 
    GLES20.glBindAttribLocation(program, POSITION_ATTRIBUTE, "position"); 
    GLES20.glLinkProgram(program); 
    Log.i("Link", "Link Log: " + GLES20.glGetProgramInfoLog(program)); 

    GLES20.glClearColor(0.8f, 0.3f, 0.2f, 1.0f); 
    GLES20.glEnableVertexAttribArray(POSITION_ATTRIBUTE); 
} 

@Override 
public void onSurfaceChanged(GL10 unused, int width, int height) 
{ 

} 

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

    // Give OpenGl a trinagle to render 
    float[] geometry = new float[]{ 
     -0.2f, 0.3f, 
     0.4f, 0.5f, 
     0.1f, 0.1f, 
    }; 

    ByteBuffer geometryByteBuffer = ByteBuffer.allocateDirect(geometry.length * 4); 
    geometryByteBuffer.order(ByteOrder.nativeOrder()); 
    FloatBuffer geometryBuffer = geometryByteBuffer.asFloatBuffer(); 
    geometryBuffer.put(geometry); 
    geometryBuffer.rewind(); 
    GLES20.glVertexAttribPointer(POSITION_ATTRIBUTE, 2, GLES20.GL_FLOAT, false, 0, geometryBuffer); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, geometry.length/2); 
} 

}

+0

이것이 완전한 코드라면 'onPause()'와'onResume()'에 대한 후크가 빠져있다. 'GLSurfaceView' 문서를 보라. –

+0

나는 그 문제점을 wasnt하는 그들을 놓쳤다는 것을 나는 알고있다 –

답변

1

문제는 내가 GLES20 .gl_Useprogram (프로그램)을 잊어 버렸습니다;