카테고리 없음

Unity_RP_오브젝트그리기

zelkova 2021. 4. 7. 10:18

<목차로 돌아가기>

 

우선 몽땅 그리기
using UnityEngine;
using UnityEngine.Rendering;

public class CameraRenderer : MonoBehaviour
{
	const string bufferName = "Render Camera";
	CommandBuffer buffer = new CommandBuffer {
		name = bufferName
	};

	ScriptableRenderContext context;
	Camera camera;

	CullingResults cullingResults;
	public void Render(ScriptableRenderContext context, Camera camera) {
        this.context = context;
        this.camera = camera;

		if (!Cull()) {
			return;
		}

		Setup();
        DrawVisibleGeometry();
        Submit();
    }

	void Setup() {
		context.SetupCameraProperties(camera);
		buffer.ClearRenderTarget(true, true, Color.clear);
		buffer.BeginSample(bufferName);

		ExecuteBuffer();
	}

	// 어떤 종류의 셰이더 패스가 허용되는지 체크하기위함.
	// 이 RP는 라이팅되지 않은 셰이더만 지원하기에 아래의 셰이더 태그 ID를 적용
	static ShaderTagId unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit");

	void DrawVisibleGeometry() {
		//직교 또는 거리 기반 정렬 적용 여부를 결정하는데 사용하는 카메라를 넣고 정렬세팅 생성
		var sortingSettings = new SortingSettings(camera) {
			//caiteria 속성을 사용하여 그리기 순서를 적용할 수 있습니다.
			criteria = SortingCriteria.CommonOpaque
		};
		//드로잉설정
		var drawingSettings = new DrawingSettings(unlitShaderTagId, sortingSettings);
		//필터링 설정 허용되는 랜더큐를 지정한다. 현재 인수는 모든것을 허용함.
		var filteringSettings = new FilteringSettings(RenderQueueRange.all);
		//현재 보이는것이 무었인지 알기 위함
		context.DrawRenderers( cullingResults, ref drawingSettings, ref filteringSettings );


		context.DrawSkybox(camera);
	}

	void Submit() {
		buffer.EndSample(bufferName);
		ExecuteBuffer();
		context.Submit();
	}

	void ExecuteBuffer() {
		context.ExecuteCommandBuffer(buffer);
		buffer.Clear();
	}

	bool Cull() {
		if (camera.TryGetCullingParameters(out ScriptableCullingParameters p)) {
			cullingResults = context.Cull(ref p);
			return true;
		}
		return false;
	}
}

 

불투명 객체를 나중에 그리자.

스카이 박스는 불투명한 객체 앞에 그려지기 때문에. 스카이 박스 를 그린 다음에 투명한 객체를 따로 그려야 합니다.

using UnityEngine;
using UnityEngine.Rendering;

public class CameraRenderer : MonoBehaviour
{
	const string bufferName = "Render Camera";
	CommandBuffer buffer = new CommandBuffer {
		name = bufferName
	};

	ScriptableRenderContext context;
	Camera camera;

	CullingResults cullingResults;
	public void Render(ScriptableRenderContext context, Camera camera) {
        this.context = context;
        this.camera = camera;

		if (!Cull()) {
			return;
		}

		Setup();
        DrawVisibleGeometry();
        Submit();
    }

	void Setup() {
		context.SetupCameraProperties(camera);
		buffer.ClearRenderTarget(true, true, Color.clear);
		buffer.BeginSample(bufferName);

		ExecuteBuffer();
	}

	static ShaderTagId unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit");

	void DrawVisibleGeometry() {
		var sortingSettings = new SortingSettings(camera) {
			criteria = SortingCriteria.CommonOpaque
		};
		var drawingSettings = new DrawingSettings(unlitShaderTagId, sortingSettings);
		var filteringSettings = new FilteringSettings(RenderQueueRange.opaque);
		context.DrawRenderers( cullingResults, ref drawingSettings, ref filteringSettings );

		context.DrawSkybox(camera);

		//불투명 오브젝트만 따로 그리기.
		sortingSettings.criteria = SortingCriteria.CommonTransparent;
		drawingSettings.sortingSettings = sortingSettings;
		filteringSettings.renderQueueRange = RenderQueueRange.transparent;
		context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);
	}

	void Submit() {
		buffer.EndSample(bufferName);
		ExecuteBuffer();
		context.Submit();
	}

	void ExecuteBuffer() {
		context.ExecuteCommandBuffer(buffer);
		buffer.Clear();
	}


	bool Cull() {
		if (camera.TryGetCullingParameters(out ScriptableCullingParameters p)) {
			cullingResults = context.Cull(ref p);
			return true;
		}
		return false;
	}
}

 

 

 

 

 

 

 

 

 

반응형