홈으로 돌아가기

Mandelbrot 애니메이션: 80비트 SSAA 8x8

Mandelbrot 프랙탈 애니메이션 생성기의 구현은 80비트 산술 연산, 8×8 슈퍼샘플링 및 OpenMP를 사용하여 고품질 비디오를 생성합니다. 2단계 파이프라인은 계산을 최적화하며, FFmpeg는 전문 인코딩을 제공합니다.

80비트 Mandelbrot: SSAA 8×8 및 OpenMP 비디오
Advertisement 728x90

80 비트 정밀도와 SSAA 를 활용한 만델브로 프랙탈 애니메이션 생성

이 유틸리티는 1920×1080 해상도의 BMP 형식 망델브로 집합 프레임 255 개를 생성하여 30 FPS 의 MP4 비디오로 컴파일합니다. FFmpeg 통합을 통해 프랙탈 계산부터 최종 렌더링까지 전체 파이프라인이 자동화됩니다. FFmpeg 파라미터는 디테일 보존을 위해 최적화되었습니다: qp=20 은 고화질을 보장하며, pix_fmt yuv420p 는 호환성을 확보하고, deblock=-6 은 압축 아티팩트를 최소화합니다.

주요 명령 옵션:

  • -stream_loop 3: 애니메이션 4 회 재생 (기본 1 회 + 반복 3 회)
  • -framerate 30: 입력 프레임 속도
  • -color_range full: 전체 밝기 범위 0-255
  • no-psy: 프랙탈 구조의 순수를 위해 심리 시각적 향상 기능 비활성화

단축키 및 좌표 포인트

이 프로그램은 집합의 8 개 프리셋 영역 중 선택하거나 Mandelbrot.txt 파일에서 파라미터를 로드할 수 있습니다 (키 9). 좌표는 80 비트 정밀도 (long double) 로 설정됩니다:

Google AdInline article slot
case 1: absc = -0.5503432753421602L; ordi = -0.6259312704294012L; size_val = 0.0000000000004L; break;
case 2: absc = -0.691488093510181825L; ordi = -0.465680729473216972L; size_val = 0.000000000000003L; break;
case 3: absc = -0.550345905862346513L; ordi = 0.625931416301985337L; size_val = 0.000000000000005L; break;
case 4: absc = -1.78577278039667471L; ordi = -0.00000075696313293L; size_val = 0.000000000000004L; break;
case 5: absc = -1.785772754399825165L; ordi = -0.000000756806080773L; size_val = 0.0000000000000014L; break;
case 6: absc = -1.40353608594492038L; ordi = -0.02929181552009826L; size_val = 0.000000000000095L; break;
case 7: absc = -1.7485462508265219L; ordi = 0.000002213770706L; size_val = 0.00000000000029L; break;
case 8: absc = -1.94053809966024986L; ordi = -0.00000120260253359L; size_val = 0.00000000000003L; break;

80 비트 산술 및 x87 FPU

이 구현은 double 의 10^14 대비 10^18 스케일링 범위를 다루기 위해 long double 을 사용합니다. x87 FPU 의 하드웨어 지원은 소프트웨어 에뮬레이션 없이 최대 계산 정확도를 보장합니다. 이는 픽셀화 없이 미니 프랙탈로 깊이 줌인할 때 중요합니다.

80 비트 정밀도의 장점:

  • 정밀도 10 진수 4 자리 추가
  • 표준 구현 대비 10,000 배 깊은 스케일링
  • 중간 변환 없이 x87 레지스터 직접 사용

OpenMP 를 통한 병렬화

OpenMP 는 반복 계산 루프를 병렬화하는 데 사용됩니다. #pragma omp parallel for schedule(dynamic) 지시문은 코어 간에 부하를 효과적으로 분배하여 4 코어 시스템부터 128 스레드 서버까지 확장성을 보장합니다.

Google AdInline article slot

8×8 슈퍼 샘플링 (픽셀당 64 샘플)

SSAA 는 원래 1920×1080 의 8 배인 초고해상도 15360×8640 으로 렌더링하여 구현됩니다. 각 최종 픽셀은 별도의 RGB 구성 요소 계산과 함께 64 개의 독립적인 프랙탈 샘플을 집계합니다.

스무딩 알고리즘:

  • 80 비트 산술로 각 서브 픽셀의 반복 계산
  • 팔레트 회전으로 서브 픽셀 독립 색상이 지정
  • R/G/B 강도 누적 (채널 평균)
  • 대상 해상도로 다운샘플링

결과: 색소 노이즈 없음, 프랙탈 구조 엣지의 영화적 선명도.

Google AdInline article slot

최적화된 프레임 생성

파이프라인은 계산을 최소화하기 위해 두 단계로 나뉩니다:

1 단계: 반복 맵

  • 132 MB 크기 (15360×8640) 의 uint8_t 배열 생성
  • 전체 애니메이션에 대해 do-while 반복 루프 한 번 실행
  • OpenMP 로 병렬 채우기

2 단계: 255 프레임 렌더링

  • 메모리에서 반복 맵 읽기
  • 각 프레임에 대해 이동된 팔레트 적용
  • 8×8 블록의 로컬 평균화 (long double 없이)
  • BMP 파일 병렬 쓰기

사인파 팔레트: 127 + 127 cos(2π a / 255)127 + 127 sin(2π a / 255).

구현 예시

#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <cstdint>
#include <string>
#include <atomic>
#include <omp.h>
#include <cstdio>
using namespace std;

const double PI = 3.14159265358979323846;

#pragma pack(push, 1)
struct BMPHeader {
    uint16_t type{0x4D42};
    uint32_t size{0};
    uint16_t reserved1{0};
    uint16_t reserved2{0};
    uint32_t offBits{54};
    uint32_t structSize{40};
    int32_t  width{0};
    int32_t  height{0};
    uint16_t planes{1};
    uint16_t bitCount{24};
    uint32_t compression{0};
    uint32_t sizeImage{0};
    int32_t  xpelsPerMeter{2834};
    int32_t  ypelsPerMeter{2834};
    uint32_t clrUsed{0};
    uint32_t clrImportant{0};
};
#pragma pack(pop)

void save_bmp(const string& filename, const vector<uint8_t>& data, int w, int h) {
    int rowSize = (w * 3 + 3) & ~3;
    BMPHeader header;
    header.width = w;
    header.height = h;
    header.sizeImage = rowSize * h;
    header.size = header.sizeImage + 54;
    ofstream f(filename, ios::binary);
    f.write(reinterpret_cast<char*>(&header), 54);
    f.write(reinterpret_cast<const char*>(data.data()), data.size());
    f.close();
}

주요 요약

  • 80 비트 정밀도 long double + FPU x87: 아티팩트 없이 10^18 까지 줌인
  • SSAA 8×8: 픽셀당 64 샘플, 노이즈 완전 제거
  • 2 단계 렌더링: 132 MB 반복 맵 + 빠른 색상 조합
  • OpenMP: 동적 스케줄링을 통한 자동 멀티스레딩
  • FFmpeg 통합: 전문적인 품질을 위한 qp=20, no-psy, deblock=-6

— Editorial Team

Advertisement 728x90

다음 읽기