我有一个由4个向量组成的结构,我用它来创建一个矩形。其中一个矩阵定义矩形的颜色。每次我画一个矩形,我都需要更新它的颜色。问题是,我不知道如何更新这部分结构。有人可以帮忙吗?谢谢!
typedef struct {
GLKVector3 positionCoordinates;
GLKVector2 textureCoordinates;
GLKVector3 normalCoordinates;
GLKVector4 colorCoordinates;
} VertexData;
VertexData unitSquare[] = {
{ {-0.5f, -0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ { 0.5f, -0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ {-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ {-0.5f, 0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ { 0.5f, -0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} },
{ { 0.5f, 0.5f, 0.0f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f} }
};
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
...
// lame attempt to update the color of one vertex
unitSquare->colorCoordinates[0] = {0.0f, 0.0f, 0.0f, 1.0f};
...
}
答案 0 :(得分:1)
您的代码有三个问题
Unitsquare是一个结构数组。使用此
unitSquare[0].colorCoordinate = GLKVector4Make(.1, .1, .1, .1);
即使您更新了CPU上的unitSquare变量,您仍然需要通过将缓冲区与glBindBuffer绑定并使用glBufferData来更新Vertex Buffer Object并使用新颜色,否则GPU不会。但是不要那样做因为......
您的样本中所有顶点都具有相同的颜色 - 如果在整个程序中都是如此,那么使用统一的效率要高得多 - 查找glUniform3fv函数。
希望这有帮助。