Software Development 378

[C++] 함수 오버로딩과 매개변수의 디폴트 값

1. 함수 오버로딩 (Function Overloading)1234567891011121314151617181920#include int MyFunc(int num){ num++; return num;} int MyFunc(int a, int b){ return a+b;} int main(void){ MyFunc(20);// MyFunc(int num)함수 호출 MyFunc(30, 40); //MyFunc(int a, int b) 함수 return 0;}Colored by Color Scriptercs C언어에선 위와 같이 동일한 함수가 정의된다면 컴파일 오류가 발생한다. 그러나 C++에선 이를 허용하고 있으며, 이러한 형태의 함수정의를 가리켜 '함수 오버로딩(Function Overloading)'이라..

[C++] cin, cout을 이용한 입출력

1. Hello World 출력 샘플1234567891011#include int main(void){ int num=20; std::cout C++에선 데이터의 입력도 데이터의 출력과 마찬가지로 별도의 포맷 지정이 필요없다.(2) C++의 지역변수 선언 -> C언어 프로그램을 작성하는 경우 함수를 정의함에 있어 지역변수 선언이 항상 제일 먼저 등장했어야만 했다. 그러나 C++의 지역변수 선언은 함수 내 어디든 삽입이 가능for문의 초기화 문장 내에서 변수 선언이 가능하다. for(int num=0; num; num++){...} * C언어도 새로운 표준에서는 C++ 과 마찬가지로 변수선언의 위치에 제한을 두지 않는다. 그러나 아직도 대부분 컴파일러는 이를 허용하지 않는다. (3) 데이터의 연속 입력 :..

Signal 종류

기본적인 Signal과 은 아래와 같다. (시스템 마다 종류나 숫자는 차이가 있음) 1. SIGHUP: 연결된terminal이hangup하였을때(terminate)2. SIGINT: interrupt key(^C)를입력하였을때(terminate)3. SIGQUIT: quit key(^\)를입력하였을때(terminate+core)4. SIGILL: illegal instruction을수행하였을때(terminate+core)5. SIGTRAP: implementation defined hardware fault (terminate+core)6. SIGABRT: abort시스템호출을불렀을때(terminate+core)7. SIGBUS: implementation defined hardware fault (te..

Premultiplied alpha

Premultiplied Alpha - Computer Graphics에서 Alpha값을 표현하는 방법은 두가지 존재. 1) Straight alpha - RGB로 그리는 물체의 색상을 표현 - 독립된 채널의 Alpha값이 존재 * Alpha와 RGB는 독립적, 객체를 fade-in/out할 때 RGB변경없이 Alpha만 변경하여 적용가능 실제 화면에 그릴땐 아래와 같이 계산한다. result = (source.RGB * source.A) + (dest.RGB * (1 - source.A)) 2) Premultiplied alpha - RGB값에 Alpha값이 적용된 값, 그리려는 source의 RGB값에 이미 alpha값이 적용되어 있으므로 alpha값 계산 없이 바로 더하게 된다. result = (..

텍스쳐 맵

- 텍스쳐(Texture) : 3차원 물체의 표면에 2차원 이미지를 입혀서 적은 삼각형으로도 높은 디테일을 표현할 수 있게 해 주는 기술. - 범프 맵(Bump map): 물체면을 조작하는 대신 법선 벡터만을 조작하여 표면이 마치 실제로 굴곡이 있는 것처럼 만드는 것을 의미, 법센 벡터의 변화에 따라 조명에 의한 반사광의 크기가 바뀌어 실제로 굴곡이 있는 것처럼 보이는 것이다. -> 범프 매핑은 울퉁불퉁한 표면을 텍스쳐를 통해 좀 더 사실적으로 나타내기 위한 방법이다. - 라이트 매핑(Light Mapping) : 조명 모델에 의해 물체면의 밝기를 계산하는 대신 조명의 결과를 물체면에 직접 입히는 것을 말한다. 라이트 맵(Light Map)이란 빛의 방향과 세기에 따라 생성되는 빛을 받는 오브젝트의 그림..

SDL Sprite Animation

스프라이트 애니메이션 : 게임 개체의 동작을 표현할 때 사용하는 방법, 애니메이션과 마찬가지로 움직이는 그림을 순서대로 빠른 시간 안에 이어주면 눈의 착시로 연속된 동작으로 보이게 된다. 때문에 필요한 동작 대로 그 움직이는 각 단위의 그림이 모두 필요하다. 이그림을 모두 그려준 다음, 그림의 바탕색만 빼주면 캐릭터가 배경 위에 올라온 것처럼 보이게 된다.보통 아래 그림과 같이 연속된 동작이 일정한 크기로 구성되어져 있다. 각 동작별로 연속으로 그려주게 되면 애니메이션이 된다! 여기서는 SDL로 스프라이트 애니메이션을 그리는 법을 구현해본다. 우선 SDL을 통해 비트맵파일을 로드한다.12345678910typedef struct AppData { SDL_Window* window; SDL_Surface*..

프레임 드롭현상과 대책

- 프레임 : 영상을 연속해서 나타나는 데 사용하는 최소 단위, 프레임에는 1/60초나 그 이상(1/30초 등)의 시간이 있다. 이 시간 안에 해당 순간의 장면을 표현하는 처리를 한다. 구체적으로 플레이어나 적의 움직임, 게임 판정 부분, 그림을 그리는 그래픽 처리 등이 있다.디스플레이 동기화를 사용해 처리하므로 혹시 매우 짧은 시간 안에 끝났더라도 동기화 시간까지 대기하는 것이 일반적반대로 플레이어 처리가 생각했던 것보다 시간이 더 걸리가나 적 수가 증가해 프레임 안의 처리가 프레임 시간안에 끝나지 않을때는 다음 동기화 타이밍을 기다린다. 이렇게 원래 처리 시간에 처리가 끝나지 않아서 계속 처리할 때를 프레임 드롭이라고 한다.프레임 드롭이 발생해도 큰 문제가 없어 보이지만, 1/60초로 가정하고 구성한..

프레임과 FPS

프레임(Frame) 일반적인 움직임을 TV같은 디스플레이에 표시할 때는 일정한 시간 간격으로 움직임을 잘라내 연속으로 표시한다. 이 한장면에 해당하는 시간 간격을 프레임(Frame)이라고 한다. 프레임은 연속된 움직임의 최소 단위이다. 일반적인 시간은 1초를 60번 나눈 1/60초이다. 이는 일반적으로 디스플레이에ㅐ 표시를 동기화(수직 동기)하는 시간이 1/60초인데 프레임이 이 동기화를 사용하기 때문이다. FPS(Frame Per Second) 프레임의 제일 짧은 시간이 1/60초이지만 이는 게임마다 다를 수 있다. 1/30초나 1/20초를 사용할 수도 있는데, 이렇게 준비하는 시간이 길어지면 그만큼 그림을 만드는 데 사용하는 시간이 두배가 된다는 것을 의미한다. 이를 이용해 조금더 복잡한 처리를 할 ..

OpenGL Texture 그리기

SDL과 OpenGL을 이용한 텍스쳐 그리기소스코드 : https://github.com/huiyueun/GraphicsStudy/tree/master/texture_sample 먼저 SDL_LoadBMP() API를 통해 그림파일(bmp)을 로드한다. (다른 확장자를 로드하려면 SDL_Image 활용)12SDL_Surface* image_surface;image_surface = SDL_LoadBMP("./cat512.bmp");csSDL_Surface는 화면에 그려질 이미지 정보를 담고 있게 된다. 이 데이터 정보를 갖고 있어, 이 데이터 정보를 통해 gl로 그리면 된다.SDL_Surface Data FieldsUint32flags(internal use)SDL_PixelFormat*formatthe..

OpenGL IBO를 사용한 큐브 그리기

먼저 아래를 먼저 이해 1. OpenGL VBO로 큐브그리기 2. OpenGL IBO를 이용한 직사각형 그리기 git : cube_ibo (https://github.com/huiyueun/GraphicsStudy/tree/master/5_sdl_cube_indexed)사실 IBO를 이용하여 직사각형을 그렸다면, 그걸 이용하여 6면체를 모두 IBO를 통해 그려주면 된다. 먼저 DrawCall을 아래와 같이 변경한다.기존 임의로 Index의 갯수를 6개 지정했던 코드를 사이즈를 통해 갯수를 알아와서 그리도록 수정했다.12//glDrawElements(GL_TRAINGLES, 6, GL_UNSIGNED_INT, 0);glDrawElements(GL_TRIANGLES, (sizeof(cube_elements)..