우선 몽땅 그리기 |
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;
}
}
반응형