이전 글에서 원기둥과 광선의 접점 그리고 원기둥의 법선 벡터를 구하는 방법을 알아봤다. 이번 글에서는, 접점과 법선 벡터를 사용하여 난반사 표면을 렌더링하는 방법을 배워보자. 난반사 표면이란? 정반사 표면에서 표면에 들어오는 광선과 법선 벡터는 입사각을 이루고 반사
이전 글에서 visibility와 shading 문제가 무엇인지 알아봤다. 이것을 해결하기 위해서는 광선과 물체들간에 교점을 구하고 물체의 법선 벡터를 구할 수 있어야한다. 필자는 구, 원기둥 그리고 평면을 렌더링했는데 이 세 도형의 법선 벡터와 교점을 구하는 방법을
서론 사실 수식을 유도/이해하지않고 단순히 레이트레이싱을 구현하는 것이 목표라면, 다양한 선형 좌표계와 비선형 좌표계를 알아야하는건 아니다. 하지만 단순히 수식을 받아들이는 건 재미없고 따분한 일이다. 이번 글에서는 수식 유도에 필요한 구면 좌표계, 원통 좌표계 그리
운영체제는 프로세스를 실행 단위로 사용한다. 프로세스는 독립적인 메모리 공간을 갖는데, 왜 웹서버를 멀티 프로세스로 구현하는 경우가 있을까? 그것은 소켓을 통해 데이터를 수/송신할 때 사용하는 read/write 함수가 블로킹 함수이기 때문이다. 모든 경우에서 블로킹이
일반적인 상황에서는 소켓을 생성한 뒤 그대로 사용하여 통신을 진행해도 무방하지만 소켓에 옵션을 설정해서 동작을 바꿔야하는 상황이 발생하기도 한다. 이번 글에서는 소켓의 옵션을 확인하고 설정하는 방법과 흔하게 쓰이는 옵션 네가지(SO_SNDBUF, SO_RCVBUF, S
TCP는 연결 지향형 프로토콜이기 때문에 데이터를 송수신하기 전에는 연결을 생성하고 데이터의 송수신이 완료된 후에는 연결을 종료해야한다. 이번 글에서는 연결을 종료하는 방법에 대해 살펴보자. 소켓또한 파일이기 때문에, close 시스템 함수를 통해 소켓을 닫아서 연결을
이전 글에서는 서버 소켓에 ip주소와 포트를 할당하는 방법에 대해 알아보았다. 이번 글을 통해, 연결하여 통신하는 방법을 알아보자.소켓을 통한 통신은 다음과 같은 과정을 거친다.소켓 생성. socket()소켓 주소할당. bind()연결요청 대기상태. listen()연결
서론 저번 글을 통해 TCP 소켓을 생성하는 방법에 대해 알아봤다. 이번 글에서는 소켓에 주소와 포트를 할당하는 방법을 알아보자. 본론 왜 주소와 포트를 할당하나? 서버는 TCP 소켓을 생성한 뒤에, 해당 소켓에 ip주소와 포트를 할당해야한다. 이는 특정 ip
레이 트레이싱은 광선을 추적해서 이미지를 렌더링한다. 레이 트레이싱은 빛을 다루기 때문에, 빛의 측정에 대해 알면 수식을 유도하는데 큰 도움이 된다. 빛의 측정을 다루는 학문인 radiometry에 대해 간략하게 살펴보자.하나의 광자가 갖는 에너지는 아래와 같다.$Q
서론 로지스틱 회귀는 이산적인 종속 변수 한 개만 있는 경우 많이 사용하는 회귀 기법이다. 로지스틱 회귀의 비용 함수는 이산적인 종속 변수 한 개만 있는 딥러닝 모델에서 사용하는 비용 함수와 동일하기에 로지스틱 회귀의 비용 함수를 잘 이해하는 건 중요하다. 이번 글에
이 시리즈에서 구현하는 웹 서버는 유닉스 OS에서 동작한다고 가정한다.소켓을 생성하는 함수인 socket 함수의 프로토타입은 아래와 같다.비슷한 프로토콜을 묶어서 프로토콜 체계라 부른다. 필자는 프로토콜 체계를 나누는 기준이 무엇인지 파악하지 않았다. 웹 서버를 구현
시리즈의 이전 글을 통해 레이 트레이싱을 구현하기 위해 필요한 수학적 배경 지식을 습득하고 카메라를 구현해봤다. 이제 렌더링을 크게 visibility와 shading으로 나누어서 각 파트가 어떤 기능을 수행해야할지 알아보자.필자의 앞에 커다란 벽이 있고 벽 뒤에 어떤
이번 글에서는 리다이렉션 상태 코드, 클라이언트 에러 상태 코드 그리고 서버 에러 상태 코드를 살펴보자.리다이렉션 상태 코드는 클라이언트가 요청한 자원이 위치한 곳을 알려줄 때 사용한다. 다음 글에서는 에러 상태 코드에 대해 다루겠다.
저번 글에서는 HTTP 메시지의 전반적인 구조와 메서드에 대해 다뤘다. 이번 글에서는 상태코드에 대해 상세히 알아보자.상태 코드는 서버가 클라이언트에게 응답을 보낼 때 포함된다. 서버는 상태 코드를 클라이언트의 요청을 잘 처리했는지, 처리하지 못했다면 어떤 문제가 있었
시리즈의 이전 글에서 3차원 실공간을 2차원 평면인 캔버스에 맵핑하는 방법을 다뤘다. 이번 글에서는, 캔버스에 맵핑된 점과 카메라를 지나는 광선을 카메라 로컬 좌표계에서 생성하고 이를 글로벌 좌표계로 변환하는 과정을 다룰 것이다.저번 글에서 계산을 단순화하기 위해서 캔
서론 웹 서버는 HTTP 메시지를 받아서 파싱하여 적절한 자원을 찾은 뒤, 해당 자원을 HTTP 메시지로 보내주는 소프트웨어이다. 클라이언트와 웹 서버간에 이루어지는 통신은 모두 HTTP를 통해 발생하기 때문에, HTTP 메시지를 이해하는 것은 중요하다. HTTP 메
선형대수학은 공학을 공부해본 학생이라면 누구나 한 번쯤 수강했거나 앞으로 수강해야할 과목이다. 대부분의 학생이 수강하는만큼 선형대수는 다양한 분야에서 활용되는데, 3d 그래픽도 예외는 아니다. 선형대수학은 아직도 연구가 진행되는 분야이고 인류는 행렬에 대해 많은 지식을
사용자는 많은 시간을 웹 브라우저를 사용하며 보낸다. 어느 통계에 따르면 컴퓨터 사용 시간의 n%를 브라우저가 차지한다고 한다. 이토록 우리는 웹 브라우저를 통해 많은 자원을 획득하고 소비한다. 그런데 브라우저는 어느 자원을 요청할 것인지 어떻게 표현하고 서버는 어느
텐서는 크게 네 가지 방법을 통해 초기화할 수 있다.이 경우, 데이터의 타입을 자동으로 유추해서 실행한다.torch.ones_like(input)는 input과 동일한 크기를 가지면서 각각의 원소가 1인 텐서를 만들어 반환한다. 이는, torch.ones(input.s
C++의 다이아몬드 상속은 C++를 다뤄본 학생/프로그래머라면 한 번쯤 경험하거나 들어봤을 개념이다. 하지만 가상 상속이 어떻게 다이아몬드 상속 문제를 해결하는지 오랫동안 와닿지 않았다. 이를 잘 설명하는 좋은 글을 발견해서 해당 내용을 소개하고자 한다.다이아몬드 상속