반응형

Cell Shading의 GBuffer를 사용하기 위해서는, ShadingCommon 정의를 추가해야한다.

// ShadingCommon.ush

~~ ... ~~

#define SHADINGMODELID_SINGLELAYERWATER		10
#define SHADINGMODELID_THIN_TRANSLUCENT		11
#define SHADINGMODELID_DR_CELL_SHADING		12
#define SHADINGMODELID_STRATA			13		// Temporary while we convert everything to Strata
#define SHADINGMODELID_NUM			14
#define SHADINGMODELID_MASK			0xF		// 4 bits reserved for ShadingModelID	

~~ ... ~~

define 정의로 사용되는 상수이기 때문에, 기존의 값을 바꾸어 정의하였다.

 

Shading Model 사용 시, Debugging 과정 중 보여질 Color 설정도 해준다.

넘겨도 상관 없을 듯 하다.

// ShadingCommon.ush

// for debugging and to visualize
float3 GetShadingModelColor(uint ShadingModelID)
{
	// TODO: PS4 doesn't optimize out correctly the switch(), so it thinks it needs all the Samplers even if they get compiled out
	//	This will get fixed after launch per Sony...
#if PS4_PROFILE

	~~ ... ~~
    
	else if (ShadingModelID == SHADINGMODELID_SINGLELAYERWATER) return float3(0.5f, 0.5f, 1.0f);
	else if (ShadingModelID == SHADINGMODELID_THIN_TRANSLUCENT) return float3(1.0f, 0.8f, 0.3f);
	else if (ShadingModelID == SHADINGMODELID_DR_CELL_SHADING) return float3(0.6f, 0.6f, 0.6f);
	else if (ShadingModelID == SHADINGMODELID_STRATA) return float3(1.0f, 1.0f, 0.0f);
	else return float3(1.0f, 1.0f, 1.0f); // White
#else
	switch(ShadingModelID)
	{
    
		~~ ... ~~
        
		case SHADINGMODELID_THIN_TRANSLUCENT: return float3(1.0f, 0.8f, 0.3f);
		case SHADINGMODELID_DR_CELL_SHADING: return float3(0.6f, 0.6f, 0.6f);
		case SHADINGMODELID_STRATA: return float3(1.0f, 1.0f, 0.0f);
		default: return float3(1.0f, 1.0f, 1.0f); // White
	}
#endif
}

 

정의되지 않았을 경우를 대비한 define을 정의해주어야 한다.

// Definitions.usf

~~ ... ~~

#ifndef MATERIAL_SHADINGMODEL_SINGLELAYERWATER
#define MATERIAL_SHADINGMODEL_SINGLELAYERWATER			0 
#endif

#ifndef MATERIAL_SHADINGMODEL_DR_CELL_SHADING
#define MATERIAL_SHADINGMODEL_DR_CELL_SHADING			0 
#endif

#ifndef SINGLE_LAYER_WATER_SEPARATED_MAIN_LIGHT
#define SINGLE_LAYER_WATER_SEPARATED_MAIN_LIGHT			0 
#endif

~~ ... ~~

여기까지가 Shader 코드를 적용하기 위한 설정이다.


GBuffer에 데이터를 설정하기 위해, Shading Model에 따른 GBuffer를 설정해주어야 한다.

// ShadingModelsMaterial.ush

void SetGBufferForShadingModel(
	in out FGBufferData GBuffer, 
	in out FMaterialPixelParameters MaterialParameters,
	const float Opacity,
	const half3 BaseColor,
	const half  Metallic,
	const half  Specular,
	const float Roughness,
	const float Anisotropy,
	const float3 SubsurfaceColor,
	const float SubsurfaceProfile,
	const float Dither,
	const uint ShadingModel)
{
	GBuffer.WorldNormal = MaterialParameters.WorldNormal;
	GBuffer.WorldTangent = MaterialParameters.WorldTangent;
	GBuffer.BaseColor = BaseColor;
	GBuffer.Metallic = Metallic;
	GBuffer.Specular = Specular;
	GBuffer.Roughness = Roughness;
	GBuffer.Anisotropy = Anisotropy;
	GBuffer.ShadingModelID = ShadingModel;

	~~ ... ~~

#if MATERIAL_SHADINGMODEL_DR_CELL_SHADING
    else if (ShadingModel == SHADINGMODELID_DR_CELL_SHADING)
	{
		
	}
#endif
}

Shading Model을 추가하고 나면, SHADINGMODELID_DR_CELL_SHADING 정의를 하지 않았다는 것을 알 수 있다.

파일을 확인해보니, ClusteredDeferredShadingPixelShader.usf 파일에 관련 정의부가 있는 것을 확인했다.

// ClusteredDeferredShadingPixelShader.usf

~~ ... ~~

#if USE_PASS_PER_SHADING_MODEL
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_DEFAULT_LIT,			PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_SUBSURFACE,			PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_PREINTEGRATED_SKIN,	PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_CLEAR_COAT,			PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_SUBSURFACE_PROFILE,	PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_TWOSIDED_FOLIAGE,	PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_HAIR,				PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_CLOTH,				PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_EYE,					PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_SINGLELAYERWATER,	PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM(SHADINGMODELID_DR_CELL_SHADING,		PixelShadingModelID, CompositedLighting, ScreenUV, CulledLightGridData, Dither, FirstNonSimpleLightIndex);
	// SHADINGMODELID_THIN_TRANSLUCENT - skipping because it can not be opaque
#else // !USE_PASS_PER_SHADING_MODEL

~~ ... ~~

 

GBuffer 관련 설정을 하고나니, 실제 GBuffer에 넣을 데이터들이 설정되지 않았다는 것을 깨달았다.

이전에 내용의 순서를 변경하였기 때문에, GBuffer 설정까지 먼저 진행하게 되었고, 

Shader 코드에 필요한 설정을 선행해야 하는 것을 확인하게 되었다.

반응형

+ Recent posts