首页 > 解决方案 > 从 Firefox 中的事件处理程序重绘时,每个顶点的 gl_VertexID 为零

问题描述

gl_VertexID用于纹理选择(将其以变量从顶点传递到片段着色器),这种方法适用于 first drawElements(). 但是当我在事件中重绘帧时,我的着色器在 Firefox 中的每个顶点mousemove都为零(在 Chrome 上它工作得很好)。gl_VertexID

更新:我附上了我的着色器的代码:

顶点.glsl:

#version 300 es

precision mediump float;

in vec2 texture;
in vec3 position;

out vec2 vert_texture;
flat out int vert_vertex_id;

uniform mat4 projection;
uniform mat4 view;

void main() {
    vert_texture = texture;
    vert_vertex_id = gl_VertexID;
    gl_Position = projection * view * vec4(position, 1.0);
}

片段.glsl

#version 300 es

precision mediump float;

in vec2 vert_texture;
flat in int vert_vertex_id;

out vec4 frag_color;

uniform int texture_index[MAX_TEXTURE_IMAGE_UNITS];
uniform sampler2D textures[MAX_TEXTURE_IMAGE_UNITS];

vec4 get_texture_color(int index, vec2 point) {
    switch (index) {
        case 0: return texture(textures[0], point);
        case 1: return texture(textures[1], point);
        case 2: return texture(textures[2], point);
        case 3: return texture(textures[3], point);
        case 4: return texture(textures[4], point);
        case 5: return texture(textures[5], point);
        case 6: return texture(textures[6], point);
        case 7: return texture(textures[7], point);
#if MAX_TEXTURE_IMAGE_UNITS >= 16
        case 8: return texture(textures[8], point);
        case 9: return texture(textures[9], point);
        case 10: return texture(textures[10], point);
        case 11: return texture(textures[11], point);
        case 12: return texture(textures[12], point);
        case 13: return texture(textures[13], point);
        case 14: return texture(textures[14], point);
        case 15: return texture(textures[15], point);
#endif
#if MAX_TEXTURE_IMAGE_UNITS >= 32
        case 16: return texture(textures[16], point);
        case 17: return texture(textures[17], point);
        case 18: return texture(textures[18], point);
        case 19: return texture(textures[19], point);
        case 20: return texture(textures[20], point);
        case 21: return texture(textures[21], point);
        case 22: return texture(textures[22], point);
        case 23: return texture(textures[23], point);
        case 24: return texture(textures[24], point);
        case 25: return texture(textures[25], point);
        case 26: return texture(textures[26], point);
        case 27: return texture(textures[27], point);
        case 28: return texture(textures[28], point);
        case 29: return texture(textures[29], point);
        case 30: return texture(textures[30], point);
        case 31: return texture(textures[31], point);
#endif
    }
}

void main() {
    for (int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; ++i) {
        if (vert_vertex_id < texture_index[i]) {
            frag_color = get_texture_color(i, vert_texture);
            break;
        }
    }
}

这里我使用gl_VertexID从顶点着色器传递来通过访问来确定多个纹理texture_index

更新 2:我在 Safari 上发现了相同的行为(启用 WebGL2 之后),所以我可以假设这不是 Firefox 错误。

标签: firefoxsafariwebglwebgl2

解决方案


推荐阅读