1

Windows版のChromeWebGL実装の奇妙なバグを見つけたと思います。シェーダーをキャストfloatで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

奇妙なことに、この頂点プログラムは、同じコンピューター(同じグラフィックカード)上のLinuxバージョンで完全に機能します。ドライバーの問題ですか?(2つの異なるグラフィックカードを使用して2つの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;
}    

誰かがエレガントな回避策を見つけたら...

4

3 に答える 3

1

Windows の Chrome と Firefox の WebGL はANGLEで実装されており、これは DirectX を基になる API として使用します。次に、そこで WebGL を使用すると、特定の DirectX 制限/警告/エラーが発生することは驚くことではありません。

そして、実際に float 型を切り捨てています。 T floor(T)orT ceil(T)を使用して、より意味のある結果を取得し、警告を出さないようにします。

于 2012-07-04T13:57:46.913 に答える
1

問題は、ユニフォームが不足していることです。

48 個の mat3 + 49 個の mat4 + 2 個の bool = 1218 個の値 / 4 = 少なくとも 306 個の均一ベクトルが必要

私の GPU では、 gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS) は 254 しか返しません。

306 均一ベクトルは、完全に最適化された GLSL コンパイラ用であることに注意してください。最適化されていないコンパイラの場合、内部的に mat3 に 3 つの vec4 を使用し、各 bool に完全な vec4 を使用するため、より均一なベクトルが必要になります。

MATRIX_ARRAY_SIZE を 35 に下げると、マシンで動作し、36 が失敗するため、これが当てはまるようです。

それぞれ 3 つのベクトルを使用する 35 の mat3 + それぞれ 4 つのベクトルを使用する 36 の mat4 + それぞれ 1 つのベクトルを使用する 2 つの bool = 249 のベクトルが必要です。もう1つ、36には257が必要です。これは、GPUドライバーがサポートするよりも3多いため、失敗します。

注 128 は、サポートする必要がある頂点ユニフォーム ベクトルの最小数です。つまり、どこでも機能させたい場合は、MATRIX_ARRAY_SIZE を 17 に設定する必要があります。フラグメントシェーダー。または、サポートされている均一ベクトルの数を照会し、実行時にシェーダー ソースを変更することもできます。

ここに私のために働くサンプルがあります http://jsfiddle.net/greggman/474Et/2/

上部の 35 を 48 に戻すと、同じエラー メッセージが生成されます。

エラーメッセージがわかりにくいのは残念です。

于 2012-07-04T15:55:13.590 に答える
0

これは、ANGLE リビジョン 1557で修正される必要があります。この修正がメインストリームの Chrome で利用できるようになるまでには、しばらく時間がかかります。

于 2012-11-29T21:29:56.773 に答える