2011-12-21 3 views
0

Я создаю многоплатформенный игровой движок (с открытым исходным кодом в будущем), и я основывал на нем игру. При тестировании на Samsung Galaxy S2 (I9100B) он работает отлично, но когда я пытался работать на другом телефоне (Samsung Galaxy S), все становится беспорядочным.OpenGL ES 2.0, возиться со всеми вещами

Вот скриншот при работе на Galaxy S2:

enter image description here

А вот когда я бегу на Galaxy S:

enter image description here

мне удалось уменьшить количество треугольники в сцене тоже, но даже с 50 треугольниками на экране у меня такая же проблема. Отключение освещения уменьшает проблему, но не устраняет ее. Я думал, что это проблема памяти на моем телефоне, поэтому я попробовал еще одну Galaxy S, но та же проблема возникает.

Кто-нибудь знает, где я могу начать искать? Автоматический ГХ нечасто (около 2 раз в 5 секунд).

Samsung Galaxy S2: Android версии 2.3.4 Ядро: 2.6.35.7-I9100UHKI2-CL553601 [email protected] # 2

Samsung Galaxy S: Android версии 2.3.3 Kernek: 2.6.35.7-I9000BVJJW4-CL240848 pescio @ bldhp-4 # 28

Фрагмент шейдерного кода: прецизионный 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 при создании Перспективной матрицы. Уменьшение разницы между zFar и zNear увеличивает буфер глубины (как я читал). Я уменьшил до минимальных значений I, 2.5f для zNear и 24.5f до zFar, не решил:/- Также попытался gl.glDepthFunc (GL10.GL_LEQUAL); но это только заставило его работать очень медленно. –

+0

Если вы хотите протестировать проблему, вызванную буфером глубины, я предлагаю полностью отключить ее. 'glDisable (GL_DEPT_TEST);' трюк. Но вы должны одновременно активировать обратную грань, или результат будет очень странным. – onitake

0

Это выглядит как вопрос упорядочения вершин. По умолчанию Galaxy S, по-видимому, отключил отбрасывание лица, поэтому он удалит все треугольники, которые не смотрят на зрителя. Какие треугольники имеют обратную сторону, можно определить с помощью glFrontFace()

Вы должны попробовать как по часовой стрелке, так и против часовой стрелки, чтобы проверить, не переключаются ли выбранные и не выбранные треугольники. Если это так, вы должны либо отключить отбрасывание задней поверхности, либо убедиться, что порядок вершин одинаковый для всех треугольников.