【问题标题】:iOS. OpenGL. Fill area with gradient under curve lineIOS。 OpenGL。曲线下用渐变填充区域
【发布时间】:2016-09-06 09:38:07
【问题描述】:

我需要创建像 Siri 这样的声波动画 (SiriAnim) 使用 OpenGL,我得到了波浪的形状:

这是我的代码:

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

//    .....

- (void)setupGL {

    [EAGLContext setCurrentContext:self.context];
    glEnable(GL_CULL_FACE);

    self.effect = [[GLKBaseEffect alloc] init];

    self.effect.useConstantColor = GL_TRUE;
    self.effect.constantColor = GLKVector4Make(0.0f, 1.0f, 0.0f, 1.0f);
}

//    .....

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

    glClearColor(_curRed, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.effect prepareToDraw];

    GLfloat line[1440];

    for (int i = 0; i < 1440; i += 4) {

        float x = 0.002*i - 0.75;

        float K = 8.0f;
        float radians = DEGREES_TO_RADIANS(i/2);

        float func_x = 0.4 *
                       pow(K/(K + pow(radians-M_PI,4.0f)), K) *
                       cos(radians-M_PI);

        line[i]   = x;
        line[i+1] = func_x;

        line[i+2] = x;
        line[i+3] = -func_x;
    }

    GLuint bufferObjectNameArray;

    glGenBuffers(1, &bufferObjectNameArray);

    glBindBuffer(GL_ARRAY_BUFFER, bufferObjectNameArray);

    glBufferData(
                 GL_ARRAY_BUFFER,
                 sizeof(line),
                 line,
                 GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);

    glVertexAttribPointer(
                          GLKVertexAttribPosition,
                          2,
                          GL_FLOAT,
                          GL_FALSE,
                          2*4,
                          NULL);

    glLineWidth(15.0);
    glDrawArrays(GL_LINES, 0, 360);
}

但是!我很困惑,因为我找不到渐变的任何解决方案。经过大量时间的搜索,我什至强烈怀疑这样的任务是不可能的(因为 GLKBaseEffect *effect . constantColor 我认为)。 所以!谁能帮我解决这个任务? 这个问题可以用着色器或纹理解决吗(最差的解决方案)?

祝福你的答案!

【问题讨论】:

    标签: ios opengl-es gradient


    【解决方案1】:

    虽然这可以通过纹理来完成,但我认为最简单的方法是使用 OpenGL 的默认颜色插值。如果您将绘制线条的顶部顶点设为浅蓝色,底部顶点设为深蓝色,GPU 将自动在它们之间插入颜色以逐渐变化,并产生您正在寻找的渐变效果。

    在代码中实现这一点的最简单方法是在缓冲区(即“lines”数组)中为线条的每个顶点的颜色腾出空间,并设置着色器以输出此值。这意味着您必须将此颜色的输入和输出添加到顶点和像素着色器。想法是将它从顶点传递到像素着色器,像素着色器输出未修改的值。硬件会自动为您处理颜色之间的插值(!)。

    许多现代 OpenGL 教程都有这样做的示例。来自LearnOpenGL's Shader tutorial 的免费在线一个。不过,如果你有钱,我最喜欢的关于缓冲区、着色器和管道本身的解释是 Graham Sellers 的OpenGL SuperBible。如果您打算经常使用 OpenGL 并真正学习它,那么它是非常宝贵的桌面参考。

    【讨论】:

    • 非常感谢!!我真的决定按照您的建议使用着色器来完成这项任务。但是我在使用多个 glViews 或多个着色器时遇到了另一个问题,我在这里发布了这个麻烦:stackoverflow.com/questions/39638481/… 也许你知道问题是什么?我想完成我的自定义波形视图并与大家分享)
    猜你喜欢
    • 2021-12-23
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多