我一直在try 将一个Uint32Array的缓冲区指向一个uint的输入变量.

我可以在网上找到的所有信息都说这应该是可能的,但无论我做什么,我都会得到同样的错误:

[.WebGL-0x62401b7e200] GL_INVALID_OPERATION: Vertex shader input type does not match the type of the bound vertex attribute.

下面是我的顶点着色器:

#version 300 es
in vec4 a_ipos;
in uint a_cdata;
uniform vec2 ures;

void main() {
    uint x = a_cdata & 0x7C00u;
    uint y = a_cdata & 0x03E0u;
    uint z = a_cdata & 0x001Fu;

    vec4 pos = a_ipos + vec4(float(x), float(y), float(z), 1.);

    gl_Position = vec4(pos.x * ures.y / ures.x, pos.yzw);
}

下面是我对webgl的调用,将缓冲区指向属性:

gl.bindBuffer(gl.ARRAY_BUFFER, chunkBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Uint32Array(chunkData), gl.STATIC_DRAW);
gl.enableVertexAttribArray(cdataloc);
gl.vertexAttribPointer(
    cdataloc,
    1,
    gl.UNSIGNED_INT,
    false,
    0,
    0
);

gl.UNSIGNED_INT章和第uint章不一样 然而,GLSL 300 ES reference card表示它是一个32位无符号整数. MDN同意gl.UNSIGNED_INT是32位无符号整数.

我不知道我做错了什么.我试着用gl.INTin int ...,还是什么都没有.将整数的精度更改为highp也不会改变任何东西.(假设highp将整数转换为32位,这似乎不是这样).

将类型更改为浮动确实有效.但我使用的任何其他类型的手机都不会.

我也试着用了gl.SHORT.这是为了抛弃glsl中的int类型可能是16位整数的理论.还是同样的错误.

This question:WebGL:如何在GLSL中使用DDL属性

这解决不了我的问题因为答案提供的文件已经过时.GLSL 1.00 ES不允许按照specification在属性中使用整数.

然而,GLSL 3.00 ES specification似乎并不在乎,只要类型不是以下类型之一:booleanopaquearraystruct.

推荐答案

这是一个典型的错误.vertexAttribPointer()中的数据type指的是数组本身中的数据类型(或缓冲区中的更多).

它不引用着色器中属性的数据类型. 当您使用vertexAttribPointer()时,数据将(仍然)转换为浮点数.您可以使用normalized来控制它是否被规格化,但它仍然被转换为浮点数.

您实际要找的是vertexAttribIPointer()(注意I代表I).

vertexAttribPointer()
//          ^ No I so Float
vertexAttribIPointer()
//          ^ I for Integer

vertexAttribPointer()的文档也提到了Integer attributes:

Integer attributes

虽然ArrayBuffer可以填充整数和浮点数,但属性在发送到顶点着色器时总是被转换为浮点数.如果需要在顶点着色器代码中使用整数,可以在顶点着色器中将浮点转换回整数(例如 (int) floatNumber),或者使用WebGL 2中的gl.vertexAttribIPointer().


您也可以在spec under "Uniforms and Attributes"页阅读更多信息.

Javascript相关问答推荐

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

GrapeJS -如何保存和加载自定义页面

如何在RTK上设置轮询,每24小时

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

如何在angular中从JSON值添加动态路由保护?

Msgraph用户邀请自定义邮箱模板

无法检测卡片重叠状态的问题

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

Angular 订阅部分相互依赖并返回数组多个异步Http调用

如何将多维数组插入到另一个多维数组中?

当用户点击保存按钮时,如何实现任务的更改?

有效路径同时显示有效路径组件和不存在的路径组件

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

固定动态、self 调整的优先级队列

使用Perl Selify::Remote::Driver执行Java脚本时出错

在对象的嵌套数组中添加两个属性

通过ng-绑定-html使用插入的HTML中的函数

JavaScript -如何跳过某个字符(S)来打乱字符串中的字符

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;

如何从图表中映射一组图表-js使用REACT