最后,我试图在XCode 4.2 for iPhone简单游戏应用程序中使用OpenGL ES框架绘制一条线。我研究了一些关于GLKView和GLKViewController在iPhone中画线的事情。这是我在项目中尝试的示例代码,
@synthesize context = _context;
@synthesize effect = _effect;
- (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 setupGL];
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
NSLog(@"DrawInRect Method");
[EAGLContext setCurrentContext:self.context];
// This method is calling multiple times....
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
const GLfloat line[] =
{
-0.5f, -0.5f, //point A
0.5f, -0.5f, //point B
};
glVertexPointer(2, GL_FLOAT, 0, line);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINES, 0, 2);
}
当我运行项目时,只有灰色才出现在屏幕上,该行未显示。而- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
代表也称无限时间。请指导我在哪里做错了。为什么线条没有出现或绘图?你能帮忙吗?我试过这2天了。提前谢谢。
答案 0 :(得分:5)
我现在就是OpenGL ES 2.0的学生。我建议首先使用Apple提供的“OpenGL游戏”模板在Xcode中开始一个新项目。
除此之外,Apple模板代码还将包括GLKBaseEffect的创建,它提供了一些似乎需要的Shader功能才能使用OpenGL ES 2.0进行绘制。 (如果没有GLKBaseEffect,则需要使用GLSL。模板提供了带有和不带有明确GLSL着色器代码的示例。)
模板创建了一个“setupGL”函数,我将其修改为如下所示:
- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];
self.effect = [[[GLKBaseEffect alloc] init] autorelease];
// Let's color the line
self.effect.useConstantColor = GL_TRUE;
// Make the line a cyan color
self.effect.constantColor = GLKVector4Make(
0.0f, // Red
1.0f, // Green
1.0f, // Blue
1.0f);// Alpha
}
我能够通过包含更多步骤来获得绘制线。这一切都涉及将数据发送到GPU进行处理。这是我的glkView:drawInRect函数:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Prepare the effect for rendering
[self.effect prepareToDraw];
const GLfloat line[] =
{
-1.0f, -1.5f, //point A
1.5f, -1.0f, //point B
};
// Create an handle for a buffer object array
GLuint bufferObjectNameArray;
// Have OpenGL generate a buffer name and store it in the buffer object array
glGenBuffers(1, &bufferObjectNameArray);
// Bind the buffer object array to the GL_ARRAY_BUFFER target buffer
glBindBuffer(GL_ARRAY_BUFFER, bufferObjectNameArray);
// Send the line data over to the target buffer in GPU RAM
glBufferData(
GL_ARRAY_BUFFER, // the target buffer
sizeof(line), // the number of bytes to put into the buffer
line, // a pointer to the data being copied
GL_STATIC_DRAW); // the usage pattern of the data
// Enable vertex data to be fed down the graphics pipeline to be drawn
glEnableVertexAttribArray(GLKVertexAttribPosition);
// Specify how the GPU looks up the data
glVertexAttribPointer(
GLKVertexAttribPosition, // the currently bound buffer holds the data
2, // number of coordinates per vertex
GL_FLOAT, // the data type of each component
GL_FALSE, // can the data be scaled
2*4, // how many bytes per vertex (2 floats per vertex)
NULL); // offset to the first coordinate, in this case 0
glDrawArrays(GL_LINES, 0, 2); // render
}
顺便说一下,我一直在浏览Learning OpenGL ES for iOS by Erik Buck,你可以通过O'Reilly以“粗剪”的形式购买(这本书的早期版本,因为直到最后它才会完全发布)今年)。这本书在这个阶段有相当多的拼写错误,没有图片,但我仍然发现它很有用。这本书的源代码似乎很远,您可以在his blog获取。作者还撰写了优秀的书籍Cocoa Design Patterns。