渲染 WebGL 时特定于 Windows 的问题.属性设置为零

Windows-specific issue when rendering WebGL... attribute set to zero?

本文关键字:属性 问题 设置 Windows WebGL 渲染      更新时间:2023-09-26

我在使用 WebGL 时遇到了一个难以调试的问题。 我正在为CraftyJS游戏框架实现WebGL后端。 在OSX,Linux和Android上一切正常,但是当协作者在Windows上进行测试时,出现了一个重要的错误 - 旋转的精灵呈现为未旋转! 我能够在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属性有关——它用于计算旋转矩阵。 使用 Firefox 的着色器编辑器,如果我手动指定entityOriginentityRotationMatrix那么程序将正确渲染。 但默认情况下,它呈现为好像 aOrientation 属性的所有组件都只有 0。 着色器的所有其他方面(定位+尺寸、颜色、alpha 透明度、视口比例/平移(似乎都可以正常工作;只有依赖于aOrientation的行为才会被破坏,而且似乎只依赖于Windows。

由于我很少访问Windows机器,因此很难调试。 是否有任何特定于Windows(或特定于硬件/驱动程序?(的问题可能会以某种方式导致设置该特定属性时出现问题?

想通了,一旦我真正有时间坐下来与Windows机器进行实验 - 编译器正在"优化"我在Windows上的属性。 我想这可能是依赖于驱动程序/平台/硬件的,这是有道理的。

解决方案是将以下行放在main()内部而不是外部。

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

我想我真的不明白 main 内部的代码和 main 外部的代码之间的区别。 要研究的东西! :)