我目前正在尝试将GLfloat数组传递给方法,如下所示:
[_squareModel setVertexData:gCubeVertexData : 216];
和
- (void)setVertexData:(GLfloat*)vertexData : (int)size
{
GLfloat vData[size];
for (int i = 0; i < size; i++) {
vData[i] = vertexData[i];
}
_vertexData = vData;
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(_vertexData), _vertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
}
gCubeVertexData是一个大小为216的GLfloat数组。但是,当我将它传递给方法时,它会转换为GLfloat指针并丢失所有数据,但第一个数字除外。我一直试图找到解释,但我发现的答案都没有奏效。有什么方法可以解决这个问题,还是我做错了?
答案 0 :(得分:0)
您以与C中相同的方式传递C数组,就像在代码段中一样。
实际上,C不允许传递数组。它只允许传递指针。但是阵列非常容易且无声地退化为指针。
这是一个重要的区别。不了解区别的经典陷阱之一是在指针上使用sizeof
并期望获得它指向的数组的大小。这不起作用。指针上的sizeof
给出了指针本身的大小(通常为8或4个字节,具体取决于体系结构(64位对32位))。
一旦数组退化为指针,就无法从该指针获得原始数组的大小。
虽然您没有显示_vertextData
是什么,但您的代码中可能存在问题。考虑到你如何使用它,它几乎必须是一个指针。
无论如何,您传递vertexData
的元素数量,以便计算其大小。您不应该vdata
或_vertexData
,至少为此而言。只需通过size * sizeof(*vertexData)
:
glBufferData(GL_ARRAY_BUFFER, size * sizeof(*vertexData), vertexData, GL_STATIC_DRAW);
请注意,该sizeof(*vertexData)
带有星号,表示vertexData
指向的类型的大小(GLfloat
)。这与没有星号的sizeof(vertexData)
不同,这意味着指针本身的大小。