벡터 길이 구하기
각 픽셀에서 z축 방향으로 쏜다 (0, 0, 1)
vec3를 반환한다
광선이 물체에 닿으면 그 물체의 색 반환
구-직선의 방정식으로 처리
광선-충돌지점 거리 + 충돌 위치 + 충돌 위치에서 normal
모든방향 빛 + 반사된 기본 색깔 빛 + 반짝이기
and or xor 계산하는 회로
A integer Operand + B integer Operand + Status + Opcode
→ Integer Result + Status
4개 붙히면 4bit 계산 가능
연산 결과 / CPU 상태에 대한 부가 정보 저장하는 레지스터
status flag bits
메모리에서 가져올 명령어 주소를 저장하는 레지스터
데이터와 주소 모두 저장할 수 있는 레지스터
right 하면 MSB는 유지 → 부호 유지
1111 (-1)
Most Significant Bit / Least Significant Bit
1101 → 10011(X) 0011(O)
비트 상태 유지하기
Data IN + Write Enable → Data Out
64개 64bit Register
주소 표현 가능
row + column
메모리 주소 표현 가능 용량 (하드웨어)
crt 메모리 다 잡고 있고 해제 안 한 것만 리포팅
전역 변수 릭 아닌데 릭으로 보고 메모리 해제 안해서
C RunTime Library
가상 메모리 부족
OS가 한다
당장 필요한 만큼만 프로세스에게 제공
여러 프로세스 바꾸면서 CPU 쓰게 해주기
Process / Main Memory / File / Disk / IO / Etc
프로세스로 돌고있다
메모리에 유저영역 / 커널 영역 분리
PID 4번
data storage / movement / conversion / counters
Big : 숫자 순서대로 Small : 숫자 반대로 메모리에 저장
프로세스의 상태를 저장하는 자료 구조
화면에 보여지는 메모리
데이터 쭉 통과해서 결과물 나온다
vertex + pixel
상수 레지스터에 넣어둔다 constant buffer
light 정보 N * L
출력 레지스터 백 버퍼 여러개
렌더 타겟 여러 개 만들어서 한번에 그릴 수 있게 한다
정보들을 렌더 타겟에다가 넣어두고 한번에 조합해서 그린다
defferred : 여러 lighting 연산 한번에 수행, G buffer 커진다
forward : 기존 렌더링 방식, 파이프라인 쭉 따라가서 최종 이미지 생성
Object Pass 렌더 타겟에 그림 그리기
Shading Pass : 각 픽셀의 색 계산
기존 렌더링 방식
렌더링 결과를 저장하는 버퍼
물체의 normal 정보를 저장하는 render target
위치 정보를 저장하는 render target
Hardware Abstraction Layer
GPU 에 대한 인터페이스 제공
3D 메시의 관절을 자연스럽게 만들기
vertex의 weight를 조절한다
hierarchical 구조로 본을 세팅한다
end effector에 따라서 관절에서 가중치에 따라 어떻게 움직이는지 설정
Exception-Safe Resource Management
Constructor Acquires Destructor Releases
Scope-Based Resource Management
멀티 쓰레드 락 걸기 / 파일 입출력하기 / 스마트 포인터
unique_ptr / shared_ptr
Renderer 그냥 포인터 갖는 것보다 unique_ptr 가지면 delete 관리 안해도 된다
데이터를 담아두는 방식이다
#define(X) macro(X)
컴파일 시간 상수 값 정의
compile time 에 실행할 수 있는 expression이다
operator + operands
타입이 너무 길어지면 보기 편하게 auto로 해놓는다
헷갈리지 않을 곳에만 잘 써야 한다
컨테이너는 list constructor를 갖는다
lnitializer list로 초기화를 한다
얕은 복사 후 원본의 reference 제거
메모리 생성, 복사(X) 메모리 주소 복사(O)
임시객체 : 깊은 복사(X), 주소만 복사, 기존 참조 없애기
function pointer(X)
함수 오브젝트 생성할 때 inline lambda
upcast : (O)
runtime 체크 안한다
포인터끼리 변환
비트변환
프로그래밍한대로 메모리 동작하도록 하기 컴파일러 최적화(X)
const, volatile 비슷하게 처리 된다
런타임에 개체의 형식 확인
모든 컴파일러가 동일하게 string 저장하지 않아서 dll 쓸 때 주의해야한다
포인터 찍어보면 포인터 나오는데 ref 찍으면 안나온다
포인터는 변수 표현식
reference는 변수에 대한 참조이고, 타입이 아니다
프로세스에게 하드웨어 자원을 나누어준다
시스템 콜 한다
커널 - 어플리케이션 사이 프로그램
window 탐색기(작업표시줄, 시작, 파일탐색기)
Powershell
windows shell / windows API / Hardware Abstraction Layer
데이터를 다루는 단위가 64bit
64bit → 8byte → double 사용 가능
18.4TB RAM
프로세서와 운영체제가 둘 다 64비트 지원하면 위에서 동작한다
프로세스마다 쓰는 주소를 관리하기 위해서
커널이 다루는 모든 것
프로세스가 커널 오브젝트이다 OS가 관리하는 오브젝트
커널 오브젝트 : 프로세스를 관리하기 위해 운영체제가 사용
주소공간 : 실행 모듈 / DLL의 코드나 데이터 갖고있는 주소 공간
프로세스가 소유한 커널 오브젝트
하나의 프로세스가 생성한 커널 오브젝트
프로세스에서 커널 오브젝트를 생성하면 커널 오브젝트 핸들 테이블이 채워진다
CloseHandle() → HandleCount --
부모→자식으로 상속
DuplicateHandle
하나의 cpu에서 멀티태스킹은 라운드 로빈 방식이 적절
non preemptive : 우선순위대로 한다 설정한 값 + 걸린 시간
preemptive를 기본으로 쓴다
모든 프로세스는 자신만의 가상주소공간 가진다 → 개별 프로세스 메모리에 대한 독립성
64비트 프로세스의 가상 주소 범위
메모리 관리 장치 : CPU가 메모리에 접근하는 것을 관리하는 하드웨어 부품
vertex에 수직인 벡터
메시를 이루는 점들
model view projection
transform을 적용한 행렬
월드 공간으로 변화시키는 각 오브젝트의 변환 행렬
연산에서는 실수 값 쓴다
어두운 곳과 밝은 곳 대비 늘린다
텍스쳐 자체에 노말 벡터를 rgb로 넣어 놓았다
각 버텍스의 노말에 어떤 값 곱했을 때 왜 scale 아니라 부풀고 줄어들까
역 전치행렬 써야 노말이 안 뒤틀린다
각 버텍스의 수직 방향
Tangent + BiTangent + Normal
버텍스 하나마다 공간을 갖고있다
노말 매핑을 할 때 필요하다
int tmp = a;
a = b;
b = tmp;
swap(a, b);
swap(int pa, int pb)
int tmp = *pa;
pa = pb;
*pb = tmp;
swap(pa, pb)
Update() Object 각 프레임마다 업데이트 할 때 각자 어떻게 동작할지
Object 상속한 Player, Monster 에서 씬의 객체를 업데이트 할 때 사용한다
객체에 브레이크 포인트를 찍어서 확인하면 __vptr이 있다
각 객체에 클래스에 따라 virtual로 선언하면 어떤 함수를 사용할지 결정할 수 있다
__vptr에는 함수에 대한 포인터가 들어있다
변수의 자료형을 컴파일 시간에 자동으로 추론
런타임 X 컴파일 O
const int& a = 0;
auto a2 = a;
런타임에 타입 알려준다
auto / typeid 못 쓴다
const auto& a = b;
lvalue → lvalue
rvalue → rvalue
rvalue로 바꿔준다
typeid : 런타임
decltype : 컴파일 → 템플릿 사용 가능
struct 불필요한 데이터 제거
아니면 Serialize 쓴다
메모리 상에 연속적으로 저장하기
데이터 정렬해서 넣기
병렬로 계산
컴파일 타임에 생성
각각의 객체가 테이블을 참조 : this pointer
컴파일 타임에 생성
reflection과 view 방향이 90도 이상 → 0이다
Blinn : Specular - half angle vector
Phong : per pixel light
H = L + V / abs(L + V)
Light Position과 View Vector의 중간이다
16byte
GPU에서 벡터 연산으로 변환을 처리해야 한다. → 하나의 동일한 명령으로 여러 데이터 처리
메모리에 연속적으로 저장한다
typedef (X) using (O)
템플릿 쓰려면 컴파일 시간에 알아야 한다 → const(X)
컴파일시간에 값 변경 안하게 상수로 확정한다
상수값이면 쭉 상수값으로 바꾸어 놓기
상수 계산식 미리 계산해서 상수 값으로 바꾸어 놓기
사용 안되고 실행 안되는 코드 제거하기
반복 구문을 나눈다 → 캐시 HIT 올린다
같은 데이터 짧은 시간에 여러 번 접근한다
벡터 순회 할 때 주변 데이터 갖고온다
arr[i][j] 돌 때 j가 안에 있다 → spatial locality
strlen() for문 안에 있으면 계속 구한다 → i = strlen()로 한번만 구한다
분기 처리 줄인다 → 명령어 파이프라인에서 동시에 실행될 수 있도록 한다
if 문 자주 쓰는 것으로..?
함수를 코드로 바꾼다 → 함수 호출 비용 감소, 추가적인 컴파일 단계 최적화 가능
객체를 직접 할당한 메모리에 넣기 → 함수 내부에 반환값으로 리턴되는 객체에 대해 할당을 위해 복사생성 (X)
운영체제에서 실행되는 프로그램들이 따라야 하는 포맷
기계어 수준에서 사용을 위한 인터페이스
함수를 어셈블리 코드로 변환하는 방법을 표준화한다
CPU OS에 따라 다르다
함수 필요하니까 나중에 넣어줘 에 대한 정보
오버로딩에서 심볼 정보 만들 때 이름이 겹친다 → 추가적인 값 붙히기
디버깅을 위해서 심볼 값 저장
__vptr : pointer, constructor가 만든다
VTable : virtual function이 저장된 table, 컴파일러가 만든다
모든 프로세스는 주 스레드가 존재한다
스레드 별로 Thread Context Block 이 있다
CPU 자체 물리적인 동작 HW
동시에 작동하는 것처럼 보인다 SW
명령어 집합
CISC : complex 인텔 기본적 사용 x86, 회로 복잡 → 발열
RISC : 길이 일정, 서버용 CPU
조건 분기, 예외 발생 해야 파이프 라인 성능 잘 나온다
파이프라인 구조의 단점 : 파이프라인의 실행 단계에 가야 그 다음에 들어올 명령어가 틀린지 알 수 있다 → CPU 연산 자체와 상관 없는 메모리 계층에 흔적을 남긴다
커널 권한을 가지지 않은 프로그램에서 커널 메모리를 읽을 수 있다
명령어를 하나 처리하고 다음 명령어를 처리하는 방법(X)
명령어를 각 단계별로 나누어서 파이프라인에서 다음 상태로 넘겨주는 방법 (O) → 한 사이클에 여러 명령어 실행 → 병렬성
명령어 + 데이터 처리를 어떻게 하는지 분류한다
parallel 처리
simd : CPU, 데이터 수준의 병렬성,
GPGPU : GPU, 병렬 컴퓨팅 플랫폼, OpenCL, CUDA