【发布时间】:2012-12-30 23:33:13
【问题描述】:
我有一个 GLKView,它几乎可以显示我想要的形状,但是有些东西仍然无法按预期工作。
3_______________________2
|\ /|
| \_ _ _ _ _ _ _ _ _ _/ |
| /4 5\ |
|/_____________________\|
0 1
纹理映射在正面起作用,其他两个面没有真正起作用,缺少三角形。
当我使用颜色时,表面看起来像想要的那样,但是背面没有在点 4 和 5 形成的边缘处连接(请看我提供的图纸以上)。
我想要(如果你从侧面看的话)三个面形成一个等边三角形。
我暂时注释掉了代码的纹理映射部分,以便您可以根据需要进行测试。
在这里我设置了我的视图(注意我的视图的尺寸。坐标系统工作正常,无需摆弄低值。面部看起来不错,但它们不好看,正如我在后面所说的加入):
EAGLContext * context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
OpenGLShape *view = [[OpenGLShape alloc] initWithFrame:CGRectMake(0, 200, 320, 80) context:context];
view.delegate = view;
[view setupGL];
[self.view addSubview:view];
- (void)setupGL {
[EAGLContext setCurrentContext:self.myContext];
//glEnable(GL_CULL_FACE);
self.effect = [[GLKBaseEffect alloc] init];
BOOL useTexture = NO;
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer);
if(useTexture){
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],
GLKTextureLoaderOriginBottomLeft,
nil];
NSError * error;
NSString *path = [[NSBundle mainBundle] pathForResource:@"blogcell@2x" ofType:@"png"];
GLKTextureInfo * info = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];
if (info == nil) {
NSLog(@"Error loading file: %@", [error localizedDescription]);
}
self.effect.texture2d0.name = info.name;
self.effect.texture2d0.enabled = true;
glGenBuffers(1, &texArray);
glBindBuffer(GL_ARRAY_BUFFER, texArray);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0,0);
glBufferData(GL_ARRAY_BUFFER, sizeof(TexCoords), TexCoords, GL_STATIC_DRAW);
}else{
glGenBuffers(1, &colArray);
glBindBuffer(GL_ARRAY_BUFFER, colArray);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, 0);
glBufferData(GL_ARRAY_BUFFER, sizeof(Color), Color, GL_STATIC_DRAW);
}
glGenRenderbuffers(1, &depthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320.0f, 80.0f);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
glEnable(GL_DEPTH_TEST);
glGenBuffers(1, &vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,0,0);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(51.4f,4.0f, 0.1f, 10.75f);
rotMatrix = GLKMatrix4Translate(self.effect.transform.modelviewMatrix,0, 0, -3);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
self.opaque = NO;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices));
}
红色 = 正面(由点 0123 组成)
蓝色 = 背面(顶部 - 由 4523 点组成)
绿色 = 背面(底部 - 由点 0154 组成)
白色 = 背景
为了查看它们是否混合/剔除等,我还将这些面设为半透明 (alpha = 0.5)。
【问题讨论】:
-
你考虑过Cocos2d吗?这可以使使用 OpenGL ES 分配更简单,并减少您遇到的问题。
-
是的,过去两年我一直在使用 cocos2d,但我真的很想深入研究 OpenGL。问题是,我主要是通过自己做一些事情来学习,尤其是从我提出的问题中学习。因此,如果有人能说出我犯的错误,我会非常高兴。
-
您能否详细说明“不工作”?图片?
-
正如我在问题中所说的,这两个问题是:1)纹理没有正确映射到我的脸上,2)两个背面没有在它们应该相遇的边缘处相遇z 值为 -1.73。我用勾股定理计算了它,所以每个面都有相同的边长。
-
我对OpenGL的经验很少,所以我什至不知道我是否正确设置了顶点。如果我只使用颜色(没有纹理映射),那么它看起来很好(背面仍然没有在后面相遇)。但是一旦我使用纹理,形状似乎就缺少一些三角形的脸。我已经实现了一些旋转形状的代码,每当我旋转它时,我都会假设剔除效果搞砸了。
标签: iphone objective-c opengl-es