This repository was archived by the owner on Dec 5, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathSplineComputeShader.cpp
More file actions
93 lines (75 loc) · 3.58 KB
/
SplineComputeShader.cpp
File metadata and controls
93 lines (75 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright 2017 Oh-Hyun Kwon. All Rights Reserved.
#include "SplineRendererPrivatePCH.h"
#include "RHIStaticStates.h"
#include "ShaderParameterUtils.h"
#include "ShaderParameters.h"
#include "UniformBuffer.h"
IMPLEMENT_GLOBAL_SHADER_PARAMETER_STRUCT(FSplineComputeShaderUniformParameters,
"SplineComputeShaderUniformParameters");
FBaseSplineComputeShader::FBaseSplineComputeShader(
ShaderMetaType::CompiledShaderInitializerType const& Initializer)
: FGlobalShader(Initializer)
{
InSplineControlPointData.Bind(Initializer.ParameterMap, TEXT("InSplineControlPointData"));
InSplineSegmentData.Bind(Initializer.ParameterMap, TEXT("InSplineSegmentData"));
InSplineData.Bind(Initializer.ParameterMap, TEXT("InSplineData"));
OutMeshVertexData.Bind(Initializer.ParameterMap, TEXT("OutMeshVertexData"));
}
void FBaseSplineComputeShader::SetUniformBuffers(
FRHICommandList& RHICmdList, FSplineComputeShaderUniformParameters& UniformBufferParams)
{
FComputeShaderRHIParamRef ComputeShaderRHI = GetComputeShader();
FSplineComputeShaderUniformParametersRef UniformBuffer =
FSplineComputeShaderUniformParametersRef::CreateUniformBufferImmediate(
UniformBufferParams, UniformBuffer_SingleDraw);
SetUniformBufferParameter(RHICmdList, ComputeShaderRHI,
GetUniformBufferParameter<FSplineComputeShaderUniformParameters>(),
UniformBuffer);
}
void FBaseSplineComputeShader::SetBuffers(FRHICommandList& RHICmdList,
FShaderResourceViewRHIRef InSplineControlPointBufferSRV,
FShaderResourceViewRHIRef InSplineSegmentBufferSRV,
FShaderResourceViewRHIRef InSplineBufferSRV,
FUnorderedAccessViewRHIRef OutMeshVertexBufferUAV)
{
FComputeShaderRHIParamRef ComputeShaderRHI = GetComputeShader();
if (InSplineControlPointData.IsBound())
RHICmdList.SetShaderResourceViewParameter(ComputeShaderRHI, //
InSplineControlPointData.GetBaseIndex(), //
InSplineControlPointBufferSRV);
if (InSplineSegmentData.IsBound())
RHICmdList.SetShaderResourceViewParameter(ComputeShaderRHI, //
InSplineSegmentData.GetBaseIndex(), //
InSplineSegmentBufferSRV);
if (InSplineData.IsBound())
RHICmdList.SetShaderResourceViewParameter(ComputeShaderRHI, //
InSplineData.GetBaseIndex(), //
InSplineBufferSRV);
if (OutMeshVertexData.IsBound())
RHICmdList.SetUAVParameter(ComputeShaderRHI, OutMeshVertexData.GetBaseIndex(),
OutMeshVertexBufferUAV);
}
void FBaseSplineComputeShader::UnbindBuffers(FRHICommandList& RHICmdList)
{
FComputeShaderRHIParamRef ComputeShaderRHI = GetComputeShader();
if (InSplineControlPointData.IsBound())
RHICmdList.SetShaderResourceViewParameter(
ComputeShaderRHI, InSplineControlPointData.GetBaseIndex(), FShaderResourceViewRHIRef());
if (InSplineSegmentData.IsBound())
RHICmdList.SetShaderResourceViewParameter(
ComputeShaderRHI, InSplineSegmentData.GetBaseIndex(), FShaderResourceViewRHIRef());
if (InSplineData.IsBound())
RHICmdList.SetShaderResourceViewParameter(ComputeShaderRHI, InSplineData.GetBaseIndex(),
FShaderResourceViewRHIRef());
if (OutMeshVertexData.IsBound())
RHICmdList.SetUAVParameter(ComputeShaderRHI, OutMeshVertexData.GetBaseIndex(),
FUnorderedAccessViewRHIRef());
}
FSplineComputeShader_Sphere::FSplineComputeShader_Sphere(
ShaderMetaType::CompiledShaderInitializerType const& Initializer)
: FBaseSplineComputeShader(Initializer)
{
}
IMPLEMENT_SHADER_TYPE(, FSplineComputeShader_Sphere,
TEXT("/Plugin/SplineRenderer/Private/SplineComputeShader.usf"),
TEXT("MainCS"), SF_Compute);