목록언어/C, C++ (22)
개발하는 리프터 꽃게맨입니다.
스텐실 버퍼는 몇 가지 특수 효과를 구현하기 위해 사용할 수 있는 off-screen 버퍼이다.스텐실 버퍼는 백 버퍼와 깊이 버퍼와 동일한 해상도를 가지며, 스텔실 버퍼의 ij 번째 픽셀은 백 버퍼와 깊이 버퍼의 ij번째 픽셀과 대응된다. ID3D11DepthStencilView.. 등의 이름에서 보았다시피 스텐실 버퍼와 깊이 버퍼와 함께 동작한다.스텐실 버퍼는 스텐실처럼 작동하여 특정 픽셀 조각이 백버퍼로 렌더링되는 것을 차단한다. 예를 들어, 거울을 구현할 떄, 거울의 평면을 기준으로 객체를 반사해야 하지만, 반사된 이미지는 거울 안에만 그려져야 한다. 스텐실 버퍼를 사용하여 반사가 거울에 그려지는 경우가 아니면 렌더링을 차단할 수 있다. 스텐실 버퍼는 ID3D11DepthStencilState ..
most vexing parse 이하 성가신 파싱은 선언으로 해석할 수 있는 것은 선언으로 해석해야 한다.는 규칙이다.예를 들어 아래같은 코드를 보자. 여기서 MyClass a() 를 생각해보자.이 구문은 2가지로 해석될 여지가 있다. 1. 함수 선언2. 객체의 생성 (기본생성자 호출) 그런데 '성가신 파싱'에 의해 무조건 '선언'으로 해석된다. 분명 생성자는 호출했다고 생각했는데생성자가 호출이 안된 것을 볼 수 있다. 따라서 '성가신 파싱'을 회피하기 위해서 객체를 선언하고 싶다면 언제나 중괄호 초기화를 사용하는 것을 권장한다.
이것을 따로 부르는 개념이 있는지는 모르겠지만, 필요해서 연구를 하다보니 꽤나 쓸만한 개념인 것 같아서 포스팅 해봅니다. 대부분의 프로그램이 이런 방식으로 메인 루프가 존재합니다. 예를 들어서 우리가 게임을 만든다고 가정해봅시다. 그럼 플레이어가 화살을 쏜다고 하면 화살을 생성해야할 것 이고, 또 화살이 몬스터에게 닿으면 삭제를 해줘야 할 것 입니다. 그런데, 이런 식으로 루프 중간중간에 막 추가해버리면 코드가 꼬일 수 있습니다. 정확한 예시는 제시하긴 좀 애매하긴한데.. 어쨌든 우리는 함수를 예약해서 지연 처리를 할 필요성이 있다는 겁니다. (좀 엉렁뚱땅 넘어가는 느낌이긴 하지만..) 중간 중간에 특히, 특정 메모리를 추가로 할당하거나 삭제할 때, use-after-free 문제 등이 많이 발생하므로 ..
[ 목차 ] 1. 람다 표현식 C++에서는 '호출할 수 있는 객체'를 callable이라고 말합니다. 그 종류는 총 5개 1) std::function 2) 함수 포인터 3) operator() 4) bind에서 나온 타입 (아직 다루지 않은 내용) 그리고 lambda 람다식입니다. 새로운 '호출성 객체'라고 하죠, 람다는 다른 언어에서는 익명함수, 무명함수라고 말하며 기능적으로는 '재활용하지 않는 일회용 함수'라고 말합니다. 이름이 없고, 필요할 때 딱 만들어서 쓰고 버리는 함수라고 할 수 있죠. 예시는 아래와 같습니다. 즉석 해서 함수를 정의한다고 보면 되겠습니다. 이런 식으로 람다 변수로 초기화해서 호출하는 방법도 있고, 바로 호출하고 버리는 방법도 있고, 매개변수로 넘기는 방법도 있습니다. 더 다..
[ 목차 ] 이전 포스팅 https://powerclabman.tistory.com/48#6._%EB%A7%88%EC%B9%98%EB%A9%B0 [C++] 스마트 포인터 - 1 (unique_ptr, unique_ptr 역설계) [ 목차 ] 1. 동적 메모리 C++에서 동적 메모리는 new로 할당하고 delete로 해제합니다. new는 객체를 할당하고 초기화하여 그 객체에 대한 포인터를 반환하고 delete는 소멸하며 할당한 메모리를 해제하 powerclabman.tistory.com 따로 복습을 위한 서술은 없습니다. 1. shared_ptr shared_ptr 은 본격적으로 자동 메모리 관리를 하기위한 포인터입니다. 내부에는 ptr 과 control_block 이 존재하고, ptr은 객체를 참조하기위..