카테고리 없음

Unity_RP_Culling

zelkova 2021. 4. 6. 10:24

<목차로 돌아가기>

 

 

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();
	}

	void DrawVisibleGeometry() {
		context.DrawSkybox(camera);
	}

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

	void ExecuteBuffer() {
		//버퍼 적용하고 썻던건 버리기 퉷.
		context.ExecuteCommandBuffer(buffer);
		buffer.Clear();
	}


	//모든 개체를 그리는 것보다는 카메라에 보이는 객체만을 그리는 것이 좋습니다.
	//컬링할 수 잇는 항목을 파악하는 방법은 ScriptableCullingParameters 구조체를 사용하는 것입니다.
	bool Cull() {
		//camera.TryGetCullingParameters 매개변수를 성공적으로 검색할 수 있는지를 반환합니다. 
		if (camera.TryGetCullingParameters(out ScriptableCullingParameters p)) {
			//ref로 주소를 직접 참조하는 이유는 큰 구조체의 복사본을 만드는 것을 방지하기 위함
			cullingResults = context.Cull(ref p);
			return true;
		}
		return false;
	}
}

 

 

 

반응형