Google chrome Windows Chrome浏览器上的WebGL:将浮点转换为int时发出警告X3206

Google chrome Windows Chrome浏览器上的WebGL:将浮点转换为int时发出警告X3206,google-chrome,webgl,Google Chrome,Webgl,我想我发现了Windows版本的Chrome WebGL实现的一个奇怪的bug。将具有投射浮点的着色器链接到int会导致“警告X3206:向量类型的隐式截断”错误。我试过很多方法来避免它,但没有机会 例如: int i; vec3 u = vec3(1.5, 2.5, 3.5); float z = u.z; i = int(u.z): // warning X3206: implicit truncation of vector type i = int(z): // warning X3

我想我发现了Windows版本的Chrome WebGL实现的一个奇怪的bug。将具有投射浮点的着色器链接到int会导致“警告X3206:向量类型的隐式截断”错误。我试过很多方法来避免它,但没有机会

例如:

int i;
vec3 u = vec3(1.5, 2.5, 3.5);
float z = u.z;

i = int(u.z): // warning X3206: implicit truncation of vector type
i = int(z):  // warning X3206: implicit truncation of vector type
奇怪的是,这个vertex程序在同一台计算机(同一个图形卡)的Linux版本上完美地工作。这是司机的问题吗?(我用两个不同的图形卡在两个Windows版本上进行了测试,结果相同)。(对我来说)另一件奇怪的事:X3206是一个普通的DirectX错误(?!)与WebGL有什么关系

以下是我使用的完整着色器并引发警告:

#define MATRIX_ARRAY_SIZE 48

/* vertex attributes */
attribute vec4 p;
attribute vec3 n;
attribute vec3 u;
attribute vec3 t;
attribute vec3 b;
attribute vec4 c;
attribute vec4 i;
attribute vec4 w;

/* enable vertex weight */
uniform bool ENw;

/* enable comput tangent */
uniform bool ENt;

/* eye view matrix */
uniform mat4 MEV;

/* transform matrices */
uniform mat4 MXF[MATRIX_ARRAY_SIZE];

/* transform normal matrices */
uniform mat3 MNR[MATRIX_ARRAY_SIZE];

/* varying fragment shader */
varying vec4 Vp;
varying vec3 Vn;
varying vec2 Vu;
varying vec3 Vt;
varying vec3 Vb;
varying vec4 Vc;

void main(void) {

    /* Position et Normal transform */
    if(ENw) { /* enable vertex weight */

        Vp = vec4(0.0, 0.0, 0.0, 0.0);
        Vn = vec3(0.0, 0.0, 0.0);

        Vp += (MXF[int(i.x)] * p) * w.x;
        Vn += (MNR[int(i.x)] * n) * w.x;

        Vp += (MXF[int(i.y)] * p) * w.y;
        Vn += (MNR[int(i.y)] * n) * w.y;

        Vp += (MXF[int(i.z)] * p) * w.z;
        Vn += (MNR[int(i.z)] * n) * w.z;

        Vp += (MXF[int(i.w)] * p) * w.w;
        Vn += (MNR[int(i.w)] * n) * w.w;

    } else {

        Vp = MXF[0] * p;
        Vn = MNR[0] * n;
    }

    /* Tangent et Binormal transform */
    if(ENt) { /* enable comput tangent */

        vec3 Cz = cross(Vn, vec3(0.0, 0.0, 1.0));
        vec3 Cy = cross(Vn, vec3(0.0, 1.0, 0.0));

        if(length(Cz) > length(Cy)) {
            Vt = Cz;
        } else {
            Vt = Cy;
        }

        Vb = cross(Vn, Vt); 

    } else {

        Vt = t;
        Vb = b;
    }

    /* Texcoord et color */
    Vu = u.xy;
    Vc = c;
    gl_PointSize = u.z;
    gl_Position = MEV * Vp;
}    

如果有人找到了一个很好的解决方案…

Windows中的Chrome和Firefox的WebGL是用实现的,它反过来又使用DirectX作为底层API。因此,在那里使用WebGL时,某些DirectX限制/警告/错误增加也就不足为奇了


如果您确实要截断浮点类型,请使用
T floor(T)
T cell(T)
以获得更有意义的结果,而无需发出警告。

问题是您的制服已经用完了

48个MAT3+49个MAT4+2个布尔值=1218个值/4=至少需要306个均匀向量

在我的GPU上,gl.getParameter(gl.MAX\u VERTEX\u UNIFORM\u VECTORS)仅返回254

请注意,306统一向量用于完美优化GLSL编译器。对于未优化的编译器,它可能会在内部为mat3使用3个vec4,为每个布尔使用一个完整的vec4,这使得它需要更统一的向量

这似乎是事实,因为如果我将矩阵数组大小降低到35,它在我的机器上工作,而36失败

35个MAT3,每个使用3个向量+36个MAT4,每个使用4个向量+2个布尔,每个使用1个向量=需要249个向量。还有一点,36需要257,这比我的GPU驱动程序支持的多3个,这就是为什么它失败的原因

注128是需要支持的顶点均匀向量的最小数量,这意味着如果希望它在任何地方都能工作,则需要将矩阵\数组\大小设置为17。另一方面,我不知道你在片段着色器中使用了什么制服。或者,您可以查询支持的统一向量的数量,并在运行时修改着色器源

这是一个适合我的样品

将顶部的35改回48,它将生成相同的错误消息

错误消息很神秘,这很糟糕。

这应该在中修复。这将需要一段时间来修复成为主流铬