【发布时间】:2017-04-09 18:00:45
【问题描述】:
我已将问题范围缩小到此。我有两个属性指向完全相同的数据。在本机 C++ 中构建时,这可以正常工作。但是,当使用 emscripten 构建时,javascript 控制台会在每一帧上显示以下错误:
'glDrawArrays: attempt to access out of range vertices in attribute 1'
当我注释掉“glEnableVertexAttribArray”行以启用第二个属性时,我没有收到此错误。
下面是我的代码。我将从创建数据缓冲区开始:
GLfloat rectangleData[] =
{
-.5f, -.5f, 0,1,
-.5f, .5f, 0,0,
.5f, .5f, 1,0,
.5f, -.5f, 1,1,
-.5f, -.5f, 0,1
};
glGenBuffers(1, &rectangleBuffer);
glBindBuffer(GL_ARRAY_BUFFER, rectangleBuffer);
glBufferData(
GL_ARRAY_BUFFER, sizeof(rectangleData),
rectangleData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
这是我的纹理四边形绘图代码的相关摘录:
glBindBuffer(GL_ARRAY_BUFFER, rectangleBuffer);
int vertexPosition = Shader::getParameterInfo("vertexPosition")->id;
glVertexAttribPointer(
vertexPosition, 2, GL_FLOAT,
GL_FALSE, 16, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vertexPosition);
int vertexTexCoord = Shader::getParameterInfo("vertexTexCoord")->id;
glVertexAttribPointer(
vertexTexCoord, 2, GL_FLOAT,
GL_FALSE, 16, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vertexTexCoord);
glDrawArrays(GL_TRIANGLE_FAN, 0, 5);
请注意,我已将第二个属性调整为指向与第一个相同的数据(以降低调试时的复杂性)。我在这里很困惑,真的可以使用新鲜/经验丰富的视角。
编辑:这是BUFFER_OFFSET 的样子:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
来源:How to cast int to const GLvoid*?
编辑:对于它的价值,这里是等效的 Emscripten 生成的 JS 代码。如果需要,我会发布此引用的任何 JS 代码。
dest=$rectangleData; src=2328; stop=dest+80|0; do {
HEAP32[dest>>2]=HEAP32[src>>2]|0; dest=dest+4|0; src=src+4|0; } while
((dest|0) < (stop|0));
_glGenBuffers(1,(2300|0));
$30 = HEAP32[2300>>2]|0;
_glBindBuffer(34962,($30|0));
_glBufferData(34962,80,($rectangleData|0),35044);
_glBindBuffer(34962,0);
$11 = HEAP32[2300>>2]|0;
_glBindBuffer(34962,($11|0));
$12 = (__ZN8platform6Shader16getParameterInfoEPKc(17356)|0);
$13 = HEAP32[$12>>2]|0;
$vertexPosition = $13;
$14 = $vertexPosition;
_glVertexAttribPointer(($14|0),2,5126,0,16,(0|0));
$15 = $vertexPosition;
_glEnableVertexAttribArray(($15|0));
$16 = (__ZN8platform6Shader16getParameterInfoEPKc(17379)|0);
$17 = HEAP32[$16>>2]|0;
$vertexTexCoord = $17;
$18 = $vertexTexCoord;
_glVertexAttribPointer(($18|0),2,5126,0,16,(0|0));
$19 = $vertexTexCoord;
_glEnableVertexAttribArray(($19|0));
_glDrawArrays(6,0,5);
编辑:更好的是,我将提供在 github 上运行的 JS 代码和 C++ 代码的链接(它在“drawImage()”的底部附近):
【问题讨论】:
-
几个问题。
sizeof(rectangleBuffer)确实是20 * sizeof(GLfloat)而不是指针的大小?BUFFER_OFFSET是做什么的? -
@KirillDmitrenko:如果 OP 就是这样写的,那么是的,
sizeof(rectangleData)将评估数组的总大小(如果数组作为函数参数或指针传递,它将不起作用退化。 -
对应的javascript代码长什么样? C++ 看起来是正确的。
标签: opengl webgl texture-mapping emscripten