我正在使用WebGL遇到难以调试的问题。我正在为CraftyJS游戏框架实现WebGL后端。在OSX,Linux和Android上一切都运行得非常好,但是当一个合作者在Windows上测试时出现了一个重要的错误 - 旋转的精灵呈现为未旋转!我能够通过IE,Chrome和Firefox复制这个。我使用的vertex program类型的示例,它只是呈现彩色矩形:
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
属性有关 - 它用于计算旋转矩阵。使用Firefox的着色器编辑器,如果我手动指定entityOrigin
和entityRotationMatrix
,则程序将正确呈现。但默认情况下,它呈现的方式好像aOrientation
属性的所有组件都只是0.着色器的每个其他方面(定位+尺寸,颜色,Alpha透明度,视口缩放/平移)似乎都可以正常工作;它唯一依赖于aOrientation
的行为是破坏的,而且似乎只在Windows上运行。
由于我不经常访问Windows机器,因此很难调试。是否存在任何特定于Windows的(或特定于硬件/驱动程序的?)问题,这些问题可能会以某种方式导致设置某个特定属性的问题?
答案 0 :(得分:0)
想出来,一旦我真的有时间坐下来使用Windows机器和实验 - 编译器正在“优化”我在windows上的属性。我想这可能是驱动程序/平台/硬件依赖。
解决方案是将以下行放在main()
内而不是在其外部。
vec2 entityOrigin = aOrientation.xy;
mat2 entityRotationMatrix = mat2(cos(aOrientation.z), sin(aOrientation.z), -sin(aOrientation.z), cos(aOrientation.z));
我想我真的不明白main内部的代码和它之外的代码之间的区别。有待观察的东西! :)