gpt4 book ai didi

glsl - 如果禁用 VertexAttribArray,WebGL 2.0 整数属性会抛出类型错误

转载 作者:行者123 更新时间:2023-12-05 04:09:13 26 4
gpt4 key购买 nike

我刚刚花了几个小时来隔离我不理解的 WebGL 行为。

让我们假设一个具有整数属性的顶点着色器:

precision highp int;
in vec4 vtx_pos;
in vec3 vtx_nrm;
in ivec4 vtx_int; // <- integer attribute

void main() {
// blah blah...
}

与以下着色器属性绑定(bind):

var p = gl.createProgram();

gl.bindAttribLocation(p, 0, "vtx_pos");
gl.bindAttribLocation(p, 1, "vtx_nrm");
gl.bindAttribLocation(p, 2, "vtx_int"); // <- ivec4 on array #2

最后是以下 AttribPointer 配置:

gl.vertexAttribPointer(0, 4, gl.FLOAT, false, 28, 0);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 28, 16);
gl.enableVertexAttribArray(1);
gl.disableVertexAttribArray(2); // <- here is the devil

使用此配置(禁用 VertexAttribArray(2)),浏览器会抛出属性 2 的类型错误:

Chrome:GL_INVALID_OPERATION:glDrawElements:vertexAttrib 函数必须匹配着色器属性类型

Firefox:drawElements:顶点属性 2 需要 INT 类型的数据,但提供的是 FLOAT 类型。

我的理解是,当 VertexAttribArray 未使用正确的 vertexAttribIPointer 显式启用时,WebGL 认为它默认“作为 FLOAT 提供”,因此会引发类型错误。

我不明白的是:为什么它检查提供的 disabled VertexAttribArray 类型,从逻辑上讲,没有提供

除了将 VertexAttribArray 启用为虚拟对象之外,是否有一些魔法可以避免此错误?

最佳答案

引用 GL ES 3.0 §2.8:

The resulting attribute values are undefined if the base type of the shader attribute at slot index is not floating-point (e.g. is signed or unsigned integer).

WebGL 2.0 eliminates undefined behaviour here and mandates that an error should be produced .

所以,默认情况下非数组属性的值确实是一个浮点向量。如果着色器中的实际属性是无符号整数值的整数,您应该通过调用 vertexAttribI4* family 手动指定它的值,即:

gl.vertexAttribI4i(2, 0, 0, 0, 0);

关于glsl - 如果禁用 VertexAttribArray,WebGL 2.0 整数属性会抛出类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com