gpt4 book ai didi

ios - 为什么我需要在 drawInRect 中调用 glClear?

转载 作者:行者123 更新时间:2023-12-01 18:12:35 27 4
gpt4 key购买 nike

我有一个简单的 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 {
}

然而,这不起作用。

但是,如果我将 glClear 调用移动到 drawInRect,那么它可以工作:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClear(GL_COLOR_BUFFER_BIT);
}

这是为什么?为什么必须在 drawInRect 中调用 glClear 而不是 glClearColor?

最佳答案

GPU 上的上下文包含许多值和状态,这些值会一直保留到更改为止。其中之一是由 4 个浮点值组成的清晰颜色。每当您设置这些值时,它们将作为相同的值持续存在并且可以重复使用,直到您再次更改它们为止。

因此,可以在创建和设置上下文后随时设置清除颜色。 glClear 将使用此值将颜色绑定(bind)缓冲区组件(像素)设置为此值。为此,必须至少绑定(bind)一个帧缓冲区。

调用glClearviewDidLoad可能有效也可能无效,因为此调用需要绑定(bind)帧缓冲区,因此它知道要清除先前设置的颜色的缓冲区。 “可能有效也可能无效”我的意思是因为您正在使用 GLKit 中的便利类。你真的无法控制甚至不知道这些类正在使用的管道。在调用该函数时,您不知道缓冲区是否已绑定(bind)甚至已创建。如果您手动创建它,您将创建一个上下文,创建一个帧缓冲区并附加渲染缓冲区,然后您可以清除这些缓冲区并且所有工作都按预期进行。

所以glClear可以随时调用,在某些情况下甚至可以在 drawRect 中调用多次。方法。此调用的结果与使用 glClearColor 设置的颜色绘制完整缓冲区大小的矩形相同。 , 不同之处在于它在 openGL 中跳过了几个步骤,因此速度更快。绘制管道加上您可以清除更多的颜色缓冲区(例如深度缓冲区)。

您清除的渲染缓冲区可以最好地呈现为像素的二维数组或类似 char buffer[width][height][4] 的东西。因为它通常有 4 个颜色分量(RGBA)。缓冲区数据被再次保存,可以一遍又一遍地重新绘制,你可以使用glViewport绘制到不同的和平,甚至呈现某个部分。 .如果您在每次绘制帧调用时清除缓冲区,则意味着您将需要再次重绘所有元素,这通常是这种情况,但如果您想继续将内容绘制到缓冲区,则必须跳过 clear 调用。例如,如果您想在每次用户点击屏幕时画一个圆圈,您将跳过 clear 调用。但是在这种情况下,您还希望丢失计时器(显示链接)以继续调用 draw 方法,当用户点击屏幕时,您只需绘制圆圈并将缓冲区呈现给屏幕,没有理由继续刷新它.

那么为什么需要调用glCleardrawInRect ?你没有,你可以在任何时候调用它,任何你想要的方法,你只需要确保你有正确的上下文集和正确的帧缓冲区绑定(bind)。虽然我同意这可能是一个问题,如果您无法直接访问这些元素,在您的情况下使用 GLKView .

关于ios - 为什么我需要在 drawInRect 中调用 glClear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com