gpt4 book ai didi

iphone - 在 iPhone 中使用 OpenGL ES 画一条直线?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:32:48 33 4
gpt4 key购买 nike

最后,我尝试使用 XCode 4.2 中的 OpenGL ES 框架为 iPhone 简单游戏应用程序画一条线。我研究了一些关于 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 委托(delegate)调用无限时间。请指导我哪里做错了。为什么线没有出现或绘制?你能帮忙吗?我正在尝试这 2 天。提前致谢。

最佳答案

我自己现在是 OpenGL ES 2.0 的学生。我建议首先使用 Apple 提供的“OpenGL 游戏”模板在 Xcode 中开始一个新项目。

除其他事项外,Apple 模板代码将包括 GLKBaseEffect 的创建,它提供了一些似乎需要的着色器功能,以便能够使用 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。

关于iphone - 在 iPhone 中使用 OpenGL ES 画一条直线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736887/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com