목록전체 글 (140)
Graphics Programming
버퍼: linear allocation of memory 버퍼는 이름(name)에 의해 표현된다. name은 OpenGL이 버퍼를 식별하기 위해 사용하는 opaque handle이다. data store: 버퍼 개체에 할당된 메모리 기본적인 사용법 1. 버퍼의 이름을 얻는다. 2. 버퍼를 OpenGL 컨텍스트에 붙인다. 그러려면 버퍼를 buffer binding point(또는 target이라고 함)에 바인딩한다. target은 정점 셰이더의 입력 또는 셰이더들의 변수다. 메모리 할당: glBufferData(target, size, data, usage) GL은 버퍼에 타입을 할당하지 않는다. 버퍼는 어느 목적으로든 쓰일 수 있다. usage의 조합: GL_[STREAM/STATIC/DYNAMIC]_[..
Tessellation: high-order primitive, 즉 patch를 작고 단순한 수많은 primitive들로 쪼개는 작업 OpenGL은 테셀레이션 엔진을 내장하고 있다. 이 엔진은 고정 기능이지만 여러 설정이 가능하다. 테셀레이션 엔진은 quadrilateral, triangle, line을 point, line, triangle으로 조각내어, 일반적인 래스터라이제이션 하드웨어가 바로 쓸 수 있게 만든다. 테셀레이션 단계는 3단계로 나뉜다. 1. Tessellation Control Shader(TCS): 입력되는 control point들을 처리하고 여러 테셀레이션 인자를 결정한다. 2. Fixed-function Tessellation Engine: patch를 단순한 primitive들..
Interface Block: GLSL에서 변수 여러 개를 묶을 때 쓰는, C 구조체 같은 것. // vertex shader out VS_OUT { vec4 color; } vs_out; // fragment shader in VS_OUT { vec4 color; } fs_in; 블록 이름(VS_OUT)은 같아야 하며 인스턴스 이름(vs_out, fs_in)은 달라도 된다. 인스턴스가 여러 개 필요할 경우 배열로 선언할 수 있다. // vertex shader out VS_OUT { vec4 color; } vs_out[3]; // fragment shader in VS_OUT { vec4 color; } fs_in[3];
학교에서 정보보호이론을 수강하고 있는데 유클리드 알고리즘이 나온다. 2000년도 더 된 알고리즘이지만 그 증명이나 절차가 나에겐 직관적으로 와닿지가 않아서 몇 번을 봐도 세부사항을 곧잘 까먹었다. (사실 무슨 알고리즘이든 며칠 지나면 디테일을 까먹게 되지만.. -.-) 이번 기회에 확실하게 배우고 넘어갔지만 확장 유클리드 알고리즘은 한층 아리송해서 여기에 정리해본다. 유클리드 알고리즘은 잘 알고 있다고 가정한다. 유클리드 알고리즘은 다음과 같다. 두 양의 정수 ($ a $), ($ b $) 의 최대공약수 ($ gcd(a, b) $)는 다음과 같은 절차를 거쳐 구할 수 있다. $$ r_0 \leftarrow a, r_1 \leftarrow b $$$$ r_{i+1} = r_{i-1} - q_i r_i,~~..
문제: https://www.algospot.com/judge/problem/read/TSP1 n-queen은 며칠 고심하며 코딩했는데 익숙해져서 그런지 tsp는 코드를 금방 짤 수 있었다. 가지치기고 뭐고 그냥 무식하게 모든 경로를 따져서 해를 구한다. 저지는 통과하는데 비슷한 c++ 코드보다 약 15배 느림.. import Control.Monadimport Data.Arrayimport Data.List getInt :: IO IntgetInt = read `fmap` getLine :: IO Int main = do numCases Doublesolve table n = minimum $ map (\i -> goto i (delete i [1..n]) 0.0) [1..n] where goto fr..
문제: https://algospot.com/judge/problem/read/NQUEEN N의 범위가 1≤N≤12인 간단한 문제...인데 그냥 백트래킹으로 짜니까 시간 초과 ㅜㅜ 일단 n-queen 알고리즘과 무관한, 문제 입력을 처리하는 코드부터 작성한다. import Control.Monad main = do n n -> if row==1 then cnt else fill (board // [(row-1, 0)]) (row-1) ((board!(row-1)) + 1) cnt | peace -> fill (board // [(row,col)]) (row+1) 1 cnt | True -> (fill board row (col+1) cnt) where peace = (row==1) || False == ..
축 분리 정리(분리축 정리)는 컴퓨터에서 두 볼록 물체의 교차 판정을 논할 때 흔히 언급되는 정리다. 두 물체를 투영한 구간(interval)이 겹치지 않는 축이 하나라도 존재한다면, 두 물체는 교차하지 않은 것이다. 간단한 그림을 몇 가지 그려보면 금방 그 의미를 알 수 있다. 인터넷에서 이 정리를 검색해보면 대부분은 바로 구현으로 넘어간다. "자, 이런 정리가 있어. 그러니까 우리가 앞으로 할 일은 각각의 모서리를 분리축으로 활용해서 투영을 하면 그 경우의 수가 MN + M + N가지고 시간복잡도는 이러쿵저러쿵..." 여기서 수학적인 부분을 확실하게 따져보자. 축 분리 정리를 간단하게 증명해보자. 두 볼록 도형 A, B가 교차할 때, 그 교집합을 ($ I = A \cap B \neq \phi $)이라..