엔티티가 월드에 존재한다면, 플레이어 화면에 보이도록 렌더링해야 합니다. NeoForge(Minecraft)는 Vulkan 기반 렌더 백엔드를 사용하지만, 모드 API는 EntityRenderer → MobRenderer → EntityModel 계층을 통해 백엔드 독립 방식으로 렌더링을 처리합니다.
이번 챕터에서는:
EntityModel — 메시(큐브) 정의 + UV 매핑
MobRenderer — 텍스처 연결 + 렌더 등록
클라이언트 전용 이벤트 — RegisterLayerDefinitions + RegisterRenderers
public class RubyGolemRenderer extends MobRenderer<RubyGolemEntity, RubyGolemRenderState, RubyGolemModel> { /** * 텍스처 경로 — assets/<modId>/textures/entity/<name>.png * 26.1.2 에서 ResourceLocation 은 삭제되어 Identifier 를 사용하며, * Identifier 는 "textures/" prefix 를 자동으로 붙여주지 않습니다. * 반드시 "textures/entity/..." 형태로 명시해야 합니다. */ private static final Identifier TEXTURE = Identifier.fromNamespaceAndPath("examplemod", "textures/entity/ruby_golem.png"); public RubyGolemRenderer(EntityRendererProvider.Context context) { super(context, new RubyGolemModel(context.bakeLayer(RubyGolemModel.LAYER_LOCATION)), 0.5f); // 그림자 반지름 (블록 단위) } /** * 매 프레임 재사용할 RenderState 를 생성합니다. (abstract — 반드시 구현) */ @Override public RubyGolemRenderState createRenderState() { return new RubyGolemRenderState(); } /** * 엔티티 상태를 RenderState 로 추출합니다. * 추가 커스텀 필드가 없으므로 부모 구현(표준 LivingEntity 필드 채움)만으로 충분합니다. * 커스텀 애니메이션 값이 생기면 super 호출 뒤 state.xxx = entity.xxx 로 채웁니다. */ @Override public void extractRenderState(RubyGolemEntity entity, RubyGolemRenderState state, float partialTick) { super.extractRenderState(entity, state, partialTick); } @Override public Identifier getTextureLocation(RubyGolemRenderState state) { return TEXTURE; }}
생성자 파라미터:
파라미터
설명
context
레이어 베이크·폰트 등 렌더 컨텍스트
new RubyGolemModel(context.bakeLayer(...))
레이어를 구워 모델 인스턴스 생성
0.5f
그림자 반지름 (블록 단위) — 0이면 그림자 없음
26.1.2 엔티티 렌더 리팩터로 MobRenderer는 <엔티티, RenderState, 모델> 3-제네릭 형태가 되었습니다. createRenderState()(abstract)로 매 프레임 재사용할 스냅샷을 만들고, extractRenderState(...)에서 엔티티 값을 그 스냅샷으로 복사합니다.
getTextureLocation()은 RenderState에 따라 동적 텍스처를 반환할 수도 있습니다. 예를 들어 HP 기반으로 다른 텍스처를 쓰고 싶다면 extractRenderState에서 HP를 RenderState로 복사한 뒤 이 메서드에서 분기합니다.
NeoForge 26.1은 Vulkan 기반 렌더 백엔드를 사용합니다. 그러나 모드는 직접 GL/Vulkan 호출을 할 필요가 없습니다:
PoseStack — 변환 행렬 스택 (GL glPushMatrix 대체)
MultiBufferSource — 렌더 버퍼 추상화 (Vulkan 커맨드 버퍼 위에 위치)
VertexConsumer — 정점 데이터 기록 인터페이스
베이스 Model#renderToBuffer(PoseStack, VertexConsumer, ...)(26.1.2 에서 final)가 각 ModelPart를 그려주며, Vulkan 렌더러가 알아서 처리합니다. 직접 GL 함수(glVertexAttribPointer 등)를 호출하는 것은 금지입니다 — 백엔드 교체 시 즉시 깨집니다.