【问题标题】:Finding Exact Screen Dimensions查找确切的屏幕尺寸
【发布时间】:2014-02-21 23:22:03
【问题描述】:

iOS OpenGL ES 2.0 的全新功能。我试图通过绘制一个简单的矩形来精确识别屏幕(iPad)的边界。根据我的发现,在我看来,iPad 屏幕的尺寸是 768 x 1024。但是,我的屏幕没有被正确覆盖(请注意,如果重要的话,我是在横向模式下绘制的)。

我不确定顶点之间的交互以及我如何使用投影矩阵命令。

'self.baseEffect.transform.projectionMatrix = GLKMatrix4MakeOrtho(0, FRAME_WIDTH*2, 0, FRAME_HEIGHT*2, 0, 0);'

如果我删除这条线,我的矩形将在原点左下角呈现。但是如果我把它留在里面,它似乎是从左下角渲染的,但是尺寸太大了,我似乎无法弄清楚如何以可预测的方式更改它们。

如你所见,我很困惑。获得确切屏幕尺寸的最佳方法是什么。我需要这个才能在屏幕上正确放置其他对象。谢谢!

#import "ViewController.h"

typedef struct {
    GLKVector3 positionCoordinates;
    GLKVector2 textureCoordinates;
} VertexData;

#define FRAME_HEIGHT 768.0f
#define FRAME_WIDTH 1024.0f

VertexData vertices[] = {
    { {       0.0f,         0.0f, 0.0f}, {0.0f, 0.0f} },   // bottom left
    { {FRAME_WIDTH,         0.0f, 0.0f}, {1.0f, 0.0f} },   // bottom right
    { {       0.0f, FRAME_HEIGHT, 0.0f}, {0.0f, 1.0f} },   // top left
    { {       0.0f, FRAME_HEIGHT, 0.0f}, {0.0f, 1.0f} },   // top left
    { {FRAME_WIDTH,         0.0f, 0.0f}, {1.0f, 0.0f} },   // bottom right
    { {FRAME_WIDTH, FRAME_HEIGHT, 0.0f}, {1.0f, 1.0f} }    // top right
};

@interface ViewController ()

@property (nonatomic, strong) EAGLContext *context;
@property (nonatomic, strong) GLKBaseEffect *baseEffect;

@end

@implementation ViewController {
    GLuint _vertexBufferID;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    GLKView *view = (GLKView *) self.view;
    view.context = self.context;
    [EAGLContext setCurrentContext:self.context];

    self.baseEffect = [[GLKBaseEffect alloc] init];
    self.baseEffect.useConstantColor = YES;
    self.baseEffect.constantColor = GLKVector4Make(1.0f, 0.0f, 0.0f, 1.0f);

    self.baseEffect.transform.projectionMatrix = GLKMatrix4MakeOrtho(0, FRAME_WIDTH*2, 0, FRAME_HEIGHT*2, 0, 0);

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glGenBuffers(1, &_vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), offsetof(VertexData, positionCoordinates));

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - GKLView delegate methods

- (void) glkView: (GLKView *) view drawInRect:(CGRect)rect{
    glClear(GL_COLOR_BUFFER_BIT);

    [self.baseEffect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, 6);
}

- (void) update {

}

@end

【问题讨论】:

  • 你为什么使用 FRAME_HEIGHT * 2?
  • 因为我读到 1 点 = 2 像素。同样通过反复试验,这最接近于填满屏幕,但远不够完美。基本上,这是一个真正的菜鸟尝试,当我弄清楚这一点时,我肯定会被修改或丢弃。
  • 你能张贴一张截图,说明“最接近填满屏幕”的意思吗?
  • 当我具体看这个效果时,我认为这就是问题所在。如果我用纹理覆盖我的矩形,我可以看到它准确地居中(没有 *2)。当我再次执行 *2 时,现在我可以看到我的矩形似乎只覆盖了屏幕的左下象限,所以看起来这正是问题所在。不知道我之前还切换了什么,但仅隔离那部分似乎揭示了问题。请将此作为答案发布,我会接受。谢谢!

标签: ios ipad opengl-es-2.0


【解决方案1】:

您应该使用 FRAME_HEIGHT 和 FRAME_WIDTH,而不是两倍。

【讨论】:

    【解决方案2】:

    您可以通过以下方式获取屏幕尺寸:

    CGSize screenSize = [UIScreen mainScreen].bounds.size;
    

    但是,请注意在应用程序启动期间使用它。

    获取当前视图控制器的方向:

    [UIViewController interfaceOrientation] 
    

    获取设备方向:

    [[UIDevice currentDevice] orientation]
    

    ...或...

    [[UIApplication sharedApplication] statusBarOrientation];
    

    在您的情况下,您可以简单地使用您拥有的 EAGLView 的边界:

    CGSize viewSize = self.view.bounds.size
    

    【讨论】:

    • 谢谢。如何将其传递给我的顶点?我的顶点数组是全局定义的。如果我画一个矩形,我必须提前知道这些坐标。我是否只绘制一个单位正方形然后对其进行缩放,或者如何做到这一点?再次感谢!
    • 全局定义你的顶点数组吗?如果你不这样做会更容易。 . .但是,如果必须,您可以定义一个 CGSize 指针并让数组引用它。 . .然后在 viewDidLoad 之后更新它。 .顺便说一句:尝试了解这些重要的视图属性之间的区别:边界和框架(你可以谷歌它)。 . .当你刚开始时,它们是非常重要的基础概念。
    • 不一定。这只是我最常看到的方式,所以我试图遵循我认为最普遍接受的程序。感谢您提供有关边界与框架的提示。我会调查的。
    • 嗯,好的。我不是 OpenGL 最佳实践方面的专家。 .我的意思是从一个实例中创建数组会更容易,因为你可以将 size.width 和 size.height 传递到你的顶点数组中。 .而不是先设置数组,然后在知道大小后对其进行操作。
    猜你喜欢
    • 2013-05-26
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多