如何在glkit中的立方体的每个面上获得具有不同纹理图像的立方体?

时间:2013-03-01 04:27:21

标签: opengl-es ios6 opengl-es-2.0 game-physics glkit

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

- (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

中调用draw元素方法
- (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);

}

任何人都可以帮助我实现这一目标。 提前致谢。 。 。

2 个答案:

答案 0 :(得分: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实现一样,这种方法比加载大量纹理并一直切换它们要快得多。 glBind()是一个相对较慢的操作。

另请注意:如果纹理图像边是2的幂(2,4,8,16,32,...),则效果更高。纹理图像中有空白(未使用)斑点是可以的。我通常在未使用的部分放置一个大的红色斑点,所以我可以判断它是否无意中出现在任何东西上。

所以你的骰子纹理可能是32px高,512(32 * 8)宽,但你只使用它的前192(32 * 6)并且有一组六个32x32纹理图像。

答案 1 :(得分:0)

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

因此,您没有对多维数据集进行纹理处理,而是添加了更多对象。以下是视频示例 - https://www.youtube.com/watch?v=lh2Zc8kHFbU&list=UUu5WfUbKdhLCW9aPq3WZsNA

如果您需要密码,请发送电子邮件至StephenMWyatt2@gmail.com。