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;
}
}
반응형