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

时间:2013-01-24 02:53:06

标签: ios opengl-es

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

图形由2个相同大小的纹理组成,后面是停止按钮和蓝色发光。

下面的第一张图是使用xCode中的iPad模拟器拍摄的,而第二张图是在实际设备上拍摄的。第一个图形是正确的输出,因为我从Illustrator导出图形。但是,当我在iPad上加载程序时,它给了我第二个图形。似乎某种程度上停止按钮后面的蓝色光纹理变得更小。为什么会这样?

我可以通过使蓝色光纹理更大来补偿,但它不会是正确的,因为它应该在Illustrator中看起来是第一个图形。

这是我的代码。

//
//  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)];
 }

Desired - iPad Simulator

iPad 3

1 个答案:

答案 0 :(得分:2)

对我来说,第二个纹理看起来不小,只是更暗。 您的笔记本电脑和iPad很可能具有不同的gamma显示器。

有许多方法可以纠正伽玛,提供了很棒的介绍here

值得注意的是,现在很多现代卡都可以为你做这件事,但据我所知,到目前为止在OpenGL ES上还没有得到支持:sRGB Color Formats