전체 글

그래픽 엔지니어를 목표로 공부하고 있는 학생입니다
게임 그래픽스 최적화: CPU와 GPU 병목 구조게임의 프레임 속도는 CPU와 GPU가 한 프레임을 함께 처리하며 결정된다. 두 장치 중 더 느린 쪽이 전체 속도를 제한하므로, 성능 문제를 해결하기 위해서는 병목 구간이 CPU인지 GPU인지 정확히 파악하는 것이 중요하다.다음 내용은 CPU와 GPU에서 자주 발생하는 성능 저하 원인과 관리 방법을 정리한 것이다. 쉐이더 최적화 이전 단계에서 다뤄야 할 기본적인 요소들이다.1. CPU 병목CPU는 주로 애니메이션, 물리 계산, UI 갱신, 파티클 시스템 등 엔진 기능 처리에 부하를 받는다. 이 영역은 코드를 잘 짜는 것보다 데이터와 기능 사용이 효율적으로 구성되어 있는지가 더 중요하다.1.1 애니메이션 데이터애니메이션은 매 프레임마다 본(Bone) 단위로 ..
색을 생성해보자GPUGrassCommon.hlsl 파일을 새로 만들어서 공통 요소들을 묶고 색 함수를 추가했다. GPUGrass.cspublic struct Constants { p/////// public float4 RootColor; public float4 TopColor; } public struct Grass { /////// public uint2 ColorParams; } [SerializeField] private Color rootColor; [SerializeField] private Color topColor; _cons..
저번 시간에 풀 하나 그리기를 성공 했으니, 여러개의 풀을 한꺼번에 그려보도록 해보자. GPUGrass.compute#pragma kernel Init#pragma kernel Tick//추가#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#define VERTEX_PER_BLADE 15cbuffer Constants{ uint Capacity;}RWByteAddressBuffer GrassBuffer;RWByteAddressBuffer CommandBuffer;[numthreads(1, 1, 1)]void Init(){ CommandBuffer.Store4(0, uint4(VERTEX_PER_BL..
GPU 인스턴싱과 잔디 기하학(Geometry) 생성 로직을 완성했습니다. 이로써 CPU는 렌더링 명령을 단 한 번만 내리고, 모든 잔디의 위치 계산과 렌더링은 GPU가 전담하는 진정한 GPU-Driven 파이프라인이 구축되었습니다. 잔디 메쉬를 GPU에서 직접 생성(Geometry)하고, GrassBuffer에서 위치 데이터를 읽어와 그리는 구조를 확립했습니다. 코드 업데이트 핵심 요약 GPUGrass.csC# 스크립트는 이제 GPU 리소스를 관리하고, 매 프레임 Compute Shader와 렌더링 셰이더를 순서대로 실행하는 파이프라인 관리자 역할을 수행합니다. private void OnValidate(){ // capacity를 0과 MaxCapacity(10000) 사이로 안전하게 ..
대규모 잔디 렌더링 시스템의 실제 실행 로직이 구현되었습니다. 이번 업데이트는 Compute Shader 파일(GPUGrass.compute)을 생성하고, 잔디 시스템의 핵심인 GPU 버퍼 초기화 및 실제 렌더링 명령 실행 로직을 완성했습니다. Compute Shader (GPUGrass.compute) 생성이 파일은 GPU에서 실행되는 두 가지 핵심 커널(Kernel)을 정의합니다.#pragma kernel Init // 초기 설정(CommandBuffer 작성)을 위한 커널 선언#pragma kernel Tick // 매 프레임 잔디 업데이트를 위한 커널 선언#define VERTEX_PER_BLADE 15 // 잔디 블레이드 하나당 구성되는 정점 개수 (렌더링 명령에 사용)cbuffer Const..
지난번 포스팅에서 Compute Shader 기반 잔디 시스템의 기본 데이터 구조(Grass Struct)와 리소스 관리(Init, Dispose)를 살펴보았습니다. 이번 업데이트에서는 CPU 개입을 최소화하고 GPU가 직접 렌더링 명령을 처리하는 인다이렉트 드로우(Indirect Draw) 방식을 도입했습니다. 이 업데이트의 핵심은 다음과 같습니다.renderMaterial: 잔디를 실제로 그릴 때 사용할 머티리얼(Material) 추가._renderParams: 렌더링에 필요한 모든 설정(머티리얼 등)을 담는 구조체 추가._commandBuffer: 렌더링 명령어(몇 개의 잔디를 그릴지 등)를 GPU에 저장하는 커맨드 버퍼 추가.Tick(): Graphics.RenderPrimitivesIndirec..
Unity에서 수많은 오브젝트를 효율적으로 렌더링하기 위해 Compute Shader를 활용하는 시스템, GPU 기반 잔디 렌더링 시스템을 구현해보겠다. 게임에서 맵 중 땅에 넓게 심는 풀들을 생각하면 될 것이다. CPU 초기 전체 코드using System.Runtime.InteropServices;using Unity.Mathematics;using UnityEditor.Experimental.GraphView;using UnityEngine;namespace GPUGrass{ public struct Grass { public static readonly int Size = Marshal.SizeOf(); public float3 Position; } ..
노멀 맵 입력 속성 생성Properties { // 텍스처 입력: 기본 색상 또는 패턴 텍스처 _BaseColor ("Base Color (Texture)", 2D) = "white" {} // 노멀 입력: [Normal] _Normal ("Normal", 2D) = "bump" {} // UV 스케일링을 위한 실수 값 _UVScale ("UV Scale", Float) = 1.0 } 노멀 구현// 텍스처 선언 Texture2D _BaseColor; Texture2D _Normal; // 텍스처 샘플러 상태 선언 SamplerState ..
Roble
Roble Programming