我正在创建一个使用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)
将当前颜色设置为绿色,但这不会更改当前的绘图颜色。如何更改三角形的颜色?
答案 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
指定顶点位置的方式非常相似。