2011-12-21 204 views
0

我正在製作一個多平臺遊戲引擎(未來的開源),並且我正在製作一個基於它的遊戲。在三星Galaxy S2(I9100B)上進行測試時,它可以完美運行,但是當我嘗試在其他手機(Samsung Galaxy S)上運行時,情況變得很糟糕。OpenGL ES 2.0,與所有東西混合

這裏是銀河S2運行時的屏幕截圖:

enter image description here

,這裏是當我在Galaxy S的運行:

enter image description here

我設法減少數量三角形也在場景中,但即使在屏幕上有50個三角形,我也遇到了同樣的問題。 禁用照明可以減少問題,但不會消除它。我認爲這是我的手機內存問題,所以我嘗試了另一個Galaxy S,但同樣的問題發生。

有人知道我可以從哪裏開始尋找?自動GC不頻繁(每5秒約2次)。

三星Galaxy S2: 的Android 2.3.4版 內核:2.6.35.7-I9100UHKI2-CL553601 [email protected]#2

三星Galaxy S: 的Android版本2.3.3 Kernek: 2.6.35.7-I9000BVJJW4-CL240848 pescio @ bldhp-4#28

片段着色器代碼: precision mediump float;

  uniform sampler2D uSampler; 

      uniform float uIsPoint; 
      uniform float uEnableLight; 
      uniform float uDisableTexture; 

      varying vec4 vColor; 
      varying vec2 vTextureCoord; 

      varying vec4 vPosition; 
      uniform vec3 uPointLightingColor; 

      varying vec3 vColorWeight; 

      void main(){ 

       if(uIsPoint >= 2.0) { 
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
       }else{ 
        vec4 calcColor; 
        if(uEnableLight >= 2.0) 
         calcColor = vec4(vColor.rgb * vColorWeight, vColor.a); 
        else 
         calcColor = vColor; 
        vec4 texColor = vec4(1.0,1.0,1.0,1.0); 
        if(uDisableTexture < 2.0) 
         texColor = texture2D(uSampler, vTextureCoord); 
        gl_FragColor = vec4(texColor.rgb * calcColor.rgb, texColor.a*calcColor.a); 
       } 

      }  

的Vertex Shader代碼:

  //Atributos 

      uniform mat4 uMVMatrix; //Model/View Matrix 
      uniform mat4 uPMatrix; //Model/View/Projection Matrix 
      uniform mat3 uNMatrix; //Normal Matrix 

      attribute vec3 aVertexPosition; 
      attribute vec4 aVertexColor; 
      attribute vec2 aTextureCoord; 
      attribute vec3 aNormal; 

      varying vec4 vColor; 
      varying vec2 vTextureCoord; 
      varying vec3 vNormal; 
      varying vec4 vPosition; 

      //Lighting 
      uniform vec3 uAmbientColor; 
      uniform vec3 uLightDir; 
      uniform vec3 uLightColor; 
      uniform vec3 uSpecLightColor; 
      uniform float uShine; 
      varying vec3 vColorWeight; 
      void main(){ 

       //Lighting 
       vec3 normal = normalize(uNMatrix * aNormal); 
       vec3 lightNorm = normalize(uLightDir); 
       float lightWeight = max(dot(aNormal,lightNorm),0.0); 
       vec3 halfVec = normalize(uLightDir - gl_Position.xyz); 
       float specWeight = pow(max(dot(normal,halfVec),0.0),uShine); 
       vColorWeight = uAmbientColor + (lightWeight * uLightColor) + (uSpecLightColor*specWeight); 
       //Others 

       vNormal  = uNMatrix * aNormal; 

       vPosition = uMVMatrix * vec4(aVertexPosition,1.0); 
       gl_Position = uPMatrix * vPosition; 

       vColor = aVertexColor; 
       gl_PointSize = 2.0; 
       vTextureCoord = aTextureCoord; 

      } 

回答

1

嘗試增加你的深度緩衝精度。

http://www.opengl.org/wiki/Depth_Buffer_Precision

+0

當我讀取深度緩衝區時精度由zFar和zNear規格在製作Perpective Matrix時給出。減少zFar和zNear之間的差異會增加深度緩衝區(如我所讀)。我減少到最小值,我可以,爲znar 2.5f和24.5f zFar,沒有解決:/ - 也試過gl.glDepthFunc(GL10.GL_LEQUAL);但它只是使其工作非常緩慢。 – 2011-12-21 20:52:07

+0

如果你想測試問題是由深度緩衝區引起的,我建議徹底關閉它。 'glDisable(GL_DEPT_TEST);'做到這一點。但是你應該同時啓用背面剔除,否則結果會顯得很怪異。 – onitake 2011-12-23 16:26:36

0

這看起來像一個頂點順序問題。 Galaxy S可能會默認開啓背面剔除功能,因此它會移除所有不面向觀看者的三角形。 哪些三角形朝前,可以glFrontFace()

確定你應該嘗試順時針和逆時針轉動,看是否被剔除的和非撲殺三角形切換的地方。如果他們這樣做,則必須關閉背面剔除或確保所有三角形的頂點順序相同。