1. 컴퓨터그래픽스 리뷰

후이재·2020년 10월 14일
1
post-thumbnail

Computer Graphics Review

compute 해야하는것?

  • 모델링(형상, 수학, 모델링 툴 이용), 시점, 광원의 위치

Shape 의 표현

Approximation

  • Surface Approximation: 다각형 사용 그중 삼각형을 사용.(세 점이 같은 평면에 존재할 수 있으므로)
  • Color Approximation: 텍스쳐 사용. 다양한 색상 표현 가능

Sampling

  • Image based
  • Point based
  • Points(Vertices) =모여 모여서> Polygons(Triangles)

compute 어떻게?

  • Rendering으로
  • HW: processing, display
    Input=> Process=> GPU=> Display Process=> Output
  • SW: graphics APIs

1. 렌더링 방법

  • Ray Tracing: 광원에서 나오는 Ray를 모두 계산. film의 특정위치 도달 시 색 정의
  • Projection: 보통 바늘구멍사진기 모델 이용. film 내에서 어디에 맺히는지 비례식을 통해 계산

Ray Tracing

  1. Visibility
    I(x, x') = g(x, x')F // 실제빛의 양에 g(x, x')의 반환값(장애물 있으면 0, 없으면 1/d제곱)을 곱함

  2. Emission
    I(x, x') = g(x, x')[ε(x, x') + ...] // F는 어떤 점에서 x로 들어오는 빛의 양을 뜻함

  3. Reflection
    I(x, x') = g(x, x')[ε(x, x') + s p(x, x', x'')I(x', x'')dx''] //바깥에서 들어와 x'에서 반사되어 x로 가는 빛의 합
    재귀가 발생 => Indirect Illumination을 구현하면 재귀는 없어도 됨.
    => x''가 Light source인 경우만 계산을 하면 된다. 그러면, 빛 => 물체 => Screen이므로, 다른 물체의 영향이 포함되지 않음 => local Illumination

Ray Casting

  • Ray Tracing과 다르게, Screen Pixel에서 뻗어나가는 벡터에 만난 물체가 광원과 연결되어있는지를 본다.
  • color = trace(point p, vector d); // 모든 pixel에 대해 계산(Fragment)
Computing Ray Casting trace(point p, vector d);
  • q = p에서 d로 갔을 때 만나는 점
  • status가 light_source인 경우 빛 색 출력/ 겹치는것이 없는 경우 배경 색 출력
  • 그도 아니면, 겹치는것이 있는것 => q에서 light source로의 방향 계산 후, 방향 계산, q에서 Light source보이는지 체크. 보이면 그림자 지지않고, 보이지 않으면 그림자가 짐
  • 첫번째 교점: Depth buffer를 이용하여 가장 가까운 점을 가져옴. 새로 개산하는것이 저장된 거리보다 뒤라면 버림
  • 두번째 교점: Shadow map of Shodow Volume approach -> direct illumination

Reflection Model

  • 물리적 계산을 이용한 모델
    BSDF(BRDF + BTDF) // 계산이 매우 어려움
    BSSRDF // 살짝 반투명을 위한 모델
  • 관찰을 이용한 모델
    Phong Lighting Model
    I = k_ambient_I + (k_diffuse_I(n.l) + k_specularI(v.r)n_shiny제곱)합
    Diffuse Reflection + Specular Reflection + Ambient Reflection
    Diffuse: 난반사. normal 벡터와 나가는 벡터를 내적
    Specular: 하아리이트. Snell's Law따름. shiny값 클 수록 빨리 줄어듦
    Ambient: 간접광을 나타냄.

2. Projection

  • Transform을 이용
  • MVP행렬 곱 M => T, R곱으로, local을 world로 만듦 / V => View 에 맞춤 / P => Projection됨

행렬의 표현

  • Homogeneous Coordinate 이용
  • Scaling: 대각행렬을 곱한다.
  • Transform: 마지막 열의 더하고자 하는 행에 수를 추가하여 행렬 생성, 곱
  • Rotation: 회전행렬을 곱한다.

Rendering Pipeline

Vertex Processor => Primitive Assembly => Rasterizer => Interpolator => Fragment Processor

OpenGL

  • Open Grahpics Library
  • GLSL
  • 국제 표준, 다양한 브라우저, Web GL로 Browser내에서 3D이미지 생성 가능
  • HW에 독립적, 다양한 Machine에 적용가능
  • 할 수 있는 것: 플랫폼 독립적 개발, primitive처리, 이미지 생성
  • 할 수 없는 것: 고급처리 불가(사람, 나무 구분불가)
  • 버전: 2.0-> Vertex, Fragment Shader등장/ ES3.0-> Geometry Shader 등장/ 4.0-> Tessellation Shader 등장

Shader programming

  • main()이 있음
  • local, Global(Uniform), Interface(In, Out), Built-in(gl_Position) 변수 존재
  • GPU에서 실행되는 Shader코드 변수 가져오기 -> ID로 Attribute가져오기(gl_GetAttribLocation(program, "pos"));

VAO, VBO

  • VAO는 attribute 연결값을 가짐
  • VBO는 데이터를 가짐
    => VAO를 다르게 해서 다른 데이터를 그때마다 연결할 필요없이 그릴 수 있음
  • Gen, Bind, Data 순서를 거쳐 이용
  • glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, ((void*)(0))); // 이 링크가 VAO에 저장됨
  • glEnableVertexAttribArray(id); // 하면 활성화됨
  • GLint colorLoc = glGetUniformLocation(program, "col"); // 으로 uniform 도 가져오고
  • glUniform4f(colorLoc, r, g, b, a); // 으로 지정함
  • in, out 변수는 뭐 너무뻔하니까 넘어감

Shader Review

C와 다르게 ~가 없다

  • pointer X
  • 재귀 X
  • 동적 메모리 할당 X

C와 다르게 ~가 있다

  • vector, matrix, sampler
  • constructor
  • math library

C와 같이 ~가 있다

  • preprocessor
  • void main(void)

변수들

  • float, int, uint, bool, vec2, vec3, ivec[2-4]
  • vec3 vec이면 vec.xy 이런 접근 가능

Swizzling

  • rgb = c.rgb; (o)
  • rgb = c.rbg; (o)
  • c.a = 0.5; (o)

Matrices

  • 2x3에 a[0] ~ a[5]를 넣으면, 0행은, a[0] a[3]로 들어가짐 column major라서
  • m[0].xy 이런 swizzling가능

Texture

  • 0~1사이의 값 가짐, 넘어가면 다시 반복하기도 함
  • Texel: Texture에서의 pixel

함수

삼각함수

  • sin, cos, tan, asin

Exponential 함수

  • pow(x, 2);
  • exp(x); // e의 x승
  • exp2(x); // 2의 x승
  • log(x); // ln
  • log2(x); // log2
  • sqrt(x); // 루트
  • inversesqur(x); // 1/루트

Selected Common 함수

  • abs(x);
  • sign(x);
  • min(x, y);
  • max(x, y);
  • clamp(x, 0.0, 1.0); // 0.0보다 작으면0.0, 1.0보다 크면 1.0

Selected Geometry 함수

  • length(l); // vector length
  • distance(p, q); // 두 점 거리
  • dot(l, n); // 내적
  • cross(l, n); // 외적
  • normalize(l);
  • reflect(l, n); // 빛 계산 => 정반사값vec3 out

Selected Vector Relational 함수

  • equal(p, q); // f, t, f
  • lessThan(p, q); // t, f, f
  • greaterThan(p, q); // f, f, t
    => bvec3 반환
  • any(b); // 그중 하나라도 true이면 true
  • all(b); // 모두 true이면 true

Shader에서는 숏코딩이 필수

  1. float f = min(max(x, minimum), maximum);
    => float f = clamp(x, minimum, maximum);

  2. if(x>0.0) f = 2.0;
    else f = -2.0;
    => (clamp(sin(x), 0, 1)-0.5) * 4;

  3. if(root1<root2) return vec3(0.0, 0.0, root1);
    else return vec3(0.0, 0.0, root2);
    => return vec3(0.0, 0.0, min(root1, root2));

  4. vec3 v = length(p-q);
    => distance(p, q);

  5. normalize(n);
    => vec3 a = normalize(n);

  6. if(p.x<q.x) return true;
    else if(p.y<q.y) return true;
    else if(p.z<q.z) rerurn true;
    return false;
    => any(lessThan(p, q));

profile
공부를 위한 벨로그

0개의 댓글