Opengl 2.0 glColor4f无法正常工作

时间:2014-05-21 21:22:59

标签: ios opengl-es glkit

我正在创建一个使用GLKit在iOS中试验opengl的视图。该视图具有以下加载方法:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [EAGLContext setCurrentContext:self.context];
    self.effect = [[GLKBaseEffect alloc] init];

}

在形状的绘制方法中,我有以下代码:

float vertices[] = {
    -1, -1,
    1, -1,
    0,  1};

glEnableVertexAttribArray(GLKVertexAttribPosition);

glColor4f(0.0, 1.0, 0.0, 1.0);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, sizeof(vertices));

glDisableVertexAttribArray(GLKVertexAttribPosition);

此代码将在屏幕中央绘制一个三角形,但三角形为白色。我使用行glColor4f(0.0, 1.0, 0.0, 1.0)将当前颜色设置为绿色,但这不会更改当前的绘图颜色。如何更改三角形的颜色?

2 个答案:

答案 0 :(得分:4)

OpenGL 2.0使用着色器来栅格化几何体。您需要告诉着色器您想要看到的颜色。这样做的方法通常是将顶点的颜色属性设置为你想要的,我还没有使用过GLKit,但我发现它有一个GLKVertexAttribColor。尝试将其设置为您想要的颜色:

GLfloat triangle_colors[] = {
    1.0, 1.0, 0.0, 1.0,
    0.0, 0.0, 1.0, 1.0,
    1.0, 0.0, 0.0, 1.0,
};

glVertexAttribPointer(
    GLKVertexAttribColor, // attribute
    4,                 // number of elements per vertex, here (r,g,b,a
    GL_FLOAT,          // the type of each element
    GL_FALSE,          // take our values as-is
    0,                 // no extra data between each position
    triangle_colors
);

答案 1 :(得分:1)

glColor4f不是ES 2.0电话。您必须已经拉入ES 1.0头文件才能进行编译。

如果您只想使用纯色,最简单的方法是在着色器中定义uniform变量,并将颜色作为制服传递。或者,您可以将颜色设置为附加顶点属性。

如果您使用的是GLKit提供的预烘焙着色器,则应该能够使用GLKVertexAttribColor传递颜色,这与使用GLKVertexAttribPosition指定顶点位置的方式非常相似。