OpenGL ES 1.1不会渲染纹理?
对,我发布了一个类似的问题,我试图完全重建文件,现在发生的是纹理根本不渲染。图像是512x512。出于某种原因,纹理可以在模拟器上运行,但不能运行在iPod上。OpenGL ES 1.1不会渲染纹理?
在一个名为EAGLView的类中,有beginDraw和finishDraw,它们在我的游戏循环的开始和结束时被调用。当我创建视图时调用布局子视图。
-(void)beginDraw
{
// Make sure that you are drawing to the current context
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
// make sure we are in model matrix mode and clear the frame
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
// set a clean transform
glLoadIdentity();
}
-(void)finishDraw
{
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
- (void)layoutSubviews
{
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];
[self setupViewLandscape];
}
- (BOOL)createFramebuffer {
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
if (USE_DEPTH_BUFFER) {
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
我texturedQuad Render方法
-(void)render
{
glVertexPointer(vertexSize, GL_FLOAT, 0, vertexes);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(colorSize, GL_FLOAT, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
if (materialKey != nil) {
[[MaterialController sharedMaterialController] bindMaterial:materialKey];
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);
}
//render
glDrawArrays(renderStyle, 0, vertexCount);
}
而且这里是bindMaterial方法:
-(void)bindMaterial:(NSString*)materialKey
{
NSNumber *numberObj = [materialLibrary objectForKey:materialKey];
if (numberObj == nil) return;
GLuint textureID = [numberObj unsignedIntValue];
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureID);
}
当我的场景对象被渲染它被称为: (TexturedQuad是网格的一个子类)
-(void)render
{
if (!mesh || !active) return; // if we do not have a mesh, no need to render
// clear the matrix
glPushMatrix();
glLoadIdentity();
glMultMatrixf(matrix);
[mesh render];
glPopMatrix();
}
而且最后我的测试类:当对象被添加到场景
-(void)awake
{
self.mesh = [[MaterialController sharedMaterialController] quadFromAtlasKey:@"boxNotSelected"];
self.scale = BBPointMake(50.0, 50.0, 1.0);
}
感谢您抽出宝贵的时间,如果你提供任何帮助,阅读此,感谢 清醒称为=]
答案竟然是即使我的纹理被称为menuAtlas无论在文件管理器在侧面和代码它不会工作,所以改变这两个mA工作。我不明白为什么,但我怀疑它涉及与缓存有关的事情。
你在任何地方拨打任何电话给glTexParameter,并且您是否正在创建mip地图?它可能就是GPU正在抽取一个你没有提供的地图。如果将MIN_FILTER设置为GL_NEAREST或GL_LINEAR,会发生什么情况?
不,我目前没有使用mip映射。 (我不知道现在怎么样了,但是我可能会设置MIN_FILTER并没有帮助,但在其他情况下可能会出现这种情况吗?我不知道。我发现代码适用于我想要做的事情,问题是我的图片文件被称为MenuAtlas.png和我的信息存储在menuAtlas.plist我调用它的方式使用菜单,而不是菜单,(我意识到这一点后,说iPhone是区分大小写)我改变了这仍然没有工作。但后来改为全mA(所以它代表同样的事情),它的工作!我没有第一个想法,为什么虽然。 – MPainter 2011-06-06 16:23:59
哦,好吧,我很高兴它的工作!在未来,不设置MIN_FILTER将离开它的默认值是NEAREST_MIPMAP_LINEAR,所以如果你没有提供mip地图(无论手动还是自动),那么当你的几何变得足够小以至于它不想使用全尺寸图像时,它会显示其中一个较小的那些,但它们都是空白的,所以纹理应该是空白的区域。这是我经常惊慌失措的错误。 – Tommy 2011-06-06 16:50:47
Awsome,抱歉,如此缓慢的回应,我可以看到,在未来为我节省一些问题:)感谢您的帮助 – MPainter 2011-06-24 20:35:56
请参阅http://stackoverflow.com/questions/6239374/why-will-my-opengl-es-textures-not-render-properly(我不完全确定差异,太长的帖子)。 – 2011-07-11 21:14:13