2012-12-01 5 views
3

최근 Android로 OpenGLES 학습을 시작했습니다. 렌더링과 함께 GLWallpaperService 클래스로 livewallpaper를 만들고 있습니다.Android OpenGLES 기기 문제

Android 시뮬레이터의 문제는 애니메이션을 표시 할 수 있지만 이며 Android 기기 (HTC Incredible S) FPS로 테스트하는 동안 45-50 정도가 유지되지만 화면에는 아무 것도 표시되지 않습니다.

다음은 코드 스 니펫입니다.

public void onDrawFrame(GL10 gl) { 
    float currLevel = curve[(MAX_CURVE_POINT_NO + curveStart - 1) 
      % MAX_CURVE_POINT_NO]; 
    if (!isCreated) { 
     isCreated = !isCreated; 
     _spriteVerices = BufferFactory.createFloatBuffer(8); 
     spriteTextCordinates = BufferFactory.createShortBuffer(8); 
    } 
    _spriteVerices.put(spriteVerices); 
    spriteTextCordinates.put(spriteTextCordinatesArray); 
    _spriteVerices.position(0); 
    spriteTextCordinates.position(0); 

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

    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glScalef(0.8f, 0.8f, 1.0f); 
    gl.glTranslatef(-0.2f, 0, 0); 

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, _spriteVerices); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, spriteTextCordinates); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glPushMatrix(); 
    gl.glTranslatef(1.0f, currLevel, -0.01f); 
    gl.glColor4f(0.0f, 0.5f, 1.0f, 1.0f); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    gl.glPopMatrix(); 

    curve[curveStart] = ekgMap[curveStart]; // ((rand()%32768)/32768.0)*0.4-0.2; 
    curveStart = (curveStart + 1) % MAX_CURVE_POINT_NO; 
} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 

      gl.glViewport(0, 0, width, height); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 60f, (float) width/(float) height, 1f, 100f); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glTranslatef(0, 0, -5); 
    gl.glRotatef(30f, 1, 0, 0); 

    gl.glEnable(GL10.GL_LIGHTING); 
    gl.glEnable(GL10.GL_RESCALE_NORMAL); 
    gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 

    // Set the color of light bouncing off of surfaces to respect the 
    // surface color 
    gl.glEnable(GL10.GL_COLOR_MATERIAL); 

    setupLightSources(gl); 

    // Turn on a global ambient light. The "Cosmic Background Radiation", if 
    // you will. 
    float[] ambientLightRGB = { 0.3f, 0.3f, 0.3f, 1.0f }; 
    gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, ambientLightRGB, 0); 
} 

을 onSurfaceCreated을 onSurfaceChanged onDrawFrame

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

    this.loadTexture(gl, mContext, R.drawable.dot); 

    gl.glClearDepthf(1f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 

    // Turn on culling, so OpenGL only draws one side of the primitives 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glCullFace(GL10.GL_BACK); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_LINE_SMOOTH); 
    gl.glEnable(GL10.GL_POINT_SMOOTH); 
} 

감사합니다 ,

+0

화면에 단 하나의 점만 그리는 코드가 축소되었습니다! 그러나 여전히 같은 행동! –

답변

2

열린 글자를 올바르게 설정했다면 문제가 그리는 곳이 아닌 경우가 자주 있습니다. 보기의 범위를 벗어날 수 있습니다. 귀하의 번역본 등에 매우 조심하십시오.

폴리를 뒤집어 야 할 수도 있습니다. 드로잉이 뒤를 향해서 직면하기 때문에 어디에서 바로 볼 수 있습니까? 내가 한 때

이 내 무승부이 오르입니다 물론이

* This is where you draw the screen, called every auto onDraw Loop pass 
     * ************************************************************************/ 
     //Log.d("Game", "Render"); 
     gl.glViewport(0, 0, Screen.SCREEN_WIDTH, Screen.SCREEN_HEIGHT); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(0, Screen.WIDTH_SCALE, 0, Screen.HEIGHT_SCALE, 1, -1); 

     //gl.gltranslatef(x,y,z) will translate everything drawn here after by that amount, effectively scrolling the view. 

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


     gl.glEnable(GL10.GL_TEXTURE_2D); 
     MeshRect mRect; // this holds all of our rectangles 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     /***************** so this is how it goes for rendering any object **************************************************** 
     ball.Update(deltaTime);  //first update the object 
     gl.glPushMatrix(); 
     gl.glLoadIdentity(); 
      gl.glTranslate(x,y,z); 
      texture.bind(gl, Texture.TEXTURE_BALL2);  //then bind the texture we would like to use 
      mRect = new MeshRect(ball.getMyRect());  //then create the rectangle at (0,0,0) 
      mRect.Draw(GL10.GL_TRIANGLES, gl);  //Finally tell that rectangle to draw 
     gl.glPopMatrix(); 
     *********************************************************************************************************************** 

과 매우 유사한 모습, 그리고 당신은 3D로 보이지만, 기본은 동일 근처에 있어야한다.

+0

보기 포트 및 애니메이션 변형이 정확합니다. 다른 크기의 시뮬레이터로 시도했습니다. 렌더링은 시뮬레이터에서 예상대로 진행됩니다. 장치는 영원히 비워 둡니다. :( –

+0

에뮬레이터가 작동하지만 장치가 작동하지 않습니다. 어떤 모델을 사용하고 있습니까? – WIllJBD