2012-10-31 2 views
0

그래픽에만 glDrawTexfoes()를 사용하는 게임이 있습니다. 그것은 물론 2d입니다. 지금까지는 그래픽을 그릴 때 그래픽을 늘리지 않았습니다. 다른 장치에 비해 크기가 큰 2 개의 세트가있었습니다. 그 접근법은 한계에 도달했습니다 (솔직히 말해서 나는 그것을 사용하지 않아야합니다 -하지만 그것은 2 년 전이었습니다).glDrawTexfoes로 타일 된 비트 맵을 스케일하는 방법은 무엇입니까?

그래서 지금은 단일 이미지 세트를 사용하고 glDrawTexfoes를 사용하여 디스플레이를 채우도록 크기를 조정하려고합니다. 그것은 대부분의 부분을 위해 최선을 다하고 있습니다. 결과를 보여주는 이미지를 포함 시켰습니다. 수직선은 거기에 있지 않아야합니다.

button problem

내가만큼 내가 할 수있는,하지만 난이 문제를 제거 할 수없는 등의 텍스처 매개 변수와 함께 연주했다, 그래서 SO에 선회하고있다. 여기에 몇 가지 세부 사항이 있습니다 : 이미지는 2의 누승이 아닙니다. 스프라이트 시트를 사용하지 않고 각 스프라이트는 자체 비트 맵을가집니다.

나는

bitmap.prepareTexture(_glMaxTextureSize); 

    gl.glGenTextures(1, mTextureNameWorkspace, 0); 

    int error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) { 
     Log.d("Texture Load 1", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString()); 
    } 

    assert error == GL10.GL_NO_ERROR; 

    bitmap.textureName = mTextureNameWorkspace[0]; 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, bitmap.textureName); 

    error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) { 
     Log.d("Texture Load 2", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString()); 
    } 

    assert error == GL10.GL_NO_ERROR; 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); //GL10.GL_REPLACE); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap.textureHanlde, 0); 

    error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) { 
     Log.d("Texture Load 3", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString()); 
    } 

    bitmap.releaseTextureBitmap(); 

    assert error == GL10.GL_NO_ERROR; 

    mCropWorkspace[0] = 0; 
    mCropWorkspace[1] = bitmap.getHeight(); 
    mCropWorkspace[2] = bitmap.getWidth(); 
    mCropWorkspace[3] = -bitmap.getHeight(); 

    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); 

    error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) { 
     Log.d("Texture Load 4", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString()); 
    } 

    assert error == GL10.GL_NO_ERROR; 

는 OpenGL을 컨텍스트가 뷰포트가

 float scaleX = (float)w/_screenWidth; 
    float scaleY = (float)h/_screenHeight; 
    final int viewportWidth = (int)(_screenWidth * scaleX); 
    final int viewportHeight = (int)(_screenHeight * scaleY); 
    gl.glViewport(0, 0, viewportWidth, viewportHeight); 
    mScaleX = scaleX; 
    mScaleY = scaleY; 

    /* 
    * Set our projection matrix. This doesn't have to be done each time we 
    * draw, but usually a new projection needs to be set when the viewport 
    * is resized. 
    */ 
    float ratio = (float) _screenWidth/_screenHeight; 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); 

마지막으로 다음과 같은 방식으로 설정되어

 /* 
    * Some one-time OpenGL initialization can be made here probably based 
    * on features of this particular context 
    */ 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    /* 
    * By default, OpenGL enables features that improve quality but reduce 
    * performance. One might want to tweak that especially on software 
    * renderer. 
    */ 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glDisable(GL10.GL_LIGHTING); 

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

다음 코드로 생성이 코드를 사용하여 텍스처를 만들 , 그리고 코드의 벽을 변명하면 그림은

01로 끝납니다.
gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 

    gl.glViewport(0, 0, (int)viewWidth, (int)viewHeight); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0, viewWidth, viewHeight, 0.0f, 0.0f, 1.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 

    [loop over sprites] 
      final float screenScale = 800/600f; // hardcoded to test stuff out 
      final float snappedX = ((x + transX)*screenScale); //+ e.speedX * interpolation; 
      final float snappedY = _screenHeight - (y + height + transY) * screenScale;//+ e.speedY * interpolation); 
      final int texName = ob.textureName; 

      gl.glBindTexture(GL10.GL_TEXTURE_2D, texName); 

      _cropWorkspace[0] = left; 
      _cropWorkspace[1] = top + height; 
      _cropWorkspace[2] = width; 
      _cropWorkspace[3] = -height; 

      if(operation == Drawer.MIRROR_X) 
      { 
       _cropWorkspace[0] = left + width; 
       _cropWorkspace[2] = -width; 
      } 

      ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, _cropWorkspace, 0); 
      ((GL11Ext) gl).glDrawTexfOES(snappedX, snappedY, 1, width * screenScale, height * screenScale); 

답변

0

스케일링과 오버 샘플링으로 인해 검은 선을 피하기 위해 비트 맵 자르기 공간 주위에 테두리/패딩을 추가해야했습니다.

_cropWorkspace[0] = left + padding; 
_cropWorkspace[1] = top + height - padding; 
_cropWorkspace[2] = width - padding * 2; 
_cropWorkspace[3] = -(height-padding*2); 
관련 문제