C++ OpenGL Gradient 소스 (오픈지엘 그라데이션 예제)

C++ OpenGL Gradient 소스 (오픈지엘 그라데이션 예제)


그라데이션(Gradient)을 구현하는 간단한 소스입니다. 아래 예제 소스는 PCL과 C++ OpenGL을 연동하기 위해 구현했던 것으로, 2D 데이터를 Z축으로 쌓을 때, 각 행의 색을 변경하는 용도로 사용되었습니다.


그래서 아래 소스 중 for문 안의 소스는 그대로 사용해도 되는데, 주변 변수나 기능들은 용도에 맞춰 변경할 필요가 있습니다.

소스를 잠시 살펴보면, 2번째 문단에 그라데이션(Gradient)의 시작과 끝 색을 지정하기 위한 배열이 있습니다.


C++ OpenGL Gradient 소스 (오픈지엘 그라데이션 예제)[오픈지엘 그라데이션 예제]


C++ OpenGL start_r/g/b를 보죠.


가로가 아닌 세로로 읽으면, (230, 1, 1) -> (1, 230, 1) -> (1, 1, 230).


순서가 보이시죠? R->G->B 순으로 색을 교체하겠다는 의미입니다. 이건 행의 시작 색을 의미하죠. 이젠 end_r/g/b를 보죠.


C++ OpenGL을 이번엔 세로로 더 읽어봅니다.


역시 세로로 읽으면, (1, 230, 1) -> (1, 1, 230) -> (230, 1, 1).


이번에도 순서가 보이시죠? G->B->R 순으로 색을 교체합니다. 이건 열의 시작 색을 의미하죠.


행과 열 모두에 색을 입히기 위한 사전 작업입니다.


C++ OpenGL Gradient 전체 소스를 살펴보죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void Viewer::MakeGradient(const int point1, const int point2)
{
    // X좌표 사이의 색상을 구해야 함
    // 뷰어에 보여질 X좌표의 최대, 최소값으로 연산
    int point_start = static_cast<int>(point1);
    int point_end = static_cast<int>(point2);
    float incr = (1.0 / ((point_start - point_end) / 255.0));
 
    // 오픈지엘 그라데이션 시작과 끝 색깔
    // 초기엔 Red -> Green
    int end_r[3= { 11230 };
    int end_g[3= { 23011 };
    int end_b[3= { 12301, };
    int start_r[3= { 23011 };
    int start_g[3= { 12301 };
    int start_b[3= { 11230 };
 
    // 오픈지엘 - RGB, 세가지를 연산
    for (int i = 0; i < 3; i++) {
        // 인자로 넘어온 포인트를 사용해도 되지만, R->G, G->B, B->R 까지
        // 3가지 유형을 뽑아내야 하기에 end, start란 지역변수 사용
        int end = point_end;
        int start = point_start;
 
        // Gradient 시작 색상에 곱할 값, 이 색을 곱함으로서 그라데이션 색상의 일부가 만들어짐
        float target = 0;
 
        // 실제로 그라데이션 값을 연산, 연산된 값은 모두 색상 배열에 삽입
        // 1. R->G 연산, 2. G->B, 3. B->R
        for (;end <= start; end++, target += incr) {
            color_x_.push_back(end_r[i] / 255.0 * target + start_r[i] / 255.0 * (255 - target));
            color_y_.push_back(end_g[i] / 255.0 * target + start_g[i] / 255.0 * (255 - target));
            color_z_.push_back(end_b[i] / 255.0 * target + start_b[i] / 255.0 * (255 - target));
        }
    }
 
    // 전체색상에서 포인트 개수를 적당히 섞어 출력, 예제에선 145 ㅛㅇ
    increase_ = static_cast<int>(color_x_.size() / 145);
 
    // color_idx_를 0으로 초기화
    color_idx_ = 0;
    color_idx_ -= increase_;
}

cs


for 문 이후의 소스 3줄은 용도에 맞게 반드시 변경해야 합니다.


주석에 달린 내용처럼 저는 제 상황에 맞게 구현했습니다. 이번 예제는 Z축을 기준으로 데이터가 쌓인다는 전제가 있습니다.


C++ OpenGL Gradient 소스 (오픈지엘 그라데이션 예제)

이 글을 공유하기

댓글(0)

Designed by JB FACTORY