将WebGL …属性设置为零时的Windows特定问题?

我正在使用WebGL进入一个难以debugging的问题。 我正在为CraftyJS游戏框架实现一个WebGL后端。 一切工作在OSX,Linux和Android的绝对好,但是当一个合作者在Windows上testing时,有一个重要的错误 – 旋转的精灵呈现不旋转! 我能够在IE,Chrome和Firefox上复制这个。 我正在使用的顶点程序的一个例子,它只是呈现一个彩色的矩形:

attribute vec2 aPosition; attribute vec3 aOrientation; attribute vec4 aExtra; attribute vec4 aColor; varying lowp vec4 vColor; uniform vec4 uViewport; mat4 viewportScale = mat4(2.0 / uViewport.z, 0, 0, 0, 0, -2.0 / uViewport.w, 0,0, 0, 0,1,0, -1,+1,0,1); vec4 viewportTranslation = vec4(uViewport.xy, 0, 0); vec2 entityOrigin = aOrientation.xy; mat2 entityRotationMatrix = mat2(cos(aOrientation.z), sin(aOrientation.z), -sin(aOrientation.z), cos(aOrientation.z)); void main() { vec2 pos = aPosition; pos = entityRotationMatrix * (pos - entityOrigin) + entityOrigin ; gl_Position = viewportScale * (viewportTranslation + vec4(pos, 1.0/(1.0+exp(aExtra.x) ), 1) ); vColor = vec4(aColor.rgb*aColor.a*aExtra.y, aColor.a*aExtra.y); } 

这个问题似乎与aOrientation属性有关 – 它用来计算旋转matrix。 使用Firefox的着色器编辑器,如果我手动指定entityOriginentityRotationMatrix那么程序将正确渲染。 但默认情况下,渲染就好像aOrientation属性的所有组件都只是0一样。着色器的每个其他方面(定位+尺寸,颜色,alpha透明度,视口缩放/平移)似乎都可以正常工作; 只有依赖于一个aOrientation行为被破坏了,看起来只有在Windows上。

由于我只是不经常访问Windows机器,所以很难debugging。 是否有任何特定于Windows(或硬件/驱动程序?)的问题,可能会导致问题设置一个特定的属性?

Solutions Collecting From Web of "将WebGL …属性设置为零时的Windows特定问题?"

一旦我真的有时间坐下来用Windows机器进行实验 – 编译器就是在窗口上“优化”掉我的属性。 我想这是有道理的,这可能是驱动程序/平台/硬件依赖。

解决方法是将下面的行放在main()而不是放在它的外面。

 vec2 entityOrigin = aOrientation.xy; mat2 entityRotationMatrix = mat2(cos(aOrientation.z), sin(aOrientation.z), -sin(aOrientation.z), cos(aOrientation.z)); 

我想我真的不明白在主内部的代码和外部的代码之间的区别。 有什么东西要看! 🙂