【发布时间】:2016-08-27 03:45:44
【问题描述】:
我正在使用 opengles 2.0。我正在尝试将整数值传递给顶点着色器。我的客户端代码是这样的:
glEnableVertexAttribArray(3); // Bones
glVertexAttribPointer(3, 4, GL_UNSIGNED_SHORT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
而顶点着色器代码是:
attribute vec4 vBones;
uniform Bone bones[64];
gl_Position = bones[int(vBones.x)].transform * bones[int(vBones.x)].bindPose * vec4(vPosition, 1.0) * vWeights.x;
如果我按原样编译代码。所有“vBones.xyzw”都变为 0,我得到一个未蒙皮的网格。因为 0 指的是单位矩阵。
如果我将客户端代码更改为此:
glVertexAttribPointer(3, 4, GL_INT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset);
代码在 Windows 中运行没有任何错误。但是,当我通过 emscripten 将其编译为 webgl 时,我得到 gl error 1282 (Invalid Operation)
简单地说,你能给我一个将 int 顶点属性传递给 glsl 的例子吗?
【问题讨论】:
-
GL_INT不在有效参数列表中。来源:khronos.org/opengles/sdk/docs/man/xhtml/… -
是的,但它在 Windows 中工作得很好:)
-
因为你很可能没有在 windows 上运行 OpenGL ES。
-
我正在使用 sdl 来设置 opengl 版本。我不知道 sdl 是做什么的。但我向你保证,我将其正确设置为 opengl es 2.0 版。因为否则 emscripten 会失败。
-
即使它可以在 Windows 上运行,也不必在其他任何地方运行。
GL_INT不在此函数的规范中,任何实现 OpenGL ES 2.0 驱动程序的人都不必处理它。您需要将GL_UNSIGNED_SHORT或GL_SHORT的数组传递给函数。