3

我正在使用 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)];
 }

所需 - iPad 模拟器

平板电脑 3

4

1 回答 1

2

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

有很多方法可以校正 gamma,这里提供了一个很棒的介绍。

值得注意的是,如今许多现代卡也可以为您做到这一点,但据我所知,OpenGL ES 目前不支持:sRGB 颜色格式

于 2013-01-24T03:34:41.487 回答