我正在为我的游戏探索WebGL的功能,并在各种设备上进行测试。现在我正在使用Turbulenz Engine来处理所有这样的渲染。
然而,在我测试的一些手机和标签设备上(三星Galaxy和三星Galaxy Tab II),纹理没有正确渲染。它们要么不显示,要么变成黑色或空白颜色。
我的设置如下:
看一下我制作的截图:
我做了一些重新搜索并找到了this page describing the exact same problem。不幸的是,很好地解释了为什么会出现这种情况并且没有提供解决方案。
您是否对这些“旧”设备有过这方面的经验,以及为什么会出现这个问题?我已经读过某个地方操作系统在加载纹理时缩放纹理,可能就是这种情况吗?那么如何避免呢?
提前谢谢!
答案 0 :(得分:2)
错误
bindAttribLocation: index out of range
表明代码试图使用太多属性。要了解GPU支持的属性数量,请调用
maxAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
8是WebGL实现必须支持的最小值。
bindAttribLocation
的错误表示名为bindAttribLocation
的代码,其值为> = maxAttributes
这有点令人惊讶,因为对于大多数常见的3D应用程序,它们将具有位置,法线,纹理坐标,然后可能是切线,副法线,顶点颜色。这只有6个属性。第二组或第三组纹理坐标并不是不同寻常的,但是看起来非常罕见。不过,这就是错误信息所暗示的内容。
只是为了它,我检查了Score Rush,一个turbulenz游戏。它使用属性0,3和8.为什么不是0,1和2我不知道,但在任何只支持尝试使用属性8的最少8个属性的设备上将失败,因为7是最高属性。 / p>
更新:我查看了turbulenz的来源。按照目前的设计,它需要16个属性。它为每个属性0到15提供了特定的用途。因此,例如第一组纹理坐标总是在属性8上。(这就是为什么你看到纹理消失了)。第一组切线总是在属性14上。等等。这是作业列表
SEMANTIC_POSITION = 0;
SEMANTIC_POSITION0 = 0;
SEMANTIC_BLENDWEIGHT = 1;
SEMANTIC_BLENDWEIGHT0 = 1;
SEMANTIC_NORMAL = 2;
SEMANTIC_NORMAL0 = 2;
SEMANTIC_COLOR = 3;
SEMANTIC_COLOR0 = 3;
SEMANTIC_COLOR1 = 4;
SEMANTIC_SPECULAR = 4;
SEMANTIC_FOGCOORD = 5;
SEMANTIC_TESSFACTOR = 5;
SEMANTIC_PSIZE0 = 6;
SEMANTIC_BLENDINDICES = 7;
SEMANTIC_BLENDINDICES0 = 7;
SEMANTIC_TEXCOORD = 8;
SEMANTIC_TEXCOORD0 = 8;
SEMANTIC_TEXCOORD1 = 9;
SEMANTIC_TEXCOORD2 = 10;
SEMANTIC_TEXCOORD3 = 11;
SEMANTIC_TEXCOORD4 = 12;
SEMANTIC_TEXCOORD5 = 13;
SEMANTIC_TEXCOORD6 = 14;
SEMANTIC_TEXCOORD7 = 15;
SEMANTIC_TANGENT = 14;
SEMANTIC_TANGENT0 = 14;
SEMANTIC_BINORMAL0 = 15;
SEMANTIC_BINORMAL = 15;
需要进行一些重新设计或间接操作才能使其在少于16个属性的GPU上运行。