iOS OpenGL ES – 模拟器和设备上的不同纹理行为

我使用OpenGL ES加载纹理,下面是我的代码。

graphics由2个相同大小的纹理,停止button和背后的蓝色光晕组成。

下面的第一张图片是使用xCode中的iPad模拟器拍摄的,第二张图片是实际设备上的第二张图片。 第一个graphics是我从Illustrator中导出graphics的正确输出。 但是,当我在iPad上加载程序时,它给了我第二个graphics。 看起来不知何故停止button后面的蓝光纹理变得更小了。 这是为什么?

我可以通过使蓝光纹理更大来进行补偿,但是它并不是正确的,因为它在Illustrator中的样子是第一个graphics。

这是我的代码。

// // OpenGLES_Ch3_4ViewController.m // OpenGLES_Ch3_4 // #import "OpenGLES_Ch3_4ViewController.h" #import "AGLKVertexAttribArrayBuffer.h" #import "AGLKContext.h" #define Y_POS 1.0 #define ASPECT_RATIO 0.75f #define SIZE 0.8 @implementation OpenGLES_Ch3_4ViewController @synthesize baseEffect; @synthesize vertexBuffer; @synthesize textureInfo0; @synthesize textureInfo1; ///////////////////////////////////////////////////////////////// // This data type is used to store information for each vertex typedef struct { GLKVector3 positionCoords; GLKVector2 textureCoords; } SceneVertex; ///////////////////////////////////////////////////////////////// // Define vertex data for a triangle to use in example //static const SceneVertex vertices[] = static const SceneVertex vertices[] = { {{-1.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {0.0f, 0.0f}}, // first triangle {{ 0.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {1.0f, 0.0f}}, {{-1.0f*SIZE, 0.0f*SIZE, 0.0f}, {0.0f, 1.0f}}, {{ 0.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {1.0f, 0.0f}}, // second triangle {{-1.0f*SIZE, 0.0f*SIZE, 0.0f}, {0.0f, 1.0f}}, {{ 0.0f*SIZE, 0.0f*SIZE, 0.0f}, {1.0f, 1.0f}}, }; ///////////////////////////////////////////////////////////////// // Called when the view controller's view is loaded // Perform initialization before the view is asked to draw - (void)viewDidLoad { [super viewDidLoad]; // Verify the type of view created automatically by the // Interface Builder storyboard GLKView *view = (GLKView *)self.view; NSAssert([view isKindOfClass:[GLKView class]], @"View controller's view is not a GLKView"); // Create an OpenGL ES 2.0 context and provide it to the // view view.context = [[AGLKContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; // Make the new context current [AGLKContext setCurrentContext:view.context]; // Create a base effect that provides standard OpenGL ES 2.0 // shading language programs and set constants to be used for // all subsequent rendering self.baseEffect = [[GLKBaseEffect alloc] init]; self.baseEffect.useConstantColor = GL_TRUE; self.baseEffect.constantColor = GLKVector4Make( 1.0f, // Red 1.0f, // Green 1.0f, // Blue 1.0f);// Alpha // Set the background color stored in the current context ((AGLKContext *)view.context).clearColor = GLKVector4Make( 0.0f, // Red 0.0f, // Green 0.0f, // Blue 1.0f);// Alpha // Create vertex buffer containing vertices to draw self.vertexBuffer = [[AGLKVertexAttribArrayBuffer alloc] initWithAttribStride:sizeof(SceneVertex) numberOfVertices:sizeof(vertices) / sizeof(SceneVertex) bytes:vertices usage:GL_STATIC_DRAW]; // Setup texture0 CGImageRef imageRef0 = [[UIImage imageNamed:@"stoplight_full.png"] CGImage]; self.textureInfo0 = [GLKTextureLoader textureWithCGImage:imageRef0 options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], GLKTextureLoaderOriginBottomLeft, nil] error:NULL]; self.textureInfo0_2 = [GLKTextureLoader textureWithCGImage:imageRef0 options:nil error:NULL]; // Setup texture1 CGImageRef imageRef1 = [[UIImage imageNamed:@"stop_button.png"] CGImage]; self.textureInfo1 = [GLKTextureLoader textureWithCGImage:imageRef1 options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], GLKTextureLoaderOriginBottomLeft, nil] error:NULL]; self.textureInfo1_2 = [GLKTextureLoader textureWithCGImage:imageRef1 options:nil error:NULL]; // Enable fragment blending with Frame Buffer contents glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } ///////////////////////////////////////////////////////////////// // GLKView delegate method: Called by the view controller's view // whenever Cocoa Touch asks the view controller's view to // draw itself. (In this case, render into a frame buffer that // shares memory with a Core Animation Layer) - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { // Clear back frame buffer (erase previous drawing) [(AGLKContext *)view.context clear:GL_COLOR_BUFFER_BIT]; [self.vertexBuffer prepareToDrawWithAttrib:GLKVertexAttribPosition numberOfCoordinates:3 attribOffset:offsetof(SceneVertex, positionCoords) shouldEnable:YES]; [self.vertexBuffer prepareToDrawWithAttrib:GLKVertexAttribTexCoord0 numberOfCoordinates:2 attribOffset:offsetof(SceneVertex, textureCoords) shouldEnable:YES]; self.baseEffect.texture2d0.name = self.textureInfo0.name; self.baseEffect.texture2d0.target = self.textureInfo0.target; [self.baseEffect prepareToDraw]; // Draw triangles using the vertices in the // currently bound vertex buffer [self.vertexBuffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:sizeof(vertices) / sizeof(SceneVertex)]; self.baseEffect.texture2d0.name = self.textureInfo1.name; self.baseEffect.texture2d0.target = self.textureInfo1.target; [self.baseEffect prepareToDraw]; // Draw triangles using currently bound vertex buffer [self.vertexBuffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:sizeof(vertices) / sizeof(SceneVertex)]; } 

所需 -  iPad模拟器

iPad 3

对我来说,第二个纹理看起来并不小,只是变暗。 你的笔记本电脑和iPad很可能有不同的gammas显示。

有很多方法来纠正伽马, 这里提供了一个了不起的介绍。

值得注意的是,现在许多现代卡片也可以为你做这些事情,但是据我所知,目前在OpenGL ES上还不支持sRGB颜色格式 。