修改OpenGL矩阵的结构

时间:2013-11-03 02:13:14

标签: objective-c opengl-es-2.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};

    ...
}

1 个答案:

答案 0 :(得分:1)

您的代码有三个问题

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

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

  2. 即使您更新了CPU上的unitSquare变量,您仍然需要通过将缓冲区与glBindBuffer绑定并使用glBufferData来更新Vertex Buffer Object并使用新颜色,否则GPU不会。但是不要那样做因为......

  3. 您的样本中所有顶点都具有相同的颜色 - 如果在整个程序中都是如此,那么使用统一的效率要高得多 - 查找glUniform3fv函数。

  4. 希望这有帮助。