2011-09-19 2 views
4

내가 개방형 글자 초보자임을 인정하여 서두시겠습니까? 기적과는 거리가 멀다. 개발하고있는 게임과는 거리가 멀다.Android OpenGL 텍스처가 스프린트에서 끔찍한 것처럼 보입니다. Samsung Galaxy s2 Epic Touch 4g

텍스처가 HTC Evo 3d, Droid Bionic 및 벼락에서 잘 보입니다. 방금 Sprint Samsung Galaxy s2를 구입하고 텍스처가 끔찍한 것으로 보았습니다. 제 이론은 더 큰 스크린이었고 더 낮은 dpi 효과는 텍스처 매그 필터링에 영향을 미쳤습니다 (다른 이론은 내가하는 일을 잘 모르는 것입니다).

스크린 # 1 Galaxy S2HTC Evo 3d
스크린 # 2 Galaxy S2HTC Evo 3d

내가 로이드 BitmapFactory 디코딩하는 옵션을 전달하는 16 비트, 24 비트 및 32 비트 텍스쳐를 이용하여 디더링을 활성화/비활성화 시도 메서드를 사용하여 크기 조정을 방지하고, 아래의 코드 조각에서 내 OpenGL 설정을 사용하지 못하도록 설정하고, setegLConfigChooser로 사용자 정의 eglconfig 값의 다른 조합을 설정합니다. 이제는 어둠 속에서 촬영을하고 있습니다.

내 질문은 : 어떤 OpenGL 기능이 해당 스크린 샷에서 본 색상 밴딩 (?)/불량한 텍스처를 생성 할 수 있었습니까? 노트의 또한 가치

:

  • 열린 GL 오류가 (내가 모든 열려있는 GL 통화 로그)이 없습니다
  • 내가 (이상의 광원 응용 프로그램의 성능이 상당히 저하 추가하면 HTC 에보 (Evo) 3D 반면, 생체 공학 및 벼락은 하나 이상의 광원으로 완벽하게 작동합니다.)
  • 의 OpenGL ES I는 최소 3 차원 프레임 워크
  • 스크린 및 해상도 사용
  • 1.1 (내 애플 리케이션에 어떤 GLES20 예) :
  • HTC 에보 (Evo)를 3 차원 : 4.3 "화면 540x960 해상도
  • Samasung 스프린트 갤럭시 S2 : 나는 지난 3 일 동안 격렬하게 검색 좀
getWindowManager().getDefaultDisplay().getPixelFormat(); 
// HTC Evo 3d: 1 (PixelFormat.RGBA_8888) 
// Sprint Samsung Galaxy s2: 5 (???) 

4.52 "화면 800 × 480 해상도가 다른 사람이 비슷한 문제가되고 아무것도 발견되지 않은 경우 확인합니다. 시간 내 주셔서 감사합니다.

//##################   
//# setup (one time calls) 
//################## 

_gl.glEnable(GL11.GL_DITHER); 
_gl.glEnable(GL10.GL_DEPTH_TEST); 
_gl.glClearDepthf(1.0f); 
_gl.glDepthFunc(GL10.GL_LESS); 
_gl.glDepthRangef(0, 1f); 
_gl.glDepthMask(true); 
_gl.glShadeModel(GL10.GL_SMOOTH); 

// Alpha enabled 
_gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
_gl.glAlphaFunc(GL10.GL_GREATER, 0.1f); 

// CCW frontfaces only, by default 
_gl.glFrontFace(GL10.GL_CCW); 
_gl.glCullFace(GL10.GL_BACK); 
_gl.glEnable(GL10.GL_CULL_FACE); 


//##################   
//# onSurfaceCreated 
//################## 

// build the lights - note this is specific to the min3d framework but 
// its pretty straightforward - if a change is made to a light source the dirty flag  is set 
// and calls will be made to opengl to udpate accordingly in the onDrawFrame method 
Light light1 = new Light(); 
light1.position.setAll(0, 10, 0); 
light1.ambient= new Color4Managed(255, 255, 255, 255, light1); 
light1.diffuse = new Color4Managed(255, 255, 255, 255, light1); 
light1.specular = new Color4Managed(255, 255, 255, 255, light1); 
light1.type(LightType.DIRECTIONAL);  
_scene.lights().add(light1); 


//##################   
//# onSurfaceChanged 
//################## 

public void onSurfaceChanged(GL10 gl, int w, int h) { 
    this.w = w; 
    this.h = h; 
    _surfaceAspectRatio = (float) w/(float) h; 
    _gl.glViewport(0, 0, w, h); 

    // all the following updates the frustum 
    FrustumManaged vf = _scene.camera().frustum; 
    float n = vf.shortSideLength()/2f; 
    float lt, rt, btm, top; 
    lt = vf.horizontalCenter() - n * _surfaceAspectRatio; 
    rt = vf.horizontalCenter() + n * _surfaceAspectRatio; 
    btm = vf.verticalCenter() - n * 1; 
    top = vf.verticalCenter() + n * 1; 

    if (_surfaceAspectRatio > 1) { 
     lt *= 1f/_surfaceAspectRatio; 
     rt *= 1f/_surfaceAspectRatio; 
     btm *= 1f/_surfaceAspectRatio; 
     top *= 1f/_surfaceAspectRatio; 
    } 

    _gl.glFrustumf(lt, rt, btm, top, vf.zNear(), vf.zFar()); 

    Util.out("UPDATE VIEW FRUSTUM _surfaceAspectRatio: " + this._surfaceAspectRatio +  " w: " + this.w + " h: " + this.h); 
    Util.out("UPDATE VIEW FRUSTUM lt: " + lt + " rt: " + rt + " btm: " + btm + " top:  " + top + " vf.zNear(): " + vf.zNear() + " vf.zFar(): " + vf.zFar()); 

    // sprint samsung galaxy 2s epic touch 4g 
    // 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW  FRUSTUM _surfaceAspectRatio: 0.97959185 w: 480 h: 490 
    // 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW  FRUSTUM lt: -0.48979592 rt: 0.48979592 btm: -0.5 top: 0.5 vf.zNear(): 1.0  vf.zFar(): 30.0 

    // htc evo 3d 
    // 09-18 23:46:16.744: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM _surfaceAspectRatio: 0.83076924 w: 540 h: 650 
    // 09-18 23:46:16.754: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM lt: -0.41538462 rt: 0.41538462 btm: -0.5 top: 0.5 vf.zNear(): 1.0 vf.zFar(): 30.0 
} 


//##################   
//# upload texture 
//################## 

int[] a = new int[1]; 
_gl.glGenTextures(1, a, 0); // create a 'texture name' and put it in array element 0 
_gl.glBindTexture(GL10.GL_TEXTURE_2D, a[0]); 

if ($generateMipMap && _gl instanceof GL11) { 
    _gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE); 
}else { 
    _gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_FALSE); 
} 

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


//##################   
//# onDrawFrame 
//################## 

// draw setup 
_gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   

// enable or disable lights 
if(_scene.lights().isDirty()){ 
    for (int glIndex = 0; glIndex < NUM_GLLIGHTS; glIndex++) { 
     if (_scene.lights().glIndexEnabledDirty()[glIndex] == true) { 
      if (_scene.lights().glIndexEnabled()[glIndex] == true) { 
       _gl.glEnable(GL10.GL_LIGHT0 + glIndex); 
        _scene.lights().getLightByGlIndex(glIndex).setAllDirty(); 
       } else { 
        _gl.glDisable(GL10.GL_LIGHT0 + glIndex); 
       } 
       _scene.lights().glIndexEnabledDirty()[glIndex] = false; //  clear dirtyflag 
      } 
     } 
    _scene.lights().clearDirtyFlag(); 
} 

// handle individual light settings 
Light[] lights = _scene.lights().toArray(); 
for (int i = 0; i < lights.length; i++) { 
    Light light = lights[i]; 
    if (light.isDirty()) // .. something has changed 
    { 
     int glLightId = GL10.GL_LIGHT0 + _scene.lights().getGlIndexByLight(light); 

     if (light.position.isDirty()) { 
      light.commitPositionAndTypeBuffer(); 
      _gl.glLightfv(glLightId, GL10.GL_POSITION, light.positionAndTypeBuffer()); 
      light.position.clearDirtyFlag(); 
     } 

     if (light.ambient.isDirty()) { 
      light.ambient.commitToFloatBuffer(); 
      _gl.glLightfv(glLightId, GL10.GL_AMBIENT, ligh t.ambient.floatBuffer()); 
      light.ambient.clearDirtyFlag(); 
     } 

     if (light.diffuse.isDirty()) { 
      light.diffuse.commitToFloatBuffer(); 
      _gl.glLightfv(glLightId, GL10.GL_DIFFUSE, light.diffuse.floatBuffer()); 
      light.diffuse.clearDirtyFlag(); 
     } 

     if (light.specular.isDirty()) { 
      light.specular.commitToFloatBuffer(); 
      _gl.glLightfv(glLightId, GL10.GL_SPECULAR, light.specular.floatBuffer()); 
      light.specular.clearDirtyFlag(); 
     } 

     if (light.isVisibleBm().isDirty()) { 
      if (light.isVisible()) { 
       _gl.glEnable(glLightId); 
      } else { 
       _gl.glDisable(glLightId); 
      } 
      light.isVisibleBm().clearDirtyFlag(); 
     } 

     if (light.attenuation().isDirty()) { 
      _gl.glLightf(glLightId, GL10.GL_CONSTANT_ATTENUATION, light.attenuation().getX()); 
      _gl.glLightf(glLightId, GL10.GL_LINEAR_ATTENUATION, ligh t.attenuation().getY()); 
      _gl.glLightf(glLightId, GL10.GL_QUADRATIC_ATTENUATION, light.attenuation().getZ()); 
     } 

     light.clearDirtyFlag(); 
    } 
} 

// finally draw objects (see definition below) 
foreach(Object3d $o : _scene.children()){ 
    drawObject($o); 
} 


//##################   
//# draw 3d object 
//################## 

_gl.glEnable(GL10.GL_LIGHTING); 
_gl.glEnable(GL10.GL_TEXTURE_2D); 
_gl.glEnable(GL10.GL_ALPHA_TEST); 
_gl.glEnable(GL10.GL_BLEND); 
_gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
_gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 
_gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 

$o.vertices().normals().buffer().position(0); 
_gl.glNormalPointer(GL10.GL_FLOAT, 0, $o.vertices().normals().buffer()); 

_gl.glEnable(GL10.GL_CULL_FACE); 

// draw texture function info below 
drawObject_textures($o); 

_gl.glTranslatef($o.position().x, $o.position().y, $o.position().z); 
_gl.glRotatef(($o.rotation().x), 1, 0, 0); 
_gl.glRotatef(($o.rotation().y), 0, 1, 0); 
_gl.glRotatef(($o.rotation().z), 0, 0, 1); 

_gl.glScalef($o.scale().x, $o.scale().y, $o.scale().z); 

$o.vertices().points().buffer().position(0); 
_gl.glVertexPointer(3, GL10.GL_FLOAT, 0, $o.vertices().points().buffer()); 

$o.faces().buffer().position(pos); 

_gl.glDrawElements($o.renderTypeInt(), $o.faces().size() * FacesBufferedList.PROPERTIES_PER_ELEMENT, GL10.GL_UNSIGNED_SHORT,$o.faces().buffer()); 


//##################   
//# draw texture 
//################## 

int minFilterType = ZoneActivity.mipmap ? GL10.GL_NEAREST_MIPMAP_NEAREST :  GL10.GL_NEAREST; 

$o.vertices().uvs().buffer().position(0); 

_gl.glActiveTexture(GL10.GL_TEXTURE0); 
_gl.glClientActiveTexture(GL10.GL_TEXTURE0); 
_gl.glBindTexture(GL10.GL_TEXTURE_2D, $o.glTextureId); 
_gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, $o.vertices().uvs().buffer()); 
_gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, minFilterType); 
_gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);  
_gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
_gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);  

편집 : 그것은 나이었습니다. 텍스처 문제와 같은 것은 안개 함수 (자연스럽게 코드 샘플에서 생략 한)에 잘못된 값을 전달하는 부작용이었습니다. 이를 닫

나쁜

// I was not converting my rgba shorts to the expected range (0.0f, 1.0f). 
// the evo 3d, bionic, etc. must compensate for people like me and translate 
// this to white so i never knew there was a problem 
_gl.glFogfv(GL10.GL_FOG_COLOR, [255f,255f,255f,255f]); 

좋은

_gl.glFogfv(GL10.GL_FOG_COLOR, [1.0f, 1.0f, 1.0f, 1.0f]); 

그것의 아마 안전합니다.

답변

1

어둠 속에서 찌르는 듯하지만 (GL을 사용하지는 않았습니다 만) 게시 한 이미지와 코드 줄을 "GL10.GL_NEAREST_MIPMAP_NEAREST"또는 (더 악화되었습니다!) "GL10.GL_NEAREST ", 당신은 추악한 텍스처 필터링을 얻을 것입니다. 대신 "LINEAR"필터를 사용해보십시오.

관련 문제