首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >d3fc webgl烛台. webgl中的设置fillStyle

d3fc webgl烛台. webgl中的设置fillStyle
EN

Stack Overflow用户
提问于 2020-02-07 13:54:33
回答 1查看 482关注 0票数 1

我正在使用d3fc+canvas将烛台渲染到图表中,并根据蜡烛的向上还是向下改变它们的填充颜色。系列生成器如下所示

代码语言:javascript
复制
const generator = fc.seriesCanvasCandlestick()
        .crossValue(d => d.date)
        .openValue(d => d.open)
        .highValue(d => d.high)
        .lowValue(d => d.low)
        .closeValue(d => d.close)
        .decorate((context, datum, index) => {

            context.fillStyle = datum.close > datum.open ? 'blue' : 'red'
        });

现在我正在尝试将其转换为webGl呈现(使用seriesWebglCandlestick),但我不知道如何以相同的方式设置填充颜色。

如何将我的装饰功能转换成给webgl烛台着色?

似乎我可以使用context.context()获得Webgl上下文,但是在它上设置fillStyle不会起任何作用。

我看到另一个堆叠溢出的答案建议:

代码语言:javascript
复制
renderer.setClearColor(0xcc3dca, 0.7)
renderer.clear()

但是Webgl上下文中似乎没有setClearColor函数(尽管我确实看到了clear())

我也看到了clearColor(),它需要4个参数,所以我尝试传递像clearColor(197,197,197,0.7)这样的rgba值,但也没有效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-07 16:51:20

现在这个功能已经发布,代码应该如下所示-

代码语言:javascript
复制
const fillColor = fc
    .webglFillColor()
    .data(data)
    .value(d => 
         d.close > d.open ? 
             [0, 0, 1, 1] : [1, 0, 0, 1]
    );

const series = fc
    .seriesWebglCandlestick()
    .xScale(xScale)
    .yScale(yScale)
    .context(gl)
    .crossValue((_, i) => i)
    .highValue(d => d.high)
    .lowValue(d => d.low)
    .openValue(d => d.open)
    .closeValue(d => d.close)
    .decorate(program => {
        fillColor(program);
    });

注:如果没有填充,webglFillColor将没有任何效果,例如ohlc。在这种情况下,您将需要使用webglStrokeColor。

下面是原始答案。

不幸的是,目前WebGL系列的d3fc并不容易做到这一点,但我们确实希望变化很快能做到这一点。

就目前情况而言,这需要深入研究d3fc-webgl包的内部结构。我们目前不建议这样做(直到解决了上面的问题),因为组件的命名和确切功能可能会改变。

但是,如果您非常想尝试这一点,下面是当前版本所需的代码-

只有在构建自己版本的库以便从elementConstantAttributeBuilder导出packages/d3fc-webgl/index.js时,此代码才会运行。

代码语言:javascript
复制
const fillColorAttribute = fc
    .elementConstantAttributeBuilder()
    .size(4)
    .data(data)
    .value((data, element) => 
         data[element].close > data[element].open ? 
             [0, 0, 1, 1] : [1, 0, 0, 1]
    );

const series = fc
    .seriesWebglCandlestick()
    .xScale(xScale)
    .yScale(yScale)
    .context(gl)
    .crossValue((_, i) => i)
    .highValue(d => d.high)
    .lowValue(d => d.low)
    .openValue(d => d.open)
    .closeValue(d => d.close)
    .decorate(program => {
        program
            .vertexShader()
            .appendHeader('attribute vec4 aFillColor;')
            .appendHeader('varying vec4 vFillColor;')
            .appendBody('vFillColor = aFillColor;');
        program
            .fragmentShader()
            .appendHeader('varying vec4 vFillColor;')
            .appendBody('gl_FragColor = vFillColor;');
        program
            .buffers()
            .attribute('aFillColor', fillColorAttribute);
    });

会产生以下情况-

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60114869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档