我正在使用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)];
}
答案 0 :(得分:2)
对我来说,第二个纹理看起来不小,只是更暗。 您的笔记本电脑和iPad很可能具有不同的gamma显示器。
有许多方法可以纠正伽玛,提供了很棒的介绍here。
值得注意的是,现在很多现代卡都可以为你做这件事,但据我所知,到目前为止在OpenGL ES上还没有得到支持:sRGB Color Formats。