OpenGL ES 2.0, возиться со всеми вещами - PullRequest
0 голосов
/ 21 декабря 2011

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

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

enter image description here

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

enter image description here

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

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

Samsung Galaxy S2: версия Android 2.3.4 для Android: 2.6.35.7-I9100UHKI2-CL553601 se.infra@SEI-07 # 2

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

Код шейдера фрагмента: точность с плавающей точкой;

            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);
                }

            }     

Код вершинного шейдера:

            //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;

            }

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Попробуйте увеличить точность буфера глубины.

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

0 голосов
/ 23 декабря 2011

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

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

...