0

我正在制作一个多平台游戏引擎(将来会开源),并且我正在制作基于它的游戏。在三星 Galaxy S2 (I9100B) 上进行测试时,它运行良好,但是当我尝试在我的另一部手机 (Samsung Galaxy S) 上运行时,事情变得一团糟。

这是在 Galaxy S2 上运行时的屏幕截图:

在此处输入图像描述

这是我在 Galaxy S 上跑步的时候:

在此处输入图像描述

我也设法减少了场景中三角形的数量,但即使屏幕上有 50 个三角形,我也遇到了同样的问题。禁用照明可以减少问题,但不能消除问题。我认为这是我手机的内存问题,所以我尝试了另一个 Galaxy S,但出现了同样的问题。

有人知道我可以从哪里开始寻找吗?自动 GC 不频繁(大约每 5 秒 2 次)。

三星 Galaxy S2:Android 版本 2.3.4 内核:2.6.35.7-I9100UHKI2-CL553601 se.infra@SEI-07 #2

三星 Galaxy S:Android 版本 2.3.3 内核: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);
                }

            }     

顶点着色器代码:

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

            }
4

2 回答 2

1

尝试提高深度缓冲区精度。

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

于 2011-12-21T17:44:11.077 回答
0

这看起来像一个顶点排序问题。Galaxy S 可能默认开启了背面剔除功能,因此它会移除所有不面向观察者的三角形。可以确定哪些三角形是正面的glFrontFace()

您应该同时尝试顺时针和逆时针,以查看剔除和未剔除的三角形是否交换位置。如果是这样,您必须关闭背面剔除或确保所有三角形的顶点顺序相同。

于 2011-12-23T16:31:13.547 回答