2017-12-17 16 views
0

OpenGL ES 1.0으로 작성된 코드는 GL_LINE_STRIP을 사용하여 20 점 씩 선을 그립니다. 코드를 OpenGL ES 2.0으로 업그레이드하고 싶습니다. 코드는 다음 세 클래스로되어 있습니다.
mainActivity
MyGLRenderer
모양OpenGL ES 1.0 코드를 Android에서 OpenGL Es 2.0으로 변환하는 방법은 무엇입니까?

어떻게해야합니까? 어떻게 fragShadervertShader 등을 설정합니까? 다음은 코드가
도와주세요 :
mainActivity =

public class mainActivuty extends Activity { 
    private GLSurfaceView surface; 
    public void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     surface = new GLSurfaceView(this); 
     surface.setEGLContextClientVersion(1); 
     surface.setRenderer(new MyGLRenderer()); 

     setContentView(surface); 
    } 

    public void onPause(){ 
     super.onPause(); 
     surface.onPause();  
    } 

    public void onResume() { 
     super.onResume(); 
     surface.onResume(); 
    } 
} 


MyGLRenderer =

public class MyGLRenderer implements Renderer { 
    Shape s; 

    public MyGLRenderer() { 
     s = new Shape(); 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glClearColor(0.0f, 0.0f, 0.5f, 0.5f); 
    } 

    public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(0, 0, -8); 
     s.draw(gl); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.1f, 
       100.0f); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 arg0, javax.microedition.khronos.egl.EGLConfig arg1) { 
     // TODO Auto-generated method stub 

    } 
} 


와 모양 =

public class Shape { 

    float vertices[] = { 
      -3.14f, -0.00159265f, 0f, 
      -2.826f, -0.31038f, 0f, 
      -2.512f, -0.588816f, 0f, 
      -2.198f, -0.809672f, 0f, 
      -1.884f, -0.951351f, 0f, 
      -1.57f, -1f, 0f, 
      -1.256f, -0.950859f, 0f, 
      -0.942f, -0.808736f, 0f, 
      -0.628f, -0.587528f, 0f, 
      -0.314f, -0.308866f, 0f, 
      0f, 0f, 0f, 
      0.314f, 0.308866f, 0f, 
      0.628f, 0.587528f, 0f, 
      0.942f, 0.808736f, 0f, 
      1.256f, 0.950859f, 0f, 
      1.57f, 1f, 0f, 
      1.884f, 0.951351f, 0f, 
      2.198f, 0.809672f, 0f, 
      2.512f, 0.588816f, 0f, 
      2.826f, 0.31038f, 0f, 
      3.14f, 0.00159265f, 0f 
      }; 
      private short[] indices = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; 

      FloatBuffer vertexBuffer; 
      ShortBuffer indexBuffer; 
      public Shape() { 
      ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4); 
      bb.order(ByteOrder.nativeOrder()); 
      vertexBuffer = bb.asFloatBuffer(); 
      vertexBuffer.put(vertices); 
      vertexBuffer.position(0); 

      ByteBuffer bb2=ByteBuffer.allocateDirect(indices.length*2); 
      bb2.order(ByteOrder.nativeOrder()); 
      indexBuffer=bb2.asShortBuffer(); 
      indexBuffer.put(indices); 
      indexBuffer.position(0); 
      } 

      public void draw(GL10 gl) { 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
      gl.glDrawElements(GL10.GL_LINE_STRIP,indices.length,GL10.GL_UNSIGNED_SHORT,indexBuffer); 
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      } 

} 

Tahnks

답변

0

이 코드를 작성하는 데는 여러 가지 방법이 있습니다. 이전에이 문제에 직면했을 때 제 제안이 있습니다.
mainActivity은 별다른 변화가 필요 없습니다. 이 라인을 변경하여 OpenGL ES 버전을 버전 2.0으로 변경해야합니다. surface.setEGLContextClientVersion(2);

언급 한대로 두 개의 클래스가 더 필요합니다. MyGLRendererShape 나는 여기에 그들 RendererShader clasees합니다. Shader 클래스는 vertcode 문자열이어야하고 fragcode 문자열이어야합니다.

public class Shader { 

    private final static String vertcode = "attribute vec4 a_pos;"+ 
      "void main(){"+ 
      "gl_Position = a_pos;" + 
      "}"; 

    private final static String fragcode = "precision mediump float;" + 
      "uniform vec4 u_color;"+ 
      "void main(){"+ 
      "gl_FragColor = u_color;"+ 
      "}"; 

    private static int program; 
    public static int positionhandle; 
    public static int colorhandle; 

    public static void makeprogram() 
    { 
     int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertcode); 
     int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragcode); 

     program = GLES20.glCreateProgram(); 

     GLES20.glAttachShader(program, vertexShader); 
     GLES20.glAttachShader(program, fragmentShader); 

     GLES20.glLinkProgram(program); 

     positionhandle = GLES20.glGetAttribLocation(program,"a_pos"); 
     colorhandle = GLES20.glGetUniformLocation(program, "u_color"); 


     GLES20.glUseProgram(program); 

    } 

    private static int loadShader(int type, String shadertext) 
    { 
     int shader = GLES20.glCreateShader(type); 
     GLES20.glShaderSource(shader, shadertext); 
     GLES20.glCompileShader(shader); 
     return shader; 
    } 

} 

지금 당신에게 포인트를 포함하여 Renderer 클래스를 설정해야합니다 :처럼 Shader 클래스는 수 shuld. 공개

class Renderer implements GLSurfaceView.Renderer { 

    private FloatBuffer vertbuffer; 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     tut1.Shader.makeprogram(); 
     GLES20.glEnableVertexAttribArray(tut1.Shader.positionhandle); 
     float[] verts = {-3.14f, -0.00159265f, 0f, 
     -2.826f, -0.31038f, 0f, 
     -2.512f, -0.588816f, 0f, 
     -2.198f, -0.809672f, 0f, 
     -1.884f, -0.951351f, 0f, 
     -1.57f, -1f, 0f, 
     -1.256f, -0.950859f, 0f, 
     -0.942f, -0.808736f, 0f, 
     -0.628f, -0.587528f, 0f, 
     -0.314f, -0.308866f, 0f, 
     0f, 0f, 0f, 
     0.314f, 0.308866f, 0f, 
     0.628f, 0.587528f, 0f, 
     0.942f, 0.808736f, 0f, 
     1.256f, 0.950859f, 0f, 
     1.57f, 1f, 0f, 
     1.884f, 0.951351f, 0f, 
     2.198f, 0.809672f, 0f, 
     2.512f, 0.588816f, 0f, 
     2.826f, 0.31038f, 0f, 
     3.14f, 0.00159265f, 0f 
     }; 
     vertbuffer = makefloatbuffer(verts); 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     GLES20.glViewport(0, 0, width, height); 
    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
     GLES20.glUniform4f(tut1.Shader.colorhandle, 1.0f, 0.0f, 0.0f, 1.0f); 
     GLES20.glVertexAttribPointer(tut1.Shader.positionhandle, 3, GLES20.GL_FLOAT, false, 0, vertbuffer); 
     GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, 3); 
    } 

    public FloatBuffer makefloatbuffer(float[] array) { 
     FloatBuffer floatbuff = ByteBuffer.allocateDirect(array.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
     floatbuff.put(array).position(0); 
     return floatbuff; 
    } 

} 
0

ES1.x와 ES2.x는 매우 다릅니다. 당신이 선을 그리고 ES1이 당신을 위해 충분한 경우에 나의 통보는 "그것을 개조하지 않는다".

그럴 수 없다면 ES2에서 새로운 프로젝트/모듈을 시작하고 프로세스를 수행하는 데 유용한 자습서를 사용하는 것이 좋습니다. 당신이 올렸던 것에서 이것은 충분히 빨라야합니다.

튜토리얼 프로젝트를 수정하여 필요한 작업을 수행하거나 튜토리얼의 논리를 케이스로 복사하여 변환하십시오. 코드에서

몇 가지 방법이 변경 그러나 일반적으로 당신이해야 할 것은 한 수 쉐이더에

  • 이동 행렬 방법을 (코드 컴파일 및 사용)

    • 추가 쉐이더 (행렬은 밖으로 GL의 그래서 당신은 쉐이더에 해당하는 다른 방법)
    • 변환 포인터 및 클라이언트 상태를 사용해야하는 것은
    • 같은 색상으로 쉐이더에서 다른 매개 변수를 추가 속성
    ,
  • +0

    OpenGL ES 2.0으로 이동해야합니다. ES 1보다 더 복잡합니다. 어떤면에서는 쉐이더 행렬을 검색하고 쉐이더로 행렬 방식을 옮겼지 만 그리기 선에 대해서는 개미를 찾을 수 없었습니다. 모든 것은 삼각형 그리기에 관한 것입니다. Open GL ES 2.0에서'GL_LINE_STRIP' 예제에 대한 참고 자료를 보내 주시겠습니까?고마워요. –

    +0

    사실 드로잉은 두 버전에서 동일합니다. 삼각형 대신에 선 스트립을 사용하거나 예제에있는 것을 사용하십시오. –