반응형

Shader를 적용하여 사용하기 위해서는, Shader Parameter 설정을 해주어야한다.

이는 Game Thread에서 Render Thread로 Shader 값을 전달하기 위한 용도로 사용된다.

 

Unreal에서는 이를 Proxy를 통하여 Render Thread로 직접 전달해주는 방식도 있지만, 예제에서는 Shader Parameter에 추가하여 전달하는 방식으로 진행하였다.

이후, Proxy를 통한 Render Thread로 보내는 방식도 테스트해 볼 예정이다.

(관련 링크 : https://docs.unrealengine.com/5.0/en-US/render-dependency-graph-in-unreal-engine/)

 

// SceneView.h

~~ ... ~~

BEGIN_GLOBAL_SHADER_PARAMETER_STRUCT_WITH_CONSTRUCTOR(FViewUniformShaderParameters, ENGINE_API)

	VIEW_UNIFORM_BUFFER_MEMBER_TABLE

	~~ ... ~~

	// Cell Shading
	SHADER_PARAMETER_TEXTURE(Texture2D, CellShadingAtlas)
	SHADER_PARAMETER_SAMPLER(SamplerState, CellShadingSampler)
END_GLOBAL_SHADER_PARAMETER_STRUCT()

~~ ... ~~

생성해둔 Asset을 사용하기 위한 Texture2D와 Sampler Parameter를 추가한다.

 

Render Thread로 값을 전달할 때, 초기화가 되어있지 않으면 Crash가 발생하기 때문에, 선언한 변수를 초기화 시켜주어야한다.

FViewUniformShaderParameters::FViewUniformShaderParameters()
{
	FMemory::Memzero(*this);

	FRHITexture* BlackVolume = (GBlackVolumeTexture &&  GBlackVolumeTexture->TextureRHI) ? GBlackVolumeTexture->TextureRHI : GBlackTexture->TextureRHI;
	FRHITexture* BlackUintVolume = (GBlackUintVolumeTexture &&  GBlackUintVolumeTexture->TextureRHI) ? GBlackUintVolumeTexture->TextureRHI : GBlackTexture->TextureRHI;
	check(GBlackVolumeTexture);

	~~ ... ~~

	CellShadingAtlas = GWhiteTexture->GetTextureRHI();
	CellShadingSampler = TStaticSamplerState<SF_Point, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI();
}

Parameter로 값을 전달해주기 위해, Buffer를 설정해준다.

// SceneRendering.cpp

~~ ... ~~

#include "CellShading/CellShadingSubsystem.h"
#include "Curves/CurveLinearColorAtlas.h"

~~ ... ~~

void FViewInfo::SetupUniformBufferParameters(
	const FViewMatrices& InViewMatrices,
	const FViewMatrices& InPrevViewMatrices,
	FBox* OutTranslucentCascadeBoundsArray,
	int32 NumTranslucentCascades,
	FViewUniformShaderParameters& ViewUniformShaderParameters) const
{
	check(Family);
    
    ~~ ... ~~

    if ( UCellShadingSubsystem* CellShadingSubsystem = GEngine->GetEngineSubsystem<UCellShadingSubsystem>() )
    {
        if ( TObjectPtr<UCurveLinearColorAtlas> CellShadingAtlas = CellShadingSubsystem->GetCellShadingCurveAtlas() )
        {
            ViewUniformShaderParameters.CellShadingAtlas = CellShadingAtlas->TextureReference.TextureReferenceRHI;
        }
    }
}

 

Build Error 경우

더보기

여기까지 진행 한 후 Build를 하니, CellShadingSubsystem private Compile Error 발생하여 다방면으로 시도해보았다..

튜토리얼과 동일한 경로로 이동해보고, 접근 지정자도 다양하게 변경해보았지만 문제는 간단했다.

 

Class API를 지정해주지 않았던것..!class ENGINE_API UCellShadingSubsystem으로 변경해주니 정상 Build 되었다.
반응형

+ Recent posts