firefox - 从 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 错误。
解决方案
推荐阅读
- informatica-powercenter - 具有完全相同会话属性的 2 个映射的行为完全不同,逻辑略有变化
- mysql - 列中项目之间的差异
- javascript - 带花括号的 Es6 类
- css - 灯箱位置不会停留在固定位置 div 内
- angular - 量角器,辅助函数未接收更新值
- ms-access - 当没有可见按钮时隐藏功能区选项卡
- ruby - Ruby 2.5.1 崩溃 - 如何读取此内存映射?
- python - 获取 Pandas 数据框的列分组
- python - 将字典列表分解为常用元素的字典
- react-native - React-Native flexDirection:多行的“行”