0xS*_*ina 1 iphone opengl-es ios glkit
我有一个简单的 GLKViewController,我将屏幕设为白色:
- (void)viewDidLoad {
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView *view = (GLKView *)self.view;
view.context = self.context;
[EAGLContext setCurrentContext:self.context];
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
}
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用。
但是,如果我将 glClear 调用移动到 drawInRect,则它可以工作:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClear(GL_COLOR_BUFFER_BIT);
}
Run Code Online (Sandbox Code Playgroud)
这是为什么?为什么必须在 drawInRect 中调用 glClear 而不是 glClearColor ?
GPU 上的上下文包含许多值,这些值在更改之前会一直保留。其中之一是由 4 个浮动值组成的清晰颜色。每当您设置这些值时,它们将保持为相同的值,并且可以重复使用,直到您再次更改它们。
因此,在创建和设置上下文后,可以随时设置清晰的颜色。该值将用于glClear将颜色绑定缓冲区组件(像素)设置为该值。为此,必须至少绑定帧缓冲区。
调用glClear的viewDidLoad威力或作为此调用需要绑定,所以它知道什么缓冲清除之前设置的颜色帧缓冲区可能是无效的。“可能有效也可能无效”我的意思是因为您使用的是来自GLKit您确实无法控制甚至不知道这些类正在使用的管道的便利类。在您调用该函数时,您不知道您的缓冲区是否已绑定或什至已创建。如果您手动创建它,您将创建一个上下文,创建一个帧缓冲区并附加渲染缓冲区,然后您可以清除这些缓冲区并且一切按预期工作。
因此glClear可以在任何时间调用,在某些情况下甚至可以在drawRect方法中多次调用。此调用的结果与使用 设置的颜色绘制一个完整的缓冲区大小的矩形相同glClearColor,不同之处在于它要快得多,因为它跳过了openGL绘制管道中的几个步骤,而且您可以清除更多的颜色缓冲区(a例如深度缓冲区)。
您清除的渲染缓冲区可以最好地呈现为二维像素阵列或类似. 如果您在每次绘制帧调用时清除缓冲区,则意味着您需要再次重绘所有元素,这通常是这种情况,但如果您想继续将内容绘制到缓冲区中,则必须跳过清除调用。例如,如果您想在每次用户点击屏幕时绘制一个圆圈,您将跳过 clear 调用。但是在这种情况下,您还希望丢失计时器(显示链接)以继续调用 draw 方法,当用户点击屏幕时,您只需绘制圆圈并将缓冲区呈现给屏幕,就没有理由继续刷新它.char buffer[width][height][4]因为它通常具有 4 个颜色分量 (RGBA)。缓冲区数据再次保留,可以反复重绘,您可以绘制不同的和平甚至呈现某个部分glViewport
那么为什么需要调用glClearindrawInRect呢?你没有,你可以在任何时候调用它,任何你想要的方法,你需要确保你有正确的上下文集和正确的帧缓冲区绑定。尽管我同意这可能是一个问题,如果您无法直接访问在您的情况下使用的这些元素GLKView。
| 归档时间: |
|
| 查看次数: |
1198 次 |
| 最近记录: |