0

我有一个由 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};

    ...
}
4

1 回答 1

1

您的代码存在三处问题

  1. Unitsquare 是一个结构数组。用这个

    unitSquare[0].colorCoordinate = GLKVector4Make(.1, .1, .1, .1);

  2. 即使您在 CPU 上更新 unitSquare 变量,您仍然需要通过将缓冲区与 glBindBuffer 绑定并使用 glBufferData 来使用新颜色更新顶点缓冲区对象,否则 GPU 不会。但不要这样做,因为......

  3. 您的所有顶点在您的示例中都具有相同的颜色——如果在整个程序中都是这样,那么使用统一颜色会更有效——查找 glUniform3fv 函数。

希望这可以帮助。

于 2013-11-03T02:35:58.353 回答