2016-09-06 73 views
0

我需要创建一个声波动画像的Siri(SiriAnim) 在OpenGL中心中已经得到了波的形状:iOS。 OpenGL的。用渐变填充曲线下面积线

enter image description here

这里是我的代码:

@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 *效果,constantColor我认为)。 所以!任何人都可以帮我解决这个任务的任何问题吗? 这个问题可以用着色器或纹理解决(最糟糕的解决方案)吗?

祝福你的答案!

回答

1

虽然这可以用纹理完成,但我认为最简单的方法是使用OpenGL的默认颜色插值。如果您将绘制的线条的顶点设为淡蓝色,并且底部顶点为深蓝色,则GPU会自动插入它们之间的颜色以逐渐改变,并生成您要查找的渐变效果。

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

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

+0

非常感谢!我真的决定按照你的建议使用着色器来完成这项任务。但我有使用几个glViews或几个着色器的另一个问题,这个问题我已经发布在这里:http://stackoverflow.com/questions/39638481/ios-opengl-several-views-simultaneously也许你知道什么问题是?我想完成我的自定义波形视图并与大家分享) – chatlanin