posts

ECharts-GL 3D 렌더링 파이프라인 분석

Oct 1, 2025 updated Oct 1, 2025 3darchitectureexpojavascriptlegacy

목차

  1. 소개
  2. ECharts-GL 아키텍처 개요
  3. 렌더링 파이프라인
  4. cone3D 차트 렌더링 과정
  5. 내부 작동 메커니즘
  6. ClayGL과의 통합
  7. 결론

소개

이 문서는 ECharts-GL의 3D 렌더링 파이프라인을 분석하고, 특히 cone3D-simplex.html 예제를 통해 3D 차트가 어떻게 렌더링되는지 상세히 설명합니다. ECharts-GL은 ECharts의 확장 라이브러리로, WebGL을 기반으로 3D 시각화 기능을 제공합니다.

ECharts-GL 아키텍처 개요

ECharts-GL은 다음과 같은 주요 컴포넌트로 구성됩니다:

graph TD
    A[ECharts Core] --> B[ECharts-GL]
    B --> C[LayerGL]
    B --> D[Chart Components]
    B --> E[Coordinate Systems]
    C --> F[ClayGL]
    D --> G[Series Models]
    D --> H[Chart Views]
    D --> I[Layout]
    E --> J[Grid3D]
    E --> K[Globe]
    E --> L[Geo3D]
    F --> M[Renderer]
    F --> N[Scene]
    F --> O[Camera]
    F --> P[Geometry]
    F --> Q[Material]
    F --> R[Shader]

주요 컴포넌트 설명:

  1. ECharts Core: 기본 차트 라이브러리로, 데이터 처리, 이벤트 처리, 렌더링 관리 등의 기능 제공
  2. ECharts-GL: 3D 차트 기능을 확장하는 모듈
  3. LayerGL: WebGL 렌더링을 위한 레이어 관리
  4. Chart Components: 다양한 3D 차트 유형 구현 (cone3D, bar3D 등)
  5. Coordinate Systems: 3D 좌표계 시스템 (Grid3D, Globe, Geo3D 등)
  6. ClayGL: 저수준 WebGL 렌더링 라이브러리

렌더링 파이프라인

ECharts-GL의 전체 렌더링 파이프라인은 다음과 같습니다:

sequenceDiagram
    participant User
    participant ECharts
    participant EChartsGL
    participant Series
    participant View
    participant Layout
    participant Geometry
    participant ClayGL
    participant WebGL

    User->>ECharts: echarts.init(dom)
    User->>ECharts: setOption(options)
    ECharts->>EChartsGL: registerPostUpdate
    EChartsGL->>EChartsGL: update(ecModel, api)
    ECharts->>Series: createModel
    Series->>Series: getInitialData()
    ECharts->>Layout: performLayout
    Layout->>Series: setItemLayout
    ECharts->>View: render
    View->>Geometry: create/update
    View->>ClayGL: createMaterial
    View->>ClayGL: createMesh
    ClayGL->>WebGL: render
    WebGL->>User: display

파이프라인 단계 설명:

  1. 초기화: echarts.init(dom)으로 ECharts 인스턴스 생성
  2. 옵션 설정: setOption(options)으로 차트 구성 옵션 설정
  3. 모델 생성: 시리즈 모델(Series Model) 생성 및 데이터 초기화
  4. 레이아웃 계산: 각 데이터 항목의 위치, 크기, 방향 등 계산
  5. 뷰 렌더링: 시리즈 뷰(Series View)에서 기하 데이터 생성 및 메시 생성
  6. WebGL 렌더링: ClayGL을 통해 WebGL로 최종 렌더링

cone3D 차트 렌더링 과정

cone3D-simplex.html 예제의 렌더링 과정을 상세히 분석합니다:

flowchart TD
    A[echarts.init] --> B[setOption]
    B --> C[cone3D 시리즈 모델 생성]
    C --> D[데이터 처리]
    D --> E[좌표계 설정]
    E --> F[레이아웃 계산]
    F --> G[cone3D 뷰 생성]
    G --> H[ConesGeometry 생성]
    H --> I[Material 설정]
    I --> J[Mesh 생성]
    J --> K[Scene에 추가]
    K --> L[WebGL 렌더링]

상세 과정:

  1. 초기화 및 옵션 설정:

    var chart = echarts.init(document.getElementById('main'));
    chart.setOption({
        series: [{
            type: 'cone3D',
            data: data,
            // 기타 옵션...
        }]
    });
    
  2. 시리즈 모델 생성:

    • Cone3DSeries 클래스가 echarts.SeriesModel을 확장하여 생성
    • 데이터 초기화 및 기본 옵션 설정
  3. 레이아웃 계산:

    • 좌표계 유형에 따라 적절한 레이아웃 함수 선택 (cartesian3D, globe, geo3D 등)
    • 각 데이터 항목에 대해 위치, 방향, 크기 계산
    • 계산된 레이아웃 정보를 데이터에 저장
  4. 뷰 생성 및 렌더링:

    • Cone3DView 클래스가 echarts.ChartView를 확장하여 생성
    • ConesGeometry 생성 및 설정
    • 재질(Material) 및 메시(Mesh) 생성
    • 라벨 및 이벤트 처리 설정
  5. WebGL 렌더링:

    • ClayGL을 통해 WebGL 렌더링 수행
    • 그림자, 조명 등 효과 적용

내부 작동 메커니즘

1. ECharts-GL 초기화 과정

ECharts-GL은 ECharts의 확장으로, 다음과 같은 방식으로 초기화됩니다:

// EChartsGL 생성자
function EChartsGL(zr) {
    this._layers = {};
    this._zr = zr;
}

// ECharts에 후처리 훅 등록
echarts.registerPostUpdate(function (ecModel, api) {
    var zr = api.getZr();
    var egl = zr.__egl = zr.__egl || new EChartsGL(zr);
    egl.update(ecModel, api);
});

이 과정에서 중요한 점:

  • EChartsGL 인스턴스는 zrender(ECharts의 렌더링 엔진)에 연결됨
  • registerPostUpdate 훅을 통해 ECharts 업데이트 후 EChartsGL 업데이트가 실행됨

2. LayerGL 관리

LayerGL은 WebGL 렌더링을 위한 레이어를 관리합니다:

function getLayerGL(model) {
    // zlevel 결정
    var zlevel = model.get('zlevel');
    var layers = self._layers;
    var layerGL = layers[zlevel];

    // 레이어가 없으면 새로 생성
    if (!layerGL) {
        layerGL = layers[zlevel] = new LayerGL('gl-' + zlevel, zr);
        // zrender에 레이어 추가
        zr.painter.insertLayer(zlevel, layerGL);
    }

    return layerGL;
}

3. 시리즈 등록 및 처리

cone3D 차트는 다음과 같이 등록됩니다:

// install.js
export function install(registers) {
    registers.registerChartView(Cone3DView);
    registers.registerSeriesModel(Cone3DSeries);
    registerConeLayout(registers);

    // 데이터 처리기 등록
    registers.registerProcessor(function (ecModel, api) {
        ecModel.eachSeriesByType('cone3D', function (seriesModel) {
            var data = seriesModel.getData();
            data.filterSelf(function (idx) {
                return data.hasValue(idx);
            });
        });
    });
}

4. 데이터 흐름

데이터는 다음과 같은 흐름으로 처리됩니다:

  1. 원본 데이터시리즈 모델레이아웃 계산뷰 렌더링WebGL 출력
flowchart LR
    A[원본 데이터] --> B[Cone3DSeries]
    B --> C[cone3DLayout]
    C --> D[Cone3DView]
    D --> E[ConesGeometry]
    E --> F[ClayGL Mesh]
    F --> G[WebGL 렌더링]

ClayGL과의 통합

ECharts-GL은 ClayGL을 사용하여 저수준 WebGL 렌더링을 수행합니다. 주요 통합 포인트는 다음과 같습니다:

1. 기하 데이터 생성

ConesGeometry는 ClayGL의 Geometry 클래스를 확장하여 원뿔 형태의 기하 데이터를 생성합니다:

var ConesGeometry = Geometry.extend(function () {
    return {
        attributes: {
            position: new Geometry.Attribute('position', 'float', 3, 'POSITION'),
            normal: new Geometry.Attribute('normal', 'float', 3, 'NORMAL'),
            color: new Geometry.Attribute('color', 'float', 4, 'COLOR'),
            // 기타 속성...
        },
        // 기타 설정...
    };
},
{
    // 메서드 구현...
    addBar: function (start, dir, leftDir, size, color, dataIndex) {
        // 원뿔 기하 데이터 생성 로직...
    }
});

2. 재질 및 셰이더 설정

ClayGL의 재질 및 셰이더 시스템을 활용하여 다양한 시각적 효과를 구현합니다:

// 재질 생성
coneMesh.material = graphicGL.createMaterial(shadingPrefix, ['VERTEX_COLOR']);

// 셰이더 설정
new graphicGL.Shader(
    graphicGL.Shader.source('ecgl.sm.depth.vertex'),
    graphicGL.Shader.source('ecgl.sm.depth.fragment')
)

3. 장면 구성

ClayGL의 Scene, Camera, Light 등을 활용하여 3D 장면을 구성합니다:

// viewGL에 그룹 추가
coordSys.viewGL.add(this.groupGL);

// SRGB 디코딩 설정
var methodName = coordSys.viewGL.isLinearSpace() ? 'define' : 'undefine';
this._coneMesh.material[methodName]('fragment', 'SRGB_DECODE');

결론

ECharts-GL의 3D 렌더링 파이프라인은 ECharts 코어, ECharts-GL, ClayGL의 세 가지 주요 레이어로 구성됩니다. cone3D 차트의 렌더링 과정을 통해 살펴본 바와 같이, 데이터는 시리즈 모델에서 처리되어 레이아웃 계산을 거친 후 뷰에서 기하 데이터로 변환되고, 최종적으로 ClayGL을 통해 WebGL로 렌더링됩니다.

이러한 구조는 높은 수준의 추상화를 제공하면서도 WebGL의 성능을 최대한 활용할 수 있게 해주며, 다양한 3D 차트 유형과 시각적 효과를 구현할 수 있는 유연성을 제공합니다.