Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]

2026. 5. 13. 22:39·자격증/게임국가기술자격검정 [한국콘텐츠진흥원]

Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이


문제 1. 다음 중 게임 개발에서 메모리 관리가 가장 중요한 이유와, 이를 효과적으로 처리할 수 있는 프로그래밍 언어에 대한 설명으로 옳은 것은?

① 게임의 로딩 시간을 줄이기 위해서이며, JavaScript가 가장 효과적이다.

② 프레임 레이트를 안정적으로 유지하기 위해서이며, C++가 가장 효과적이다.

③ 네트워크 지연을 최소화하기 위해서이며, Java가 가장 효과적이다.

④ 그래픽 품질을 향상시키기 위해서이며, Python이 가장 효과적이다.

개념: 메모리 관리(Memory Management), 프로그래밍 언어 (Programming Language)

게임 개발에서 메모리 관리(Memory Management) 게임은 실시간으로 고해상도 그래픽, 사운드, 물리 엔진 등을 처리해야 하므로, 메모리 자원이 제한된 상황에서 효율적인 할당과 해제가 필수적입니다.

메모리 관리가 미흡하면 프레임 드랍(렉), 끊김 현상, 멈춤, 비정상 종료(Crash) 등이 발생하여 게임의 퍼포먼스(프레임 레이트)를 저하시킵니다.

풀이:

  • 이유: 메모리 누수(Memory Leak)나 잦은 가비지 컬렉션(Garbage Collection)은 게임의 프레임 레이트를 불안정하게 만듭니다. 안정적인 60fps, 120fps 등을 유지하려면 메모리를 수동으로 정밀하게 제어하여 CPU 캐시 효율을 높이고 메모리 낭비를 줄여야 합니다.
  • 언어: **C++**는 개발자가 메모리를 직접 관리(포인터 및 new/delete 사용)할 수 있어 불필요한 메모리 할당/해제를 최소화하고, 낮은 수준의 하드웨어 제어가 가능하여 성능이 가장 중요한 게임 엔진(언리얼 엔진 등) 개발에 사실상 표준으로 사용됩니다.

오답 분석:

JavaScript, Python은 가비지 컬렉터가 작동하여 예측 불가능한 멈춤(Garbage Collection pause)이 발생할 수 있어 고성능 게임에는 부적합합니다. Java 역시 가비지 컬렉션 오버헤드가 발생할 수 있습니다.

개인 궁금증:

??? (Garbage Collection pause) 때문에 js 랑 python 이 부적합하다고 했는데 c# 도그러면 가비지 컬렉터가 작동하여 예측 불가능한 멈춤(Garbage Collection pause)이 발생할 수 있어 고성능 게임에는 부적합한가?

  • 결론부터 말씀드리면, C#도 가비지 컬렉션(GC) 멈춤 현상(Pause)이 발생하므로 하드웨어 제어가 극한으로 필요한 환경에서는 C++보다 불리합니다. 그러나 현대 게임 개발(특히 유니티 엔진)에서는 이를 극복하는 최적화 기술을 제공하므로 널리 사용됩니다.

1. C#도 GC 멈춤 문제가 발생하나요?

  • 예, 발생합니다. C#은 Java나 JavaScript처럼 메모리를 자동으로 관리하는 가비지 컬렉션 기반 언어입니다.
  • 메모리 해제 시점에 프로그램이 순간적으로 멈추는 'GC 스파이크(Spike)' 현상이 발생하여 프레임 드랍(렉)을 유발할 수 있습니다.

2. 그런데도 C#이 게임 개발(유니티)에 많이 쓰이는 이유

유니티(Unity) 엔진은 C#의 GC 문제를 해결하기 위해 다음과 같은 강력한 최적화 장치를 도입했습니다.

  • IL2CPP (Intermediary Language to C++)
    • C# 코드를 그대로 실행하지 않고, 빌드 시점에 C++ 코드로 변환하여 컴파일합니다.
    • 이 과정에서 실행 속도가 C++ 수준으로 빨라지고 메모리 효율이 극대화됩니다.
  • 유니티 고성능 기술 스택 (DOTS)
    • **데이터 지향 기술 스택(DOTS)**을 도입하여 메모리를 C++처럼 연속적인 배열 형태로 관리합니다.
    • GC의 관리를 받지 않는 '네이티브 메모리 영역'을 사용하여 멈춤 현상을 원천 차단합니다
  • 증분 가비지 컬렉션 (Incremental GC)
    • 한 번에 모든 쓰레기를 치우지 않고, 프레임마다 아주 조금씩 나누어 쓰레기를 치웁니다.
    • 이로 인해 눈에 보이는 프레임 드랍이 거의 발생하지 않습니다.

3. JavaScript / Python과의 결정적 차이

  • JS / Python: 웹이나 스크립트 목적 위주로 설계되어 개발자가 메모리 구조(데이터의 연속성, 캐시 효율)를 세밀하게 제어하기 매우 어렵습니다.
  • C#: 가비지 컬렉션을 사용하지만, 필요에 따라 개발자가 구조체(struct), stackalloc 등을 사용해 메모리를 하드웨어 친화적으로 직접 제어할 수 있는 기능을 많이 열어두었습니다.

요약:

C#은 순수 C++보다는 GC 멈춤 위험이 있지만, 엔진 차원의 최적화(IL2CPP, DOTS)와 개발자의 메모리 관리 역량을 통해 고성능 3D 게임을 만드는 데 아무런 지장이 없는 수준까지 발전했습니다.

정답: ② 프레임 레이트를 안정적으로 유지하기 위해서이며, C++가 가장 효과적이다.

문제 2. 다음 코드는 어떤 알고리즘을 구현한 것인지 고르시오.

bool checkCollision(GameObject* obj1, GameObject* obj2) {
    float dx = obj1->x - obj2->x;
    float dy = obj1->y - obj2->y;
    float distance = sqrt(dx*dx + dy*dy);
    return distance < (obj1->radius + obj2->radius);
}

① A* 경로 탐색

② 구형 충돌 감지

③ 깊이 우선 탐색(DFS)

④ 쿼드 트리(Quad Tree) 분할

개념: 알고리즘

제시된 코드는 두 객체(GameObject)의 중심점 사이의 거리(distance)를 계산하고, 이 거리가 두 객체의 반지름 합(obj1->radius + obj2->radius)보다 작은지 확인하여 충돌 여부를 판별합니다.

  • sqrt(dx*dx + dy*dy): 피타고라스 정리를 사용하여 두 점 사이의 거리를 계산하는 수학적 식입니다.
  • distance < (obj1->radius + obj2->radius): 거리가 반지름의 합보다 작으면 두 원(구)이 겹친 것으로 간주합니다.

풀이:

이 방식은 원이나 구 형태의 콜라이더를 가진 객체 간의 충돌을 감지하는 가장 기초적이고 효율적인 방법입니다.

  • ① A* 경로 탐색: 길 찾기 알고리즘입니다.
  • ③ 깊이 우선 탐색(DFS): 그래프/트리 탐색 알고리즘입니다.
  • ④ 쿼드 트리(Quad Tree) 분할: 공간 분할 알고리즘으로, 충돌 검사 대상을 줄이는 데 사용됩니다.

정답: ② 구형 충돌 감지

문제 3. 게임 AI에서 사용되는 '행동 트리(Behavior Tree)'에 대한 설명으로 올바른 것은?

① 플레이어의 행동을 학습하여 비슷한 패턴으로 대응하는 머신러닝 알고리즘이다.

② 게임 캐릭터의 애니메이션 전환을 관리하는 그래프 구조이다.

③ AI의 의사 결정 과정을 계층적으로 구성하여 복잡한 행동을 모델링하는 구조이다.

④ 게임 내 모든 객체 간의 상호작용을 정의하는 데이터베이스 구조이다.

개념: 행동 트리 (Behavior Tree)

행동 트리(Behavior Tree, BT)는 게임 AI, 특히 NPC(Non-Player Character)의 의사결정 로직을 설계하는 데 널리 사용되는 계층적 구조 모델입니다.

풀이:

  • 행동 트리는 루트 노드에서 시작하여 여러 자식 노드(컴포지트, 데코레이터, 리프 노드)로 뻗어 나가는 나무(Tree) 구조를 가집니다.
  • AI의 복잡한 행동을 "상태(State)"가 아닌 "태스크(Task)" 단위로 분할하고 계층적으로 구성하여, 조건에 따라 유연하게 행동을 변경할 수 있게 합니다.
  • **컴포지트 노드(Sequence, Selector)**가 행동의 흐름(우선순위, 순서)을 제어하고, **리프 노드(Action)**가 실제 이동, 공격 등의 행동을 수행합니다.

오답 분석:

① 머신러닝 알고리즘이 아닌, 미리 설계된 규칙 기반(Rule-based)의 AI 구조입니다.

② 애니메이션 전환 관리는 주로 '유한 상태 기계(FSM, Finite State Machine)'나 '애니메이션 블렌드 트리'가 수행합니다.

④ 행동 트리는 행동의 논리적 흐름을 정의하며, 게임 내 전체 상호작용 데이터베이스가 아닙니다.

정답: ③ AI의 의사 결정 과정을 계층적으로 구성하여 복잡한 행동을 모델링하는 구조이다.

문제 4. 다음 중 '물리 기반 렌더링(PBR, Physically Based Rendering)'의 주요 특징이 아닌 것은?

① 실제 물리 법칙을 기반으로 빛과 재질의 상호작용을 시뮬레이션한다.

② 금속성(Metallic)과 거칠기(Roughness) 값을 사용하여 재질을 정의한다.

③ 다양한 조명 환경에서 일관된 재질 표현이 가능하다.

④ 렌더링 속도를 높이기 위해 빛의 반사와 굴절 효과를 단순화한다.

개념: 물리 기반 렌더링(PBR, Physically Based Rendering)

물리 기반 렌더링(PBR, Physically Based Rendering)은 실제 물리 법칙(빛의 반사, 굴절, 에너지 보존 등)을 수학적으로 계산하여, 다양한 조명 환경에서 재질의 외관을 정확하고 일관되게 표현하는 3D 그래픽 렌더링 방식입니다.

풀이:

  • ① 사실입니다. PBR은 현실 세계의 물리적 법칙을 기반으로 빛과 물체의 상호작용을 시뮬레이션합니다.
  • ② 사실입니다. 금속성(Metallic/Metalness)과 거칠기(Roughness) 맵을 사용하여 표면의 재질 특성을 정의하는 것이 PBR의 대표적인 워크플로우입니다.
  • ③ 사실입니다. 물리적으로 정확하기 때문에 조명이 바뀌어도 재질이 일관되게 보이며, 다양한 환경에서 사실적인 표현이 가능합니다.
  • ④ 특징이 아닙니다. PBR은 단순히 렌더링 속도를 높이기 위해 빛의 반사/굴절을 단순화하지 않습니다. 오히려 물리적으로 타당한 결과를 얻기 위해 복잡한 계산을 수행합니다. 다만, 실시간 렌더링(게임 등)을 위해 근사치(Approximate)를 사용하기도 하지만, 이는 단순화가 아니라 효율적인 계산 방식을 택하는 것입니다. PBR의 목표는 사실성이지, 렌더링 속도 향상을 위한 단순화가 아닙니다.

정답: ④ 렌더링 속도를 높이기 위해 빛의 반사와 굴절 효과를 단순화한다.

문제 5. 최신 게임에서 사용되는 '레이 트레이싱(Ray Tracing)' 기술에 대한 설명으로 올바른 것은?

① 3D 모델의 폴리곤 수를 실시간으로 줄여 성능을 최적화하는 기술.

② 빛의 물리적 경로를 시뮬레이션하여 사실적인 반사, 그림자, 굴절 효과를 구현하는 기술.

③ 2D 이미지를 3D 모델로 자동 변환하는 인공지능 기반 기술.

④ 여러 대의 GPU를 병렬로 연결하여 렌더링 속도를 향상시키는 기술.

개념: 레이 트레이싱(Ray Tracing), LOD(Level of Detail)

레이 트레이싱(Ray Tracing)은 가상 공간에서 빛(광선, Ray)이 광원으로부터 나와 물체에 부딪히고 반사, 굴절되는 물리적 경로를 추적(Trace)하여 화면을 렌더링하는 고품질 그래픽 기술입니다.

풀이:

  • ①번: 폴리곤 수를 줄이는 것은 LOD(Level of Detail) 기술에 대한 설명입니다.
  • ②번: 레이 트레이싱의 핵심은 실제 빛처럼 거울, 물, 금속 등에 사물이 사실적으로 반사되거나, 그림자가 굴절되는 효과를 표현하는 것입니다.
  • ③번: 인공지능 기반의 3D 생성 기술입니다.
  • ④번: SLI(NVIDIA)나 Crossfire(AMD) 같은 멀티 GPU 기술에 대한 설명입니다.

참고: 레이 트레이싱은 연산량이 많아 성능 소모가 크지만, 차세대 게임 그래픽의 표준으로 자리 잡고 있습니다.

정답: ② 빛의 물리적 경로를 시뮬레이션하여 사실적인 반사, 그림자, 굴절 효과를 구현하는 기술.

문제 6. 모바일 게임에서 배터리 소모를 최소화하기 위한 최적화 기법으로 가장 효과적이지 않은 것은?

① GPU 사용률을 줄이기 위해 화면 해상도를 동적으로 조절한다.

② 화면 밖 객체의 업데이트를 중지하는 컬링(Culling) 기법을 적용한다.

③ 가능한 모든 계산을 매 프레임마다 정확하게 수행한다.

④ 애니메이션과 물리 시뮬레이션의 업데이트 빈도를 조절한다.

개념:

  • 모바일 게임 최적화: 기기 자원(CPU, GPU, 배터리) 소모를 줄여 발열을 방지하고 배터리 수명을 연장하는 기술입니다.
  • 연산 최소화: 매 프레임 발생하는 불필요한 계산을 줄이는 것이 배터리 절약의 핵심입니다.

풀이:

  • ① 해상도 동적 조절: GPU 부하를 직접적으로 낮추어 전력 소모를 크게 줄입니다.
  • ② 컬링(Culling) 적용: 화면에 보이지 않는 객체의 연산을 차단하여 CPU와 GPU 자원을 모두 아낍니다.
  • ③ 매 프레임 정확한 계산: 불필요한 고정밀도 연산을 매 순간 반복하면 CPU/GPU가 최대 성능으로 작동하여 배터리가 가장 빠르게 소모됩니다. 데이터 캐싱이나 주기적 업데이트로 대체해야 합니다.
  • ④ 업데이트 빈도 조절: 중요도가 낮은 애니메이션이나 물리 연산의 프레임레이트를 낮추면 프로세서 소모 전력이 감소합니다.

정답: ③ 가능한 모든 계산을 매 프레임마다 정확하게 수행한다.

문제 7. 다음 중 '역운동학(Inverse Kinematics, IK)' 기술의 주요 용도로 가장 적절하지 않은 것은?

① 캐릭터의 발이 지형에 자연스럽게 접촉하도록 조정.

② 캐릭터가 물체를 잡을 때 손의 위치와 방향을 조정.

③ 캐릭터의 시선이 특정 대상을 자연스럽게 따라가도록 조정.

④ 미리 제작된 애니메이션 시퀀스의 프레임 수를 줄여 메모리 사용량 최적화.

개념: 역운동학(Inverse Kinematics, IK)

역운동학(Inverse Kinematics, IK)은 캐릭터의 관절 체인(예: 어깨-팔꿈치-손목)에서 최종 위치(End Effector, 예: 손)를 지정하면, 나머지 관절들이 그 위치에 도달하도록 계산하여 자연스러운 포즈를 만드는 절차적 애니메이션 기술입니다.

풀이:

  • ① 발이 지형에 접촉: 경사지나 계단에서 발을 지면에 자연스럽게 고정시키는 것은 IK의 가장 대표적인 용도입니다.
  • ② 물체 잡기: 손을 특정 목표 위치로 가져가 물체를 잡는 포즈를 계산하는 데 사용됩니다.
  • ③ 시선 처리: 고개나 몸을 돌려 특정 대상을 자연스럽게 바라보게 하는 데 사용됩니다.
  • ④ 메모리 사용량 최적화: 애니메이션 프레임 수를 줄이는 것은 '애니메이션 압축(Compression)' 기술의 영역이며, IK는 실시간으로 포즈를 계산하므로 오히려 연산량(CPU/GPU 부하)을 증가시킬 수 있습니다. 따라서 적절하지 않습니다.

정답: ④ 미리 제작된 애니메이션 시퀀스의 프레임 수를 줄여 메모리 사용량 최적화.

문제 8. 다음 HLSL 코드가 수행하는 기능으로 가장 적절한 것은?

// hlsl
cbuffer TransformBuffer : register(b0) {
    matrix World;
    matrix View;
    matrix Projection;
}

struct VertexInput {
    float4 position : POSITION;
    float4 color : COLOR;
};

struct PixelInput {
    float4 position : SV_POSITION;
    float4 color : COLOR;
    float fog : FOG;
};

PixelInput VS(VertexInput input) {
    PixelInput output;

    float4 worldPosition = mul(input.position, World);
    float4 viewPosition = mul(worldPosition, View);
    output.position = mul(viewPosition, Projection);

    float distanceToCamera = length(viewPosition.xyz);
    output.fog = saturate((distanceToCamera - 10.0f) / 40.0f);
    output.color = input.color;

    return output;
}

float4 PS(PixelInput input) : SV_TARGET {
    float4 fogColor = float4(0.5f, 0.5f, 0.5f, 1.0f);
    return lerp(input.color, fogColor, input.fog);
}

① 텍스처 매핑을 구현한 셰이더

② 거리 기반 안개(fog) 효과를 구현한 셰이더

③ 노멀 매핑을 구현한 셰이더

④ 그림자 매핑을 구현한 셰이더

개념: hlsl, 셰이더, 버텍스 셰이더, 픽셀 셰이더, 안개 효과

  • HLSL(High-Level Shader Language): 다이렉트X(DirectX)에서 그래픽스 파이프라인을 제어하기 위해 사용하는 고수준 셰이더 언어입니다.
  • 버텍스 셰이더(VS): 정점의 위치를 변환하고 정점별 데이터(색상, 안개 계수 등)를 계산합니다.
  • 픽셀 셰이더(PS): 화면에 출력될 최종 픽셀의 색상을 계산합니다.
  • 안개(Fog) 효과: 카메라와 물체 사이의 거리에 따라 물체의 색상과 안개 색상을 보간하여 원근감을 주는 기법입니다.

풀이

  • 거리 계산: 버텍스 셰이더에서 뷰 공간의 좌표(viewPosition)의 길이를 구해 카메라로부터의 거리(distanceToCamera)를 계산합니다.
  • 안개 계수 구하기: saturate((distanceToCamera - 10.0f) / 40.0f) 식을 통해 거리에 따른 안개 강도(output.fog)를 0과 1 사이 값으로 선형 계산합니다.
  • 색상 혼합: 픽셀 셰이더에서 lerp(input.color, fogColor, input.fog) 함수를 사용합니다. 원래 오브젝트 색상(input.color)과 지정된 안개 색상(fogColor, 회색)을 안개 계수에 따라 선형 보간합니다.
  • 결론: 이 코드는 카메라와의 거리에 따라 안개가 짙어지는 효과를 처리하고 있습니다.

정답: ② 거리 기반 안개(fog) 효과를 구현한 셰이더

문제 9. 다음 HLSL 코드에서 성능 최적화 관점에서 가장 개선이 필요한 부분은?

// hlsl
float4 PS(float2 texCoord : TEXCOORD0) : SV_TARGET
{
    float4 color = float4(0, 0, 0, 0);

    for (int i = 0; i < 64; i++) {
        for (int j = 0; j < 64; j++) {
            float2 offset = float2(i / 640.0f, j / 480.0f);
            color += texture.Sample(texSampler, texCoord + offset) / 4096.0f;
        }
    }
    return color;
}

① 중첩 루프를 사용한 텍스처 샘플링 ② 상수 나눗셈 연산(/ 4096.0f) ③ float4 초기화 방식 ④ 텍스처 좌표 오프셋 계산 방식

개념: HLSL, PS, Texture Sampling

픽셀 셰이더(PS)에서의 텍스처 샘플링(Texture Sampling) 비용 및 계산 복잡도

풀이:

제공된 코드는 픽셀당 64 x 64 = 4096 번의 텍스처 샘플링을 수행합니다. GPU에서 텍스처 샘플링은 메모리 접근을 포함하기 때문에 매우 비싼 작업이며, 중첩 루프를 통해 이를 수행하면 픽셀당 수천 번의 텍스처 페치가 발생하여 성능이 극도로 저하됩니다.

  • ① 중첩 루프를 사용한 텍스처 샘플링 (핵심 원인): 픽셀 하나를 그리기 위해 4096 번 텍스처를 읽는 것은 GPU에 너무 큰 부하를 줍니다.
  • ② 상수 나눗셈 연산: 0.0f는 컴파일러에 의해 상수로 처리되거나 고속으로 처리될 수 있어 병목의 주원인이 아닙니다.
  • ③ float4 초기화: 단순히 0으로 채우는 것은 매우 빠릅니다.
  • ④ 오프셋 계산: 루프 내부에서 수행되지만, 텍스처 샘플링 횟수에 비하면 오버헤드가 작습니다.

이 경우, 4096번의 샘플링이 실제로 필요하다면 텍스처를 미리 블러링(Blur)하여 밉맵(Mipmap)을 사용하거나, 셰이더 내에서 연산을 획기적으로 줄이는 최적화가 필요합니다.

정답: ① 중첩 루프를 사용한 텍스처 샘플링

문제 10. 다음 HLSL 셰이더 코드가 수행하는 기능으로 가장 적절한 것은?

// hlsl
sampler2D normalMap;

struct PS_INPUT
{
    float2 Texcoord : TEXCOORD0;
    float3 ViewDirection : TEXCOORD1;
    float3 LightDirection : TEXCOORD2;
};

float4 ps_main( PS_INPUT Input ) : COLOR0
{
    vec3 normal = normalize(tex2D(normalMap, Input.Texcoord).xyz * 2.0 - 1.0);
    float intensity = max(dot(normal, normalize(Input.LightDirection)), 0.0);
    return intensity;
}

① 텍스처에 블러 효과를 적용한다.

② 노멀 맵을 사용하여 표면의 조명 강도를 계산한다.

③ 물체의 윤곽선을 강조하는 셀 셰이딩을 구현한다.

④ 물 표면의 반사 효과를 시뮬레이션한다.

개념: 노멀 매핑(Normal Mapping) 및 디퓨즈 라이팅(Diffuse Lighting)

풀이:

    1. tex2D(normalMap, Input.Texcoord).xyz * 2.0 - 1.0: 텍스처에서 샘플링한 노멀 값은 [0, 1] 범위에 있으므로, 이를 [-1, 1] 범위로 변환하여 실제 법선 벡터(Normal Vector)로 사용합니다.
    1. normalize(...): 변환된 법선 벡터를 정규화하여 길이를 1로 만듭니다.
    1. dot(normal, normalize(Input.LightDirection)): 표면의 법선 벡터와 빛의 방향 벡터를 내적 합니다.
    1. max(..., 0.0): 내적 값은 코사인 법칙에 따라 두 벡터 사이의 각도에 비례하며, 음수 값(빛이 표면 뒤에서 올 때)을 0으로 처리하여 조명 강도가 0보다 작아지지 않게 합니다 (램버트 디퓨즈 모델).
    1. 결과적으로, 이 코드는 노멀 맵을 이용해 픽셀 단위로 표면의 법선을 변경하고, 빛의 방향과의 각도를 계산하여 픽셀의 조명 강도(밝기)를 계산하는 과정입니다.

1,3,4 번이 답이 되기위한 HLSL 셰이더 코드

① 텍스처에 블러 효과를 적용한다 (가우시안 블러 예시)

주변 픽셀들의 색상을 특정 가중치로 평균 내어 흐리게 만듭니다.

// hlsl
sampler2D sceneTex;

struct PS_INPUT {
    float2 Texcoord : TEXCOORD0;
};

float4 ps_main(PS_INPUT Input) : COLOR0 {
    // 픽셀 간격 (오프셋)
    float2 offset = float2(0.005, 0.005); 
    float4 color = float4(0, 0, 0, 0);
    
    // 3x3 주변 픽셀 샘플링 후 가중치 적용 평균
    color += tex2D(sceneTex, Input.Texcoord + float2(-offset.x, -offset.y)) * 0.0625;
    color += tex2D(sceneTex, Input.Texcoord + float2( 0.0,      -offset.y)) * 0.125;
    color += tex2D(sceneTex, Input.Texcoord + float2( offset.x, -offset.y)) * 0.0625;
    color += tex2D(sceneTex, Input.Texcoord + float2(-offset.x,  0.0))      * 0.125;
    color += tex2D(sceneTex, Input.Texcoord + float2( 0.0,       0.0))      * 0.25;
    color += tex2D(sceneTex, Input.Texcoord + float2( offset.x,  0.0))      * 0.125;
    color += tex2D(sceneTex, Input.Texcoord + float2(-offset.x,  offset.y)) * 0.0625;
    color += tex2D(sceneTex, Input.Texcoord + float2( 0.0,       offset.y)) * 0.125;
    color += tex2D(sceneTex, Input.Texcoord + float2( offset.x,  offset.y)) * 0.0625;
    
    return color;
}

③ 물체의 윤곽선을 강조하는 셀 셰이딩을 구현한다

시선 방향과 표면 법선의 내적을 활용하여 외곽선 영역(두 벡터가 수직에 가까운 곳)을 검은색으로 처리합니다.

// hlsl
struct PS_INPUT {
    float3 Normal : TEXCOORD0;
    float3 ViewDirection : TEXCOORD1;
};

float4 ps_main(PS_INPUT Input) : COLOR0 {
    float3 normal = normalize(Input.Normal);
    float3 viewDir = normalize(Input.ViewDirection);
    
    // 시선과 법선의 일치 여부 계산 (정면은 1, 외곽은 0에 수렴)
    float edge = max(dot(normal, viewDir), 0.0);
    
    // 임계값보다 작으면 검은색 외곽선, 크면 일반 색상 처리
    float4 finalColor = float4(1.0, 0.5, 0.5, 1.0); // 물체 기본 색상
    if (edge < 0.3) {
        finalColor = float4(0.0, 0.0, 0.0, 1.0); // 윤곽선 색상
    }
    
    return finalColor;
}

④ 물 표면의 반사 효과를 시뮬레이션한다

빛 또는 시선 벡터를 표면 법선 기준으로 반사(reflect)시켜 큐브맵 환경 텍스처를 샘플링합니다.

// hlsl
samplerCUBE environmentMap; // 반사 환경이 담긴 큐브맵

struct PS_INPUT {
    float3 Normal : TEXCOORD0;
    float3 ViewDirection : TEXCOORD1;
};

float4 ps_main(PS_INPUT Input) : COLOR0 {
    float3 normal = normalize(Input.Normal);
    float3 viewDir = normalize(Input.ViewDirection);
    
    // 입사 벡터(시선의 반대)를 법선 기준으로 반사시킴
    float3 reflectDir = reflect(-viewDir, normal);
    
    // 반사된 방향으로 큐브맵을 샘플링하여 반사 광원 획득
    float4 reflectionColor = texCUBE(environmentMap, reflectDir);
    
    return reflectionColor;
}

정답: ② 노멀 맵을 사용하여 표면의 조명 강도를 계산한다.

문제 11. Vulkan은 DirectX 12와 함께 현대 게임 개발의 주요 API로 자리 잡았으며, 특히 고성능 게임 애플리케이션에서 많이 사용된다. Vulkan에 대한 아래 설명 중 틀린 것은?

① 저수준 API: 개발자에게 하드웨어에 대한 더 직접적인 제어 권한을 제공한다.

② 멀티스레딩 최적화: 현대 멀티코어 CPU를 효율적으로 활용할 수 있다.

③ 감소된 CPU 오버헤드: 물리 엔진 명령을 더 효율적으로 처리한다.

④ 크로스 플랫폼: 윈도우, 리눅스, 안드로이드, iOS 등 다양한 플랫폼을 지원한다.

개념: Vulkan, API

  • Vulkan: 크로스 플랫폼을 지원하는 고성능 저수준(Low-level) 그래픽스 및 컴퓨팅 API입니다.
  • 저수준 제어: CPU 오버헤드를 줄이고 하드웨어를 직접 제어하여 멀티스레딩 성능을 극대화합니다.

풀이:

  • ① 저수준 API: Vulkan은 드라이버 오버헤드를 줄이고 GPU를 직접 제어하도록 설계되었습니다. (옳음)
  • ② 멀티스레딩 최적화: 여러 스레드에서 동시에 커맨드 버퍼를 생성하여 CPU 코어를 효율적으로 씁니다. (옳음)
  • ③ 감소된 CPU 오버헤드: Vulkan은 그래픽스 파이프라인 및 렌더링 명령의 CPU 오버헤드를 줄입니다. 물리 엔진은 그래픽 API가 아닌 별도의 CPU 물리 라이브러리(PhysX, Havok 등)나 컴퓨팅 셰이더로 처리하므로 설명이 부적절합니다. (틀림)
  • ④ 크로스 플랫폼: 윈도우, 리눅스, 안드로이드 등을 공식 지원하며 MoltenVK를 통해 iOS/macOS도 지원합니다. (옳음)

정답: ③ 감소된 CPU 오버헤드: 물리 엔진 명령을 더 효율적으로 처리한다.

문제 12. 다음 코드는 2D 게임에서 타일맵을 구현하는 C 코드의 일부다. 코드를 분석하고, 보기 중 틀린 것을 고르시오.

#define MAP_WIDTH 64
#define MAP_HEIGHT 48
#define TILE_SIZE 32

typedef struct {
    int id;      // 타일 ID
    int solid;   // 충돌 여부 (0: 통과 가능, 1: 충돌)
    char* name;  // 타일 이름
} Tile;

typedef struct {
    Tile* tiles[MAP_WIDTH][MAP_HEIGHT]; // 타일맵 데이터
    int visible_tiles_x;                // 화면에 표시되는 타일 수 (가로)
    int visible_tiles_y;                // 화면에 표시되는 타일 수 (세로)
} TileMap;

// 타일맵 초기화 함수
void initTileMap(TileMap* map, int screen_width, int screen_height) {
    map->visible_tiles_x = screen_width / TILE_SIZE + 1;
    map->visible_tiles_y = screen_height / TILE_SIZE + 1;
    for (int x = 0; x < MAP_WIDTH; x++) {
        for (int y = 0; y < MAP_HEIGHT; y++) {
            map->tiles[x][y] = NULL;
        }
    }
}

// 타일맵 렌더링 함수
void renderTileMap(TileMap* map, int camera_x, int camera_y) {
    int start_x = camera_x / TILE_SIZE;
    int start_y = camera_y / TILE_SIZE;
    for (int x = start_x; x < start_x + map->visible_tiles_x; x++) {
        for (int y = start_y; y < start_y + map->visible_tiles_y; y++) {
            if (x >= 0 && x < MAP_WIDTH && y >= 0 && y < MAP_HEIGHT) {
                if (map->tiles[x][y] != NULL) {
                    int screen_x = (x * TILE_SIZE) - camera_x;
                    int screen_y = (y * TILE_SIZE) - camera_y;
                    renderTile(map->tiles[x][y]->id, screen_x, screen_y);
                }
            }
        }
    }
}

// 특정 위치의 타일이 충돌 가능한지 확인하는 함수
int isTileSolid(TileMap* map, int world_x, int world_y) {
    int tile_x = world_x / TILE_SIZE;
    int tile_y = world_y / TILE_SIZE;
    if (tile_x < 0 || tile_x >= MAP_WIDTH || tile_y < 0 || tile_y >= MAP_HEIGHT) {
        return 1; // 맵 외부는 충돌로 처리
    }
    if (map->tiles[tile_x][tile_y] == NULL) {
        return 0;
    }
    return map->tiles[tile_x][tile_y]->solid;
}

① initTileMap 함수는 화면에 표시되는 타일 수를 계산할 때 경계 타일을 고려하여 1을 더한다.

② renderTileMap 함수는 카메라의 위치를 기준으로 화면에 보이는 타일만 렌더링하여 성능을 최적화한다.

③ isTileSolid 함수에서 맵 외부 영역은 항상 충돌로 처리된다.

④ 타일맵 데이터 구조는 포인터 배열을 사용하기 때문에 메모리를 동적으로 할당하고 해제할 필요가 없다.

개념: 포인터 배열을 사용한 2D 타일맵 구조 및 메모리 관리

풀이:

  • ① initTileMap 함수는 화면에 표시되는 타일 수를 계산할 때 경계 타일을 고려하여 1을 더한다. (참)
    • map->visible_tiles_x = screen_width / TILE_SIZE + 1; 코드를 보면, 카메라가 타일 경계에 딱 맞춰 있지 않고 걸쳐 있을 경우를 대비해 +1을 하여 타일을 하나 더 계산합니다.
  • ② renderTileMap 함수는 카메라의 위치를 기준으로 화면에 보이는 타일만 렌더링하여 성능을 최적화한다. (참)
    • start_x, start_y를 기반으로 camera_x/y 주변의 타일만 렌더링 루프를 돌기 때문에 전체 맵(64 x 48)을 다 그리는 것보다 효율적입니다.
  • ③ isTileSolid 함수에서 맵 외부 영역은 항상 충돌로 처리된다. (참)
    • if (tile_x < 0 || tile_x >= MAP_WIDTH || tile_y < 0 || tile_y >= MAP_HEIGHT) 조건에 걸리면 1(충돌)을 반환합니다.
  • ④ 타일맵 데이터 구조는 포인터 배열을 사용하기 때문에 메모리를 동적으로 할당하고 해제할 필요가 없다. (거짓)
    • Tile* tiles[MAP_WIDTH][MAP_HEIGHT];는 타일 포인터들의 배열입니다. 즉, 실제 타일 데이터(Tile 구조체)는 메모리의 다른 곳(힙)에 malloc 등으로 할당하고 그 주소를 배열에 저장해야 합니다. 만약 동적 할당(malloc)을 사용했다면 프로그램 종료 전 반드시 free로 해제해야 메모리 누수(Memory Leak)가 발생하지 않습니다.

정답: ④ 타일맵 데이터 구조는 포인터 배열을 사용하기 때문에 메모리를 동적으로 할당하고 해제할 필요가 없다.

문제 13. 다음 중 3D 게임 물리 엔진의 성능 최적화 기법으로 적절하지 않은 것은?

① 시간 단계(Time Step)를 가변적으로 조정하여 빠른 움직임에서도 안정적인 시뮬레이션을 구현한다.

② 섬 분할(Island Partitioning)을 통해 서로 영향을 주지 않는 물체 그룹을 독립적으로 처리한다.

③ 휴면(Sleeping) 상태 감지를 통해 정적인 물체의 시뮬레이션을 일시 중단한다.

④ 모든 충돌 쌍에 대해 항상 정밀 충돌 검사(Narrow Phase)를 수행하여 정확도를 높인다.

개념: 3D 게임 물리 엔진의 성능 최적화 (Collision Detection Optimization)

물리 엔진의 충돌 검사는 일반적으로 3단계로 이루어집니다.

    1. Broad Phase (넓은 단계): 부피가 큰 경계 상자(AABB, Bounding Sphere)를 사용하여 충돌 가능성이 있는 쌍만 걸러냄.
    1. Narrow Phase (좁은 단계): 실제 형상(메시 등)을 기반으로 정밀한 충돌과 접촉점 계산.
    1. Response (반응): 충돌 결과에 따른 물리 행동 처리.

최적화 기법: Broad Phase를 효율적으로 처리하고, Narrow Phase의 횟수를 줄이는 것.

풀이:

  • ① 시간 단계(Time Step)를 가변적으로 조정: 일반적으로 물리 엔진은 안정성을 위해 고정된 시간 단계(Fixed Timestep)를 사용하지만, 매우 빠른 움직임이나 성능에 따라 시간 단계를 조절하여 안정성을 보강하는 것은 일반적인 최적화 기술의 일부로 볼 수 있습니다(다만 안정성 측면에서는 Fixed가 더 우세).
  • ② 섬 분할(Island Partitioning): 서로 충돌하거나 연결된 물체들을 하나의 그룹(섬)으로 묶고, 상호작용이 없는 그룹끼리는 독립적으로 병렬 처리하여 성능을 대폭 향상시키는 대표적인 최적화 기법입니다.
  • ③ 휴면(Sleeping) 상태 감지: 움직임이 멈춘 정적인 물체는 물리 계산(중력, 충돌 등)을 잠시 중단하여 CPU 자원을 절약하는 필수적인 최적화 기법입니다.
  • ④ 모든 충돌 쌍에 대해 항상 정밀 충돌 검사(Narrow Phase) 수행: 3D 게임에서 모든 물체 쌍(Pair)에 대해 정밀한 픽셀/메시 단위의 충돌 검사를 수행하면 계산량이 폭증하여 성능이 극도로 저하됩니다. 따라서 **[넓은 단계(Broad Phase, AABB/Sweep and Prune)]**에서 1차적으로 가능성 있는 쌍만 걸러낸 후, 좁은 단계(Narrow Phase)에서 정밀 검사를 해야 합니다. 항상 정밀 검사를 수행하는 것은 최적화가 아니라 반대입니다.

정답: ④ 모든 충돌 쌍에 대해 항상 정밀 충돌 검사(Narrow Phase)를 수행하여 정확도를 높인다.

문제 14. 3D 게임에서 스켈레탈 애니메이션 시스템에 관한 설명으로 옳지 않은 것은?

① 스켈레탈 애니메이션에서 '스키닝(Skinning)'은 뼈대의 움직임에 따라 메시의 버텍스들이 어떻게 변형될지 결정하는 과정이다.

② 애니메이션 블렌딩(Animation Blending)은 여러 애니메이션 간의 부드러운 전환을 위해 보간(interpolation)을 사용하며, 걷기에서 달리기로 자연스럽게 전환할 때 활용된다.

③ 역운동학(Inverse Kinematics, IK)은 최종 관절의 위치가 주어졌을 때 중간 관절들의 위치를 계산하는 기법으로, 캐릭터가 물체를 잡거나 발을 지형에 정확히 배치할 때 유용하다.

④ 스켈레탈 애니메이션에서 각 버텍스는 반드시 하나의 뼈에만 영향을 받아야 정확한 변형이 가능하다.

개념: 스켈레탈 애니메이션에서 '스키닝(Skinning)', 애니메이션 블렌딩(Animation Blending), 보간(interpolation), 역운동학(Inverse Kinematics, IK)

  • 스켈레탈 애니메이션 (Skeletal Animation): 캐릭터의 내부 뼈대(Bone/Joint) 구조를 만들고, 이 뼈대를 움직여 겉 표면인 메시(Mesh)를 변형시키는 3D 그래픽스 기법입니다.
  • 스키닝 (Skinning): 뼈의 움직임에 따라 메시의 정점(Vertex)들이 움직이도록 가중치(Weight)를 부여하여 표면을 변형하는 과정입니다.
  • 블렌딩 (Blending): 두 개 이상의 애니메이션을 보간(Interpolation)하여 부드럽게 섞어주는 기술입니다.
  • 역운동학 (IK): 말단 장치(예: 손, 발)의 목표 위치를 정하면 상위 부모 관절들의 각도를 역산하는 방식입니다.

풀이:

  • ① 옳음: 스키닝은 뼈대 움직임에 맞춰 정점들을 변형하는 프로세스의 정확한 정의입니다.
  • ② 옳음: 블렌딩은 선형 또는 구면 선형 보간을 사용하여 걷기, 뛰기 등의 모션을 부드럽게 이어줍니다.
  • ③ 옳음: IK는 목적지 좌표를 기준으로 역으로 관절 위치를 계산하므로 발을 땅에 디딜 때 필수적입니다.
  • ④ 틀림: 하나의 정점이 여러 개의 뼈로부터 영향을 받도록 설정(다중 가중치, Multi-weight)해야 관절이 접힐 때 부자연스러운 찢어짐이나 구겨짐 없이 부드러운 변형이 일어납니다. 보통 정점당 4개 내외의 뼈 가중치를 결합하여 사용합니다.

정답: ④ 스켈레탈 애니메이션에서 각 버텍스는 반드시 하나의 뼈에만 영향을 받아야 정확한 변형이 가능하다.

문제 15. 다음 중 LOD 전환(LOD Transition)에서 발생하는 '팝핑(Popping)' 현상을 줄이기 위한 기법이 아닌 것은?

① 지오메트리 모핑(Geometry Morphing)을 사용하여 두 LOD 레벨 사이를 점진적으로 변환.

② 카메라 거리에 관계없이 항상 최고 LOD를 유지하여 전환 자체를 방지.

③ 알파 페이딩(Alpha Fading)을 통해 LOD 전환 시 투명도를 조절.

④ 디더링(Dithering) 패턴을 사용하여 LOD 전환을 마스킹.

개념: LOD Transition, 팝핑(Popping), 지오메트리 모핑(Geometry Morphing), 알파 페이딩(Alpha Fading), 디더링(Dithering) 패턴

  • LOD 전환(Level of Detail Transition)에서 발생하는 '팝핑(Popping)' 현상은 카메라와 객체 사이의 거리에 따라 메쉬의 세부 수준(LOD 레벨)이 갑작스럽게 바뀔 때, 이전 단계와 현재 단계의 폴리곤 차이가 너무 커서 튀어 보이는 시각적 오류입니다. 팝핑을 줄이기 위해 부드러운 전환 기법을 사용합니다.

풀이:

  • ① 지오메트리 모핑(Geometry Morphing): 두 LOD 레벨 사이의 정점 위치를 보간하여 서서히 변환함으로써 팝핑을 줄입니다.
  • ② 카메라 거리에 관계없이 항상 최고 LOD를 유지: 이는 최적화 기법이 아니며, 오히려 렌더링 성능을 저하시키는 원인이 됩니다. LOD는 성능 향상을 위해 팝핑을 감수하고서라도 거리에 따라 세부 단계를 낮추는 기법이므로, 이 방법은 팝핑을 '줄이는' 기술적 기법이 아닌, '사용하지 않는' 방식입니다.
  • ③ 알파 페이딩(Alpha Fading): 투명도를 서서히 조절(Crossfading)하여 두 LOD 사이를 부드럽게 교체합니다.
  • ④ 디더링(Dithering): 픽셀 단위로 투명도를 조절하는 패턴을 사용하여 LOD 간 전환을 부드럽게 마스킹합니다.

개인적 의문:

? 그런데 문제에서 최적화를 물어본게 아니라 팝핑 현상을 줄이기 위한 기법이라고 했는데 그러면 2번도 해당되는거 아닌가?

직관적으로 보면 **"항상 최고 LOD를 유지하면 팝핑 자체가 안 일어나니 팝핑을 줄이는(없애는) 방법이 맞지 않나?"**라고 생각하실 수 있습니다. 충분히 타당한 의문입니다.

하지만 출제 의도와 컴퓨터 그래픽스 공학적 관점에서 ②번이 답이 될 수 없는 이유는 다음과 같습니다.

1. 기술적 기법(Technique)이 아닌 '비활성화'

  • LOD(Level of Detail) 기술은 "카메라 거리에 따라 그래픽 품질을 조절하겠다"는 전제하에 성립하는 기술입니다.
  • 문제에서 요구한 '기법(Technique)'은 LOD 시스템이 동작하는 과정에서 발생하는 부작용(팝핑)을 완화하는 알고리즘을 의미합니다.
  • 항상 최고 LOD만 켜두는 것은 LOD 시스템 자체를 꺼버리는(Disable) 행위이므로, LOD 전환(Transition) 과정에서 발생하는 문제를 해결하는 '전환 기법'으로 분류되지 않습니다.

2. 문제 배경의 모순 (상호 배제)

  • LOD를 쓰는 이유: 성능 최적화를 위해서 폴리곤을 줄여야 함.
  • 팝핑이 생기는 이유: 폴리곤을 줄이다 보니 형태가 갑자기 변함.
  • ②번의 해결책: 폴리곤을 안 줄임.
  • 결과적으로 ②번은 **"LOD 전환을 하되, 팝핑을 줄이는 방법"**이라는 문제의 대전제(LOD 전환 상황)를 벗어난 행동입니다. 엔진을 구동하지 않으면 엔진 고장이 안 난다는 식의 논리 오류에 해당합니다.

요약

①, ③, ④번은 컴퓨터 그래픽스에서 실제로 구현하는 **'LOD 전환 스무딩 알고리즘(Smoothing Algorithms)'**이지만, ②번은 기술적 해결책이 아닌 시스템의 거부(LOD 미사용)에 해당하므로 정답이 됩니다.

정답: ② 카메라 거리에 관계없이 항상 최고 LOD를 유지하여 전환 자체를 방지.

문제 16. VR 애플리케이션에서 '모션 시크니스(Motion Sickness)'를 줄이기 위한 프로그래밍 기법으로 가장 적절하지 않은 것은?

① 시야각(FOV)을 좁게 설정하여 더 많은 콘텐츠를 한 번에 보여준다.

② 프레임 레이트를 90fps 이상으로 유지하여 지연 시간을 최소화한다.

③ 사용자의 물리적 움직임과 가상 움직임 간의 불일치를 최소화한다.

④ 텔레포트 방식의 이동 시스템을 구현하여 연속적인 가속도를 피한다.

개념: VR 모션 시크니스 (Motion Sickness) , 시야각(FOV), 프레임 레이트

VR 모션 시크니스(멀미)는 시각 정보(가상 환경의 움직임)와 신체 감각(실제 정지 상태) 간의 불일치로 인해 발생합니다. 이를 줄이기 위해 시각적 흐름을 제어하고, 지연 시간을 최소화하며, 자연스러운 감각 인지를 유도하는 프로그래밍 기법을 사용합니다.

풀이:

  • ①번 (틀림): 모션 시크니스를 줄이기 위해 시야각(FOV)을 좁히는 것(Vignette/Tunneling 기법)은 맞지만, 이는 주변 시야를 가려 뇌가 인식하는 움직임을 줄이기 위함이지 '더 많은 콘텐츠를 한 번에 보여주기 위해서'가 아닙니다. 시야각을 넓히면 오히려 주변 시야의 움직임이 많아져 멀미가 심해집니다.
  • ②번 (맞음): 프레임 레이트가 낮으면 움직임에 지연(Latency)이 발생하여 멀미를 유발합니다. 90fps 이상 유지하는 것은 필수적인 최적화 기술입니다.
  • ③번 (맞음): 실제 물리적 위치와 가상 위치가 불일치하면 멀미가 발생하므로, 사용자의 시점과 가상 세계의 시점을 일치시켜야 합니다.
  • ④번 (맞음): 연속적인 이동(이동 중 가속)은 시각적 불일치를 크게 만듭니다. 텔레포트(순간 이동)는 가속도를 제거하여 멀미를 줄이는 대표적인 기법입니다.

정답: ① 시야각(FOV)을 좁게 설정하여 더 많은 콘텐츠를 한 번에 보여준다.

문제 17. 1인칭 슈팅 게임(FPS)에서 부드러운 카메라 움직임을 위한 코드 구현에 관한 설명으로 옳지 않은 것은?

① 마우스 입력으로 카메라 회전을 구현할 때, 피치(상하 회전)에는 일반적으로 Y축 각도 제한(clamping)이 필요하며, 이는 캐릭터가 머리를 비현실적으로 회전하는 것을 방지한다.

② 총기 반동(recoil) 효과를 카메라에 적용할 때, 단순히 시야각(FOV)을 일시적으로 줄이는 것보다 카메라 위치에 perlin noise와 같은 절차적 노이즈를 적용하는 것이 더 현실적인 효과를 제공한다.

③ 1인칭 카메라와 3인칭 모델을 함께 사용하는 경우, 카메라 위치는 항상 캐릭터의 실제 머리 위치와 정확히 일치해야 하며, 어떠한 오프셋도 적용하면 안 된다.

④ 플레이어가 달리기를 할 때 적용하는 카메라 흔들림(head bobbing)은 sin 또는 cos 함수를 사용하여 구현하며, 걷기와 달리기 상태에 따라 진폭과 주기를 조절한다.

개념:

  • FPS 카메라 시스템: 플레이어의 시점을 동적으로 제어하여 몰입감과 현실감을 제공하는 핵심 시스템입니다.
  • 각도 제한 (Clamping): 카메라가 수직으로 360도 회전하여 화면이 뒤집히는 루핑 현상을 막는 필수 제어 기법입니다.
  • 절차적 애니메이션: 수학적 공식(사인파, 노이즈)을 활용해 물리적 진동, 반동, 걸음걸이를 연출합니다.
  • 보이지 않는 메시 (Mesh): 1인칭 화면에서 어색한 뚫림 현상을 막기 위해 카메라용 독립 메시나 위치 오프셋을 사용합니다.

풀이:

  • ①번 분석: 맞는 설명입니다. 마우스 상하 회전(Pitch)은 보통 위아래 80~90도 사이로 제한해야 목이 꺾이는 그래픽 오류를 막을 수 있습니다.
  • ②번 분석: 맞는 설명입니다. 단순 FOV 변경은 줌 효과에 가깝습니다. Perlin Noise나 스프링 물리 모델을 카메라 위치·회전에 적용해야 거친 총기 반동이 표현됩니다.
  • ③번 분석 (오답): 틀린 설명입니다. 1인칭 카메라를 실제 3인칭 모델의 머리 뼈(Bone) 위치에 정확히 일치시키면, 걷기 애니메이션으로 인해 시야가 심하게 흔들려 멀미를 유발합니다. 또한 무기를 조준할 때 시야를 가리는 문제가 발생하므로, 일반적으로 약간의 앞·위 오프셋(Offset)을 적용하거나 1인칭 전용 렌더링 레이어를 따로 분리하여 구현합니다.
  • ④번 분석: 맞는 설명입니다. 헤드 보빙(Head Bobbing)은 삼각함수 (sin, cos)의 주기적 성질을 이용해 위아래, 좌우 흔들림을 구현하며 상태에 따라 속도(주기)와 크기(진폭)를 바꿉니다.

정답: ③ 1인칭 카메라와 3인칭 모델을 함께 사용하는 경우, 카메라 위치는 항상 캐릭터의 실제 머리 위치와 정확히 일치해야 하며, 어떠한 오프셋도 적용하면 안 된다.

 

문제 18. 보기 중 다음 그림에 대한 설명으로 알맞은 것은?

① 보기의 그림은 포털 컬링(Portal Culling)을 나타낸다. 이 기법은 주로 실내 환경에서 문이나 창문과 같은 '포털'을 통해 보이는 영역만 렌더링하여 성능을 최적화한다.

② 보기의 그림은 오클루전 컬링(Occlusion Culling)을 나타낸다. 이 기법은 다른 객체에 가려져 보이지 않는 객체를 식별하여 렌더링하지 않는 방식으로, 하드웨어 오클루전 쿼리나 소프트웨어 기반 가시성 결정 알고리즘을 사용한다.

③ 보기의 그림은 옥트리(Octree) 공간 분할을 나타낸다. 이 기법은 시야 절두체 밖에 완전히 위치한 객체나 노드를 렌더링에서 제외하며, 계층적 공간 분할을 통해 효율적으로 가시성을 결정한다.

④ 보기의 그림은 백페이스 컬링(Backface Culling)을 나타낸다. 이 기법은 카메라를 향하지 않는 폴리곤의 뒷면을 렌더링하지 않는 방식으로, 법선 벡터와 시선 벡터의 내적을 사용하여 결정한다.

개념: 옥트리(Octree), 공간 분할(Spatial Partitioning), 절두체 컬링(Frustum Culling)

  • 옥트리(Octree): 3차원 공간을 8개의 하위 노드로 반복 분할하는 트리 구조입니다.
  • 공간 분할(Spatial Partitioning): 대규모 게임 월드에서 특정 영역에 있는 객체들을 빠르게 탐색하기 위해 공간을 구조화하는 기법입니다.
  • 절두체 컬링(Frustum Culling): 카메라 시야 범위를 벗어난 객체들을 렌더링 파이프라인에서 제외하여 성능을 높입니다.

풀이:

  • 그림 분석: 왼쪽의 입체 도형이 한 번 분할될 때마다 가로, 세로, 높이가 각각 2등분되어 총 8개 (2x2x2) 의 작은 정육면체로 쪼개지는 것을 볼 수 있습니다. 오른쪽의 트리 구조 역시 하나의 루트 노드에서 8개의 자식 노드로 뻗어나가고 있습니다. 이는 대표적인 옥트리(Octree) 구조를 시각화한 것입니다.
  • ①번 분석: 포털 컬링은 실내 맵을 문이나 창문 단위(Portal)로 나누어 계산하는 기법이므로 그림과 관련이 없습니다.
  • ②번 분석: 오클루전 컬링은 앞의 물체에 가려진 뒤의 물체를 그리지 않는 기술로, 공간을 정육면체로 8등분하는 이 그림의 핵심 원리와 거리가 있습니다.
  • ③번 분석 (정답): 그림은 옥트리(Octree) 공간 분할 기법입니다. 게임 엔진에서 이 구조를 활용하면 카메라 절두체(시야 범위) 밖에 있는 노드들을 통째로 걸러낼 수 있어 대규모 씬의 가시성 판단(Culling) 속도가 비약적으로 향상됩니다.
  • ④번 분석: 백페이스 컬링은 카메라를 등진 폴리곤(뒷면)을 삼각형 단위로 연산하여 제외하는 기법이므로 공간 분할 구조인 본 그림과는 무관합니다.

정답: ③ 보기의 그림은 옥트리(Octree) 공간 분할을 나타낸다. 이 기법은 시야 절두체 밖에 완전히 위치한 객체나 노드를 렌더링에서 제외하며, 계층적 공간 분할을 통해 효율적으로 가시성을 결정한다.

문제 19. 절차적(Procedure) 지형 생성은 대규모 오픈 월드 게임에서 개발 시간을 단축하고 메모리 사용을 최적화하면서 다양한 환경을 효율적으로 제작할 수 있게 해주는 핵심 기술입니다. 3D 게임 개발에서 프로시저럴 지형 생성 알고리즘을 구현할 때, 다음 설명 중 프로그래밍 관점에서 옳지 않은 것은?

① 펄린 노이즈(Perlin Noise) 알고리즘을 구현할 때는 여러 옥타브(octave)의 노이즈를 중첩하는 방식으로 코딩하며, 각 옥타브마다 진폭(amplitude)은 감소시키고 주파수(frequency)는 증가시키는 방식으로 자연스러운 지형의 세부 정보를 생성한다. 보통 GPU 셰이더에서 구현하면 실시간 생성 성능이 크게 향상된다.

② 보로노이 다이어그램(Voronoi Diagram) 기반 지형 생성을 구현할 때는 먼저 무작위 시드 포인트를 생성하고, 각 격자점에서 가장 가까운 시드 포인트까지의 거리를 계산하는 방식으로 구현한다. 이를 활용하여 셀 기반의 크레이터, 바위 지형, 강 경계선 등을 효율적으로 생성할 수 있으며, 거리 함수를 변형하여 다양한 패턴을 만들 수 있다.

③ 하이트맵(Heightmap) 기반 지형 엔진에서 오버행(overhang)이나 동굴을 구현하려면, 각 (x,z) 좌표에 하나의 y값만 매핑하는 2D 배열 방식을 사용하고, 메시 생성 단계에서 특수한 텍스처 매핑과 노멀 맵을 활용하여 시각적으로 입체감을 구현하는 것이 메모리 효율성과 렌더링 성능 측면에서 가장 효과적이다.

④ L-시스템(L-System) 기반 지형 특성을 구현할 때는 문자열 치환 규칙과 재귀적 함수 호출을 조합한 알고리즘으로 코딩하며, 강 네트워크 생성 시에는 주 줄기에서 시작하여 분기 각도, 길이, 너비 등의 파라미터를 조절하여 자연스러운 수계 네트워크를 형성할 수 있다. 이때 지형의 경사를 고려한 경로 탐색 알고리즘을 함께 사용하면 더 현실적인 결과를 얻을 수 있다.

개념: 절차적(Procedural) 콘텐츠 생성(PCN) 알고리즘 (지형, 자연 요소 생성), 복셀(Voxel) 데이터 구조 3D 노이즈(Marching Cubes 알고리즘), 하이트맵(Heightmap), 오버행(overhang)

풀이

  • ①번 설명 (참): 펄린 노이즈는 주파수(Frequency)를 높이고 진폭(Amplitude)을 낮추는 옥타브 합성을 통해 자연스러운 지형(Fractal Brownian Motion)을 생성합니다. GPU(쉐이더) 활용은 실시간 생성의 핵심입니다.
  • ②번 설명 (참): 보로노이 다이어그램은 시드 포인트를 기반으로 거리 함수(Distance Function)를 계산하여 셀 구조를 만듭니다. 크레이터나 암석 지형 표현에 적합합니다.
  • ③번 설명 (거짓): 하이트맵(Heightmap) 방식은 2D 배열(x, z에 따른 y값)을 사용하므로, 1개의 좌표에 2개 이상의 y값을 가지는 오버행(절벽)이나 동굴을 구조적으로 표현할 수 없습니다. 이를 해결하기 위해서는 복셀(Voxel) 데이터 구조나 3D 노이즈(Marching Cubes 알고리즘 등)를 사용해야 합니다. 2D 하이트맵에서 텍스처로 입체감을 흉내 낼 수는 있으나, 구조적인 오버행을 구현하는 '가장 효과적인 방식'은 아닙니다.
  • ④번 설명 (참): L-시스템은 재귀적인 문자열 치환을 통해 식물, 강(River) 네트워크 같은 분기 구조를 생성하는 데 적합한 알고리즘입니다.

1. 하이트맵(Heightmap)의 데이터 한계

  • 구조적 정의: 하이트맵은 x, z 평면 좌표를 배열의 인덱스로 사용하고, 해당 위치의 높이(y)를 데이터 값으로 가지는 2D 데이터 구조입니다.
  • 일대일 매핑의 문제: 이 방식은 하나의 (x, z) 좌표에 단 하나의 y**값(높이)**만 저장할 수 있습니다.

2. 동굴과 오버행(Overhang)의 수학적 특징

  • 수직 중첩: 동굴이나 튀어나온 절벽(오버행)은 동일한 (x, z) 위치에 천장과 바닥, 즉 최소 2개 이상의 y값이 존재해야 합니다.
  • 표현 불가능: 2D 하이트맵 배열 구조로는 이 물리적 공간 구조를 저장할 방법이 원천적으로 불가능합니다.

3. 텍스처와 노멀 맵의 한계

  • 시각적 착시일 뿐: 3번 선지에서는 '특수한 텍스처와 노멀 맵으로 시각적 입체감을 구현한다'고 했으나, 이는 표면의 굴곡이나 그림자를 흉내 내는 착시 효과일 뿐입니다.
  • 실제 메쉬의 부재: 캐릭터가 그 안으로 걸어 들어갈 수 있는 실제 '동굴 구멍'이나 '터널'의 메쉬 구조 자체를 뚫거나 생성할 수는 없습니다.**4. 올바른 구현 방법 (대안 기술)**실제 개발에서 오버행이나 동굴을 프로시저럴하게 생성하려면 하이트맵 대신 다음 기술을 사용해야 합니다.
  • 복셀(Voxel) 데이터: 3D 공간을 격자(Grid)로 나누어 밀도 정보를 저장하는 3D 배열 방식을 사용합니다. (예: 마인크래프트)
  • 마칭 큐브(Marching Cubes): 3D 복셀 데이터나 3D 펄린 노이즈로부터 실제 동굴 형태의 3D 폴리곤 메쉬를 추출해내는 알고리즘입니다.

정답: ③ 하이트맵(Heightmap) 기반 지형 엔진에서 오버행(overhang)이나 동굴을 구현하려면, 각 (x,z) 좌표에 하나의 y값만 매핑하는 2D 배열 방식을 사용하고, 메시 생성 단계에서 특수한 텍스처 매핑과 노멀 맵을 활용하여 시각적으로 입체감을 구현하는 것이 메모리 효율성과 렌더링 성능 측면에서 가장 효과적이다.

문제 20. 3D 게임에서 플레이어가 적 캐릭터를 향해 발사체를 발사하려고 합니다. 플레이어의 위치 벡터는 P(3, 2, 5)이고, 적 캐릭터의 위치 벡터는 E(7, 4, 8)입니다. 플레이어에서 적을 향하는 발사 방향 벡터를 계산하고 정규화하는 올바른 과정은? 단, D는 방향벡터, |D|는 벡터길이, D/|D|는 정규화벡터

① D = P - E = (3, 2, 5) - (7, 4, 8) = (-4, -2, -3)

|D| = √((-4)² + (-2)² + (-3)²) = √(16 + 4 + 9) = √29

D/|D| = (-4,-2,-3)/√29 ≈ (-0.74,-0.37,-0.56)

② D = E - P = (7, 4, 8) - (3, 2, 5) = (4, 2, 3)

|D| = √(4² + 2² + 3²) = √(16 + 4 + 9) = √29

D/|D| = (4, 2, 3) / √29 ≈ (0.74, 0.37, 0.56)

③ D = P×E = (3, 2, 5)×(7, 4, 8) = (2×8 - 5×4, 5×7 - 3×8, 3×4 - 2×7) = (-4, 11, -2)

|D| = √((-4)² + 11² + (-2)²) = √(16 + 121 + 4) = √141

D/|D| = (-4, 11, -2) / √141 ≈ (-0.34, 0.93, -0.17)

④ D = P·E = (3×7 + 2×4 + 5×8) = 21 + 8 + 40 = 69

D/|D| = 69 / 69 = 1

개념: 백터, 방향 벡터,

  • 3D 게임에서 한 위치(출발점)에서 다른 위치(목표점)를 향하는 방향 벡터를 구하기 위해서는 [목표 위치 - 출발 위치] 공식을 사용합니다. 이후 정규화(Normalization)를 통해 크기를 1로 만들어 방향 정보만 남깁니다.

풀이:

방향 벡터(D) 계산: 적(E)을 향해 플레이어(P)에서 발사하므로, D = E - P 입니다.

  • 방향벡터를 구할 때 **'목표 지점(끝점) - 출발 지점(시작점)'**으로 계산
  • D = (7, 4, 8) - (3, 2, 5) = (7-3, 4-2, 8-5) = (4, 2, 3)

벡터의 길이(|D|) 계산:

  • | D | = sqrt(4^2 + 2^2 +3^2) = sqrt(16+4+9 = sqrt(29)

정규화 D/|D|:

  • D/|D| = (4,2,3,) / sqrt(29) ≈ (0.74, 0.37, 0.56)

정답:

② D = E - P = (7, 4, 8) - (3, 2, 5) = (4, 2, 3)

|D| = √(4² + 2² + 3²) = √(16 + 4 + 9) = √29

D/|D| = (4, 2, 3) / √29 ≈ (0.74, 0.37, 0.56)

 

문제 21. 다음 그림과 같이 원본 이미지를 흐릿하게 후처리하는 기술을 무엇이라 하는가?

① Embossing

② Edge Detection

③ Blur

④ Distortion

개념: 후처리(Post-processing)

1. 엠보싱 (Embossing)

  • 정의: 이미지의 밝기 차이(경계)를 입체적으로 표현하여 올록볼록한 금속판이나 종이 질감을 내는 기술입니다.
  • 원리: 3x3 형태의 엠보싱 마스크(커널)를 사용하여 픽셀값의 변화가 큰 경계 부분에 명암을 주어 밝거나 어둡게 만듭니다. 대각선 방향으로 밝기 차이가 적은 부분은 0에 가깝게 처리하여 배경을 회색조로 만듭니다.
  • 활용: 사진을 입체적인 텍스처로 변환, 예술적 효과 적용.

2. 엣지 검출 (Edge Detection)

  • 정의: 이미지에서 밝기나 색상이 급격하게 변하는 경계선(Edge)을 찾는 기술입니다. 주로 객체 인식의 전처리 과정으로 사용됩니다.
  • 원리: 픽셀 밝기 변화율이 높은 부분을 찾기 위해 미분(derivative)과 기울기(gradient) 연산을 수행합니다.
    • Sobel 필터: 가로·세로 방향 미분을 근사하여 경계를 검출, 계산이 빠르지만 노이즈에 민감함.
    • Canny Edge Detection: 노이즈 제거(Gaussian blur), 기울기 계산, 비최대 억제(NMS), 히스테리시스 임계값 등을 통해 가장 정확한 경계를 찾아내는 알고리즘입니다.
  • 활용: 객체 검출, 특징 추출, 컴퓨터 비전.
  1. 블러 (Blur)
  • 정의: 이미지의 노이즈를 줄이거나 세부 사항을 흐리게 하여 부드러운 영상을 만드는 기술입니다.
  • 원리: 주변 픽셀들의 평균값이나 가중치 평균을 사용하여 픽셀 값을 부드럽게 합니다.
    • Gaussian Blur: 가우시안 분포를 이용해 중심 픽셀에 높은 가중치를 주어 자연스럽게 흐림 효과를 냅니다.
  • 활용: 노이즈 제거(전처리), 초점 흐림 효과(Depth of Field), 배경 흐림 처리.

4**. 왜곡 (Distortion)**

  • 정의: 이미지의 픽셀 위치를 강제로 이동시켜 영상의 형태를 변형시키는 기술입니다.
  • 원리: 렌즈 왜곡(핀쿠션, 배럴)이나 3D 매핑(노멀 매핑)처럼 공간적인 픽셀 좌표를 계산하여 재배치합니다.
  • 활용: 어안 렌즈 효과, 3D 모델링에서 표면 디테일 추가, 예술적인 변형.

정답: ③ Blur

문제 22. 그림 A처럼 렌더링된 화면을 그림 B처럼 후처리하여 집중감을 향상시키고자 한다. 이러한 기법을 무엇이라 하는가? 그림 C는 처리하는 방법을 나타낸 것으로 먼저 픽셀 위치에서 블러 시작점 방향으로 샘플링하고, 시작점과 픽셀의 거리에 따라 Blur 가중치를 계산한다.(멀수록 더 Blur시킨다)

① Euler Blur

② Radial Blur

③ Water Blur

④ Fluid Blur

개념:

Radial Blur (방사형 블러): 특정 지점(블러 시작점)을 중심으로 바깥쪽으로 퍼지거나, 화면 중앙으로 수렴하는 듯한 효과를 주는 후처리 기법입니다. 주로 레이싱 게임의 속도감, 폭발 효과, 혹은 시선 집중을 위해 사용됩니다.

문제의 묘사: "픽셀 위치에서 블러 시작점 방향으로 샘플링", "시작점과 픽셀의 거리에 따라 가중치 계산", "멀수록 더 블러"라는 방식은 전형적인 Radial Blur의 구현 방식(특히 Zoom Radial Blur)입니다.

풀이:

  • ① Euler Blur: 그런 후처리 기법은 존재하지 않습니다. (오일러 방정식 관련 용어 혼동 가능성)
  • ③ Water Blur: 포토샵 등의 수채화(Water) 효과는 있으나, 위 묘사와는 다릅니다.
  • ④ Fluid Blur: 유체 시뮬레이션 관련 흐림 효과일 수 있으나, 위 묘사는 방사형/줌 블러입니다.

정답: ② Radial Blur

문제 23. 다음 렌더링 파이프라인에서의 버퍼 중에서 화면에 출력할 픽셀들의 색상값을 저장하는 용도의 버퍼에 해당하는 것은?

① 인덱스 버퍼

② 프레임 버퍼

③ 스텐실 버퍼

④ 깊이 버퍼

개념: 버퍼

렌더링 파이프라인의 최종 단계(출력 병합 단계, Output Merger)에서 계산된 픽셀의 최종 색상(RGB)과 투명도(Alpha) 값을 저장하는 메모리 공간입니다. 이 버퍼에 저장된 데이터가 모니터로 전송되어 화면에 2D 이미지가 그려집니다.

풀이:

  • ① 인덱스 버퍼 (Index Buffer): 기하학 단계에서 정점 버퍼(Vertex Buffer)의 정점들을 어떤 순서로 연결하여 삼각형을 그릴지 인덱스 정보를 저장하는 버퍼입니다.
  • ② 프레임 버퍼 (Frame Buffer): 화면(픽셀)의 최종 색상값을 저장합니다. 흔히 컬러 버퍼(Color Buffer)라고도 부릅니다.
  • ③ 스텐실 버퍼 (Stencil Buffer): 렌더링된 픽셀 중 특정 영역만 그리거나 마스킹(Masking)할 때 사용되는 버퍼입니다.
  • ④ 깊이 버퍼 (Depth Buffer/Z-Buffer): 화면 상의 같은 x, y 위치에 여러 오브젝트가 겹칠 때, 카메라와 더 가까운 픽셀(작은 z값)을 판별하기 위해 깊이(거리) 정보를 저장하는 버퍼입니다.

따라서, 화면에 출력할 픽셀의 색상값을 저장하는 것은 프레임 버퍼

정답: ② 프레임 버퍼

문제 24. 다음과 같이 n값이 증가할수록 표현범위가 좁아지는 조명을 무엇이라 하는가? 관련 수식은 다음과 같다. I = (R · V)ⁿ

① Ambient

② Diffuse

③ Specular

④ Emissive

개념: 조명

Specular(반사광/경면광) 조명은 물체 표면에서 빛이 거울처럼 반사되어 밝게 빛나는 하이라이트(Highlight) 부분을 표현하는 조명 모델입니다.

풀이:

  1. 수식 분석: I = (R · V)ⁿ 은 퐁 반사 모델(Phong Reflection Model)의 Specular 성분을 나타내는 일반적인 수식입니다.
  • R: 반사 벡터 (Reflection vector)
  • V: 뷰 벡터 (View vector, 시점 방향)
  • n: 표면의 매끄러움(Shininess)을 나타내는 광택 계수
  1. n값의 영향: n은 하이라이트의 크기를 조절하는 지수입니다. n값이 커질수록 (R · V) 값이 1(최대값)에 가까운, 즉 R과 V가 거의 일치하는 좁은 영역에서만 높은 조도값을 가지게 됩니다.
  2. 결과: n이 클수록 하이라이트가 좁고 선명해져 표면이 더 '매끄럽고 빛나는(Glossy)' 것처럼 보이며, 작을수록 하이라이트가 넓고 희미해져 '거친(Rough)' 느낌을 줍니다. 따라서 n값이 증가할수록 표현 범위(하이라이트 영역)가 좁아지는 조명은 Specular입니다.

Ambient (환경광 / 주변광)

  • 개념: 사방에서 균일하게 들어오는 빛입니다. 빛이 다른 물체에 부딪혀 여러 번 반사되어 공간 전체를 채우는 간접광을 단순화한 것입니다.
  • 특징: 빛의 위치, 물체의 각도, 시점(카메라)의 위치와 전혀 무관하게 모든 표면에 동일한 밝기를 제공합니다. 빛이 닿지 않는 어두운 곳(그림자)이 완전히 검은색으로 타버리는 것을 방지합니다.
  • 기본 수식: I ambient = Ka x Ia
    • Ka: 물체 표면의 Ambient 반사 계수
    • Ia: 주변 환경 빛의 밝기

Diffuse (난반사광 / 분산광)

  • 개념: 표면이 거칠어 빛이 사방으로 균일하게 흩어지는 빛입니다. 물체의 본래 색상과 입체감(음영)을 결정하는 가장 중요한 조명입니다.
  • 특징: **빛의 방향과 표면의 각도(법선 벡터)**에 따라 밝기가 달라집니다. 시점(카메라)의 위치가 바뀌어도 관찰되는 밝기는 변하지 않습니다. (람베르트 코사인 법칙 적용)
  • 기본 수식: I diffuse = Kd x Id x (N · L)
    • Kd: 물체 표면의 Diffuse 반사 계수
    • Id: 입사되는 빛의 밝기
    • N: 표면의 법선 벡터 (Normal vector)
    • L: 빛을 향하는 방향 벡터 (Light vector)

Emissive (방출광 / 자광)

  • 개념: 물체 자체가 스스로 빛을 내는 성분입니다. 야광 물체, 모니터 화면, 전구 등을 표현할 때 사용합니다.
  • 특징: 외부 조명의 영향을 받지 않고 오직 물체 고유의 속성으로만 결정됩니다. 실시간 그래픽스 환경에서는 이 빛이 다른 주변 물체를 비추는 광원 역할을 직접 수행하지는 않으며, 단순히 자기 자신만 밝게 보이도록 만듭니다.
  • 기본 수식: I emissive = Ke
    • Ke: 물체 자체가 방출하는 빛의 전용 색상 및 강도값

정답: ③ Specular

문제 25. 다음 그림의 A 지점은 음영이 생길 확률이 0%지만, B는 40%(5개의 광선중 2개가 차폐됨)의 확률로 음영이 생길 수 있다. 이처럼 임의의 빛을 랜덤하게 발사하여 그 중 몇개가 가려지는지를 판단하여 음영을 만드는 전역조명 기술을 무엇이라 하는가?

① Ambient Occlusion

② Gouraud Shading

③ Phong Shading

④ Flat Shading

개념:

Ambient Occlusion(AO)은 픽셀 주변의 반구(Hemisphere) 방향으로 랜덤한 광선(Ray)을 발사하여, 주변 물체에 의해 광선이 차폐(Occlusion)되는 정도를 계산하는 기술입니다. 차폐가 많이 될수록 어두워지고, 적게 될수록 밝아지는 방식을 통해 구석진 곳이나 물체가 겹치는 부분에 사실적인 그림자를 생성합니다.

풀이:

  • ② Gouraud Shading: 정점(Vertex)의 색상을 계산하고 면(Face) 안쪽을 보간(Interpolation)하는 쉐이딩 기법.
  • ③ Phong Shading: 정점의 법선(Normal)을 보간하여 픽셀(Pixel) 단위로 조명을 계산하는 쉐이딩 기법.
  • ④ Flat Shading: 다각형(Polygon) 하나당 하나의 색상만 적용하는 가장 단순한 쉐이딩 기법.

정답: ① Ambient Occlusion

 


 

추천글

 

게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원] | 종합

 

게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원] | 종합

About this Certification 홈페이지: https://www.kgq.or.kr/service/main.do검정안내: https://www.kgq.or.kr/service/info/cert.do국가기술자격증 (유효기간 없음)Since 2003시험일정 : https://www.kgq.or.kr/service/rcpt/sc_list.do원서접

devcol.tistory.com

 

필기시험 관련 기초 개념 공부 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]

 

  • Part 1 : 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이 |Part1. 게임 프로그래밍 방법론: 1~25 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
  • Part 2 : Part2. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
  • Part 3: Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
저작자표시 동일조건 (새창열림)
'자격증/게임국가기술자격검정 [한국콘텐츠진흥원]' 카테고리의 다른 글
  • Part2. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
  • Part1. 게임 프로그래밍 방법론: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
DevCol
DevCol
DevCol (Development Collaboration). 함께 개발 & 공부 & IT 정보 나눔장소
  • DevCol
    DevCol (Development Collaboration)
    DevCol
  • 블로그 메뉴

    • Unreal Engine
    • TIL
    • 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
    • 분류 전체보기 (73) N
      • Unreal Engine (31) N
        • Project (2) N
        • Dev Log (0)
        • Debugging (2) N
        • Blueprint (1)
        • UE 기초 (25) N
        • UE 심화 (0)
        • TA (1) N
      • Programming Language (0)
        • C++ (0)
        • C# (0)
      • Unity Engine (0)
      • 자격증 (3)
        • 게임국가기술자격검정 [한국콘텐츠진흥원] (3)
      • Coding Test | 코딩테스트 (0)
        • 프로그래머스 기초 (0)
        • 프로그래머스 입문 (0)
      • TIL (38) N
        • Boot Camp (32) N
      • Git & Github (1)
  • 링크

    • Youtube
    • GitHub
    • itch.io
    • Blog (En)
  • 공지사항

  • 인기 글

  • 태그

    Game Dev
    c
    Programming
    til
    Boot Camp
    게임 개발
    Unreal engine
    UE5
    cpp
    언리얼 엔진
    게임개발
    Devlog
    Code Kata
    기초
    프로그래밍
    코드카타
    내일배움캠프
    코드 카타
    C++
    UE
  • 최근 글

  • GitHub Youtube itch
  • hELLO · Designed By 정상우.v4.10.6
  • DevCol
    Part3. 게임 알고리즘과 설계: 1~25 | 2025 게임 프로그래밍 전문가 국가기술 자격검정 필기시험 1-B 풀이 | 게임국가기술자격검정 게임프로그래밍전문가 [한국콘텐츠진흥원]
    상단으로

    티스토리툴바