2013-03-01 58 views
0

我正在开发一个游戏,在这个游戏中我必须摇动骰子来获取数字。我正在使用glkit来制作一个立方体,并通过GLKBaseEffect对该立方体进行纹理化。好 !我想要一个立方体在每个面上都有不同纹理的图像,以便它可以模拟一个骰子。我想要立方体的每个面孔显示不同的骰子图像像一个脸部显示数字1另一个脸部显示数字2等等。 我在这里粘贴我的代码。如何在glkit中的立方体的每个面上获得具有不同纹理图像的立方体?

- (void)setupGL { 

[EAGLContext setCurrentContext:self.context]; 
glEnable(GL_CULL_FACE); 


self.effect = [[GLKBaseEffect alloc] init]; 

NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], 
          GLKTextureLoaderOriginBottomLeft, 
          nil]; 

NSError * error;  
NSString *path = [[NSBundle mainBundle] pathForResource:@"tile_floor" 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; 

// draw one texture per side 



// New lines 
glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

// Old stuff 
glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

glGenBuffers(1, &_indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

// New lines (were previously in draw) 
glEnableVertexAttribArray(GLKVertexAttribPosition);   
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position)); 
glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color)); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord)); 

// New line 
glBindVertexArrayOES(0); 

}

,并呼吁从这里汲取元素法drawInRects

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 

glClearColor(1.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 
[self.effect prepareToDraw]; 
glBindVertexArrayOES(_vertexArray); 
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); 

}

谁能帮我实现这一目标。 在此先感谢。 。 。 。

+0

你解决了这个问题吗?如果你已经解决了,你能解释我是怎么做到的?你可以将它作为答案发布! – 2vision2 2013-03-13 15:47:17

+0

好吧!我没有得到任何解决方案来实现这个使用GLKit,但直接使用openGL命令得到了一个解决方案。你只需要加载六个不同的纹理,并将其渲染在同一个帧缓冲区中。我使用核心图形来创建这六个纹理的位图并发送打开GL Land进行渲染。我很快就会实现与GLKit一样的功能,并且会在这里发布。 @Nicol Bolas – 2013-03-15 05:17:12

回答

1

GLKit允许的纹理数量有限(2,我认为),所以你需要什么叫做纹理贴图。基本上,你建立一个纹理像这样:

a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d ... 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 
a a a a a a a a b b b b b b b b c c c c c c c c d d d d d d d d 

然后设置你的纹理坐标为每个顶点指向要使用纹理的子部分。

注意:即使GLKit支持更多的纹理,尽可能多的OpenGL实现,这种方法比加载gazillion纹理和切换它们的速度快得多。 glBind()是一个相对较慢的操作。

另请注意:如果您的纹理图像边是2的幂(2,4,8,16,32,...),那么效率会更高。纹理图像中有空白(未使用)点是可以的。我通常会在未使用的部分放置一个大红色斑点,所以我可以告诉它是否无意中出现在任何东西上。因此,你的骰子纹理可能是32px高,512(32 * 8)宽,但你只能使用它的前192个(32 * 6),并有一组6个32x32纹理一个图像。

+0

除非由于某种原因,您需要GPU上六个独立的纹理资源,这是您最好的计划 - 您可以在一对绑定和绘制调用中获得整个立方体。 (通过'GLKBaseEffect'为您处理绑定调用。)您不需要有多个绘制调用或多个纹理资源。 – rickster 2014-11-17 21:36:20

0

我这样做是通过分层,或者有更多的对象。所以,一个立方体,然后两个方块几乎不在立方体的皮肤上。如果立方体是2 x 2 x 2,只需将图片顶点设为2.01,那么它就像蛋糕结冰一样

因此,您不是纹理立方体,而是添加更多的对象。这里是一个视频示例 - https://www.youtube.com/watch?v=lh2Zc8kHFbU&list=UUu5WfUbKdhLCW9aPq3WZsNA

如果您需要代码,请发送电子邮件至[email protected]

+0

请将代码添加到每个人的答案中 – AbcAeffchen 2014-11-16 18:10:36

相关问题