user1110334
user1110334

Reputation:

OpenGL ES 2.0, messing with all things

I'm making a multi-platform Game Engine (Open source in the future), and I was making a game based on it. When testing on a Samsung Galaxy S2 (I9100B), it runs perfectly, but when I tried to run on my other phone (Samsung Galaxy S) the things get messy.

Here is a screenshot when running on Galaxy S2:

enter image description here

And here is when I run on the Galaxy S:

enter image description here

I managed to reduce the number of triangles in the scene too, but even with 50 triangles on the screen I got the same problem. Disabling the lighting reduces the problem, but does not eliminate it. I thought that was a memory problem on my phone, so I tried on another Galaxy S, but the same problem occurs.

Does someone know where I can start looking? The automatic GC is not frequent (about 2 times per 5 seconds).

Samsung Galaxy S2: Android Version 2.3.4 Kernel: 2.6.35.7-I9100UHKI2-CL553601 se.infra@SEI-07 #2

Samsung Galaxy S: Android Version 2.3.3 Kernek: 2.6.35.7-I9000BVJJW4-CL240848 pescio@bldhp-4 #28

Fragment Shader Code: 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 Code:

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

            }

Upvotes: 0

Views: 569

Answers (2)

onitake
onitake

Reputation: 1409

This looks like a vertex ordering issue. The Galaxy S probably has back face culling turned on by default, so it will remove all triangles that do not face the viewer. Which triangles are front-facing can be determined with glFrontFace()

You should try both clockwise and counter-clockwise to see if the culled and non-culled triangles switch places. If they do, you must either turn off back-face culling or make sure the vertex order is the same for all triangles.

Upvotes: 0

Sheridan Bulger
Sheridan Bulger

Reputation: 1214

Try increasing your depth buffer precision.

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

Upvotes: 1

Related Questions