当前位置: 首页 > news >正文

上海建站费用呼伦贝尔网站建设呼伦贝尔

上海建站费用,呼伦贝尔网站建设呼伦贝尔,tag() wordpress,好的高端企业网站建设公司转载#xff1a;UE5 中的computer shader使用 - 知乎 (zhihu.com) 目标 通过蓝图输入参数#xff0c;经过Compture Shader做矩阵运算 流程 1. 新建插件 2. 插件设置 3. 声明和GPU内存对齐的参数结构 4. 声明Compture Shader结构 5. 参数绑定 6. 着色器实现 7. 分配 work gr…转载UE5 中的computer shader使用 - 知乎 (zhihu.com) 目标 通过蓝图输入参数经过Compture Shader做矩阵运算 流程 1. 新建插件 2. 插件设置 3. 声明和GPU内存对齐的参数结构 4. 声明Compture Shader结构 5. 参数绑定 6. 着色器实现 7. 分配 work groups 8. 计算和输出 9. 额外添加参数 1. 新建插件 新建空白插件即可正常插件创建流程看官方文档, 2. 插件设置 XXX.Build.cs PrivateDependencyModuleNames.AddRange(new string[]{CoreUObject,Engine,Renderer,RenderCore,RHI,Projects// ... add private dependencies that you statically link with here ... });XXX.uplugin Modules: [{Name: CS_Test,Type: Runtime,LoadingPhase: PostConfigInit}] 3. 声明和GPU内存对齐的参数结构 struct CS_TEST_API FMySimpleComputeShaderDispatchParams {int X;int Y;int Z;int Input[2];int Output;FMySimpleComputeShaderDispatchParams(int x, int y, int z): X(x), Y(y), Z(z){} }; 4. 声明Compture Shader结构和参数绑定 MySimpleComputeShader.cpp #include MySimpleComputeShader.h #include ../../../Shaders/Public/MySimpleComputeShader.h #include PixelShaderUtils.h #include RenderCore/Public/RenderGraphUtils.h #include MeshPassProcessor.inl #include StaticMeshResources.h #include DynamicMeshBuilder.h #include RenderGraphResources.h #include GlobalShader.h #include UnifiedBuffer.h #include CanvasTypes.h #include MaterialShader.hDECLARE_STATS_GROUP(TEXT(MySimpleComputeShader), STATGROUP_MySimpleComputeShader, STATCAT_Advanced); DECLARE_CYCLE_STAT(TEXT(MySimpleComputeShader Execute), STAT_MySimpleComputeShader_Execute, STATGROUP_MySimpleComputeShader);// This class carries our parameter declarations and acts as the bridge between cpp and HLSL. class CS_TEST_API FMySimpleComputeShader : public FGlobalShader { public:DECLARE_GLOBAL_SHADER(FMySimpleComputeShader);SHADER_USE_PARAMETER_STRUCT(FMySimpleComputeShader, FGlobalShader);class FMySimpleComputeShader_Perm_TEST : SHADER_PERMUTATION_INT(TEST, 1);using FPermutationDomain TShaderPermutationDomainFMySimpleComputeShader_Perm_TEST;BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )/** Heres where you define one or more of the input parameters for your shader.* Some examples:*/// SHADER_PARAMETER(uint32, MyUint32) // On the shader side: uint32 MyUint32;// SHADER_PARAMETER(FVector3f, MyVector) // On the shader side: float3 MyVector;// SHADER_PARAMETER_TEXTURE(Texture2D, MyTexture) // On the shader side: Texture2Dfloat4 MyTexture; (float4 should be whatever you expect each pixel in the texture to be, in this case float4(R,G,B,A) for 4 channels)// SHADER_PARAMETER_SAMPLER(SamplerState, MyTextureSampler) // On the shader side: SamplerState MySampler; // CPP side: TStaticSamplerStateESamplerFilter::SF_Bilinear::GetRHI();// SHADER_PARAMETER_ARRAY(float, MyFloatArray, [3]) // On the shader side: float MyFloatArray[3];// SHADER_PARAMETER_UAV(RWTexture2DFVector4f, MyTextureUAV) // On the shader side: RWTexture2Dfloat4 MyTextureUAV;// SHADER_PARAMETER_UAV(RWStructuredBufferFMyCustomStruct, MyCustomStructs) // On the shader side: RWStructuredBufferFMyCustomStruct MyCustomStructs;// SHADER_PARAMETER_UAV(RWBufferFMyCustomStruct, MyCustomStructs) // On the shader side: RWBufferFMyCustomStruct MyCustomStructs;// SHADER_PARAMETER_SRV(StructuredBufferFMyCustomStruct, MyCustomStructs) // On the shader side: StructuredBufferFMyCustomStruct MyCustomStructs;// SHADER_PARAMETER_SRV(BufferFMyCustomStruct, MyCustomStructs) // On the shader side: BufferFMyCustomStruct MyCustomStructs;// SHADER_PARAMETER_SRV(Texture2DFVector4f, MyReadOnlyTexture) // On the shader side: Texture2Dfloat4 MyReadOnlyTexture;// SHADER_PARAMETER_STRUCT_REF(FMyCustomStruct, MyCustomStruct)SHADER_PARAMETER_RDG_BUFFER_SRV(Bufferint, Input)SHADER_PARAMETER_RDG_BUFFER_UAV(RWBufferint, Output)END_SHADER_PARAMETER_STRUCT()public:static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters Parameters){const FPermutationDomain PermutationVector(Parameters.PermutationId);return true;}static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters Parameters, FShaderCompilerEnvironment OutEnvironment){FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);const FPermutationDomain PermutationVector(Parameters.PermutationId);/** Here you define constants that can be used statically in the shader code.* Example:*/// OutEnvironment.SetDefine(TEXT(MY_CUSTOM_CONST), TEXT(1));/** These defines are used in the thread count section of our shader*/OutEnvironment.SetDefine(TEXT(THREADS_X), NUM_THREADS_MySimpleComputeShader_X);OutEnvironment.SetDefine(TEXT(THREADS_Y), NUM_THREADS_MySimpleComputeShader_Y);OutEnvironment.SetDefine(TEXT(THREADS_Z), NUM_THREADS_MySimpleComputeShader_Z);// This shader must support typed UAV load and we are testing if it is supported at runtime using RHIIsTypedUAVLoadSupported//OutEnvironment.CompilerFlags.Add(CFLAG_AllowTypedUAVLoads);// FForwardLightingParameters::ModifyCompilationEnvironment(Parameters.Platform, OutEnvironment);} private: };// This will tell the engine to create the shader and where the shader entry point is. // ShaderType ShaderPath Shader function name Type IMPLEMENT_GLOBAL_SHADER(FMySimpleComputeShader, /Plugin/CS_Test/Private/MySimpleComputeShader.usf, MySimpleComputeShader, SF_Compute);void FMySimpleComputeShaderInterface::DispatchRenderThread(FRHICommandListImmediate RHICmdList, FMySimpleComputeShaderDispatchParams Params, TFunctionvoid(int OutputVal) AsyncCallback) {FRDGBuilder GraphBuilder(RHICmdList);{SCOPE_CYCLE_COUNTER(STAT_MySimpleComputeShader_Execute);DECLARE_GPU_STAT(MySimpleComputeShader)RDG_EVENT_SCOPE(GraphBuilder, MySimpleComputeShader);RDG_GPU_STAT_SCOPE(GraphBuilder, MySimpleComputeShader);typename FMySimpleComputeShader::FPermutationDomain PermutationVector;// Add any static permutation options here// PermutationVector.SetFMySimpleComputeShader::FMyPermutationName(12345);TShaderMapRefFMySimpleComputeShader ComputeShader(GetGlobalShaderMap(GMaxRHIFeatureLevel), PermutationVector);bool bIsShaderValid ComputeShader.IsValid();if (bIsShaderValid) {FMySimpleComputeShader::FParameters* PassParameters GraphBuilder.AllocParametersFMySimpleComputeShader::FParameters();const void* RawData (void*)Params.Input;int NumInputs 2;int InputSize sizeof(int);FRDGBufferRef InputBuffer CreateUploadBuffer(GraphBuilder, TEXT(InputBuffer), InputSize, NumInputs, RawData, InputSize * NumInputs);PassParameters-Input GraphBuilder.CreateSRV(FRDGBufferSRVDesc(InputBuffer, PF_R32_SINT));FRDGBufferRef OutputBuffer GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateBufferDesc(sizeof(int32), 1),TEXT(OutputBuffer));PassParameters-Output GraphBuilder.CreateUAV(FRDGBufferUAVDesc(OutputBuffer, PF_R32_SINT));auto GroupCount FComputeShaderUtils::GetGroupCount(FIntVector(Params.X, Params.Y, Params.Z), FComputeShaderUtils::kGolden2DGroupSize);GraphBuilder.AddPass(RDG_EVENT_NAME(ExecuteMySimpleComputeShader),PassParameters,ERDGPassFlags::AsyncCompute,[PassParameters, ComputeShader, GroupCount](FRHIComputeCommandList RHICmdList){FComputeShaderUtils::Dispatch(RHICmdList, ComputeShader, *PassParameters, GroupCount);});FRHIGPUBufferReadback* GPUBufferReadback new FRHIGPUBufferReadback(TEXT(ExecuteMySimpleComputeShaderOutput));AddEnqueueCopyPass(GraphBuilder, GPUBufferReadback, OutputBuffer, 0u);auto RunnerFunc [GPUBufferReadback, AsyncCallback](auto RunnerFunc) - void {if (GPUBufferReadback-IsReady()) {int32* Buffer (int32*)GPUBufferReadback-Lock(1);int OutVal Buffer[0];GPUBufferReadback-Unlock();AsyncTask(ENamedThreads::GameThread, [AsyncCallback, OutVal]() {AsyncCallback(OutVal);});delete GPUBufferReadback;} else {AsyncTask(ENamedThreads::ActualRenderingThread, [RunnerFunc]() {RunnerFunc(RunnerFunc);});}};AsyncTask(ENamedThreads::ActualRenderingThread, [RunnerFunc]() {RunnerFunc(RunnerFunc);});} else {// We silently exit here as we dont want to crash the game if the shader is not found or has an error.}}GraphBuilder.Execute(); } MySimpleComputeShader.h #pragma once#include CoreMinimal.h #include GenericPlatform/GenericPlatformMisc.h #include Kismet/BlueprintAsyncActionBase.h#include MySimpleComputeShader.generated.hstruct CS_TEST_API FMySimpleComputeShaderDispatchParams {int X;int Y;int Z;int Input[2];int Output;FMySimpleComputeShaderDispatchParams(int x, int y, int z): X(x), Y(y), Z(z){} };// This is a public interface that we define so outside code can invoke our compute shader. class CS_TEST_API FMySimpleComputeShaderInterface { public:// Executes this shader on the render threadstatic void DispatchRenderThread(FRHICommandListImmediate RHICmdList,FMySimpleComputeShaderDispatchParams Params,TFunctionvoid(int OutputVal) AsyncCallback);// Executes this shader on the render thread from the game thread via EnqueueRenderThreadCommandstatic void DispatchGameThread(FMySimpleComputeShaderDispatchParams Params,TFunctionvoid(int OutputVal) AsyncCallback){ENQUEUE_RENDER_COMMAND(SceneDrawCompletion)([Params, AsyncCallback](FRHICommandListImmediate RHICmdList){DispatchRenderThread(RHICmdList, Params, AsyncCallback);});}// Dispatches this shader. Can be called from any threadstatic void Dispatch(FMySimpleComputeShaderDispatchParams Params,TFunctionvoid(int OutputVal) AsyncCallback){if (IsInRenderingThread()) {DispatchRenderThread(GetImmediateCommandList_ForRenderCommand(), Params, AsyncCallback);}else{DispatchGameThread(Params, AsyncCallback);}} };DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMySimpleComputeShaderLibrary_AsyncExecutionCompleted, const int, Value);UCLASS() // Change the _API to match your project class CS_TEST_API UMySimpleComputeShaderLibrary_AsyncExecution : public UBlueprintAsyncActionBase {GENERATED_BODY()public:// Execute the actual loadvirtual void Activate() override {// Create a dispatch parameters struct and fill it the input array with our argsFMySimpleComputeShaderDispatchParams Params(1, 1, 1);Params.Input[0] Arg1;Params.Input[1] Arg2;// Dispatch the compute shader and wait until it completesFMySimpleComputeShaderInterface::Dispatch(Params, [this](int OutputVal) {this-Completed.Broadcast(OutputVal);});}UFUNCTION(BlueprintCallable, meta (BlueprintInternalUseOnly true, Category ComputeShader, WorldContext WorldContextObject))static UMySimpleComputeShaderLibrary_AsyncExecution* ExecuteBaseComputeShader(UObject* WorldContextObject, int Arg1, int Arg2) {UMySimpleComputeShaderLibrary_AsyncExecution* Action NewObjectUMySimpleComputeShaderLibrary_AsyncExecution();Action-Arg1 Arg1;Action-Arg2 Arg2;Action-RegisterWithGameInstance(WorldContextObject);return Action;}UPROPERTY(BlueprintAssignable)FOnMySimpleComputeShaderLibrary_AsyncExecutionCompleted Completed;int Arg1;int Arg2;}; 6. 着色器实现 MySimpleComputeShader.usf #include /Engine/Public/Platform.ushBufferint Input; RWBufferint Output;[numthreads(THREADS_X, THREADS_Y, THREADS_Z)] void MySimpleComputeShader(uint3 DispatchThreadId : SV_DispatchThreadID,uint GroupIndex : SV_GroupIndex ) {// Outputs one numberOutput[0] Input[0] * Input[1]; } 7. 分配 work groups 关于整个解释 https://learnopengl.com/Guest-Articles/2022/Compute-Shaders/Introduction​learnopengl.com/Guest-Articles/2022/Compute-Shaders/Introduction [numthreads(THREADS_X, THREADS_Y, THREADS_Z)] 是在HLSL中分配计算空间的语法 8. 计算和输出 9. 额外添加参数流程
http://www.pierceye.com/news/717360/

相关文章:

  • 整个网站都在下雪特效怎么做贵州省住房与城乡建设厅网站
  • 腾讯合作网站建设有哪些公司自己的网站做防伪码
  • 网站制作完成ks刷粉网站推广马上刷
  • 网站注册域名位置网上买一个商标多少钱
  • 网站开发 无形资产门户网站搭建方案
  • 湘西北京网站建设网站建设好发信息网
  • 淄博公司网站建设网站设计编程有哪些
  • 如何获取网站访客qq如何知道一个网站用什么建设的
  • 快站app客户管理软件多少钱
  • 山西教育学会的网站建设工作做ppt课件的网站
  • 网站开发还有哪些班级网站如何去建设
  • 学校网站框架wordpress 多个网址导航
  • 茶叶红酒网站建设关键词的优化方法
  • 做网站后台用什么语言好吴川市建设工程公司网站
  • 海口专业网站建设公司怎样利用网站做淘宝客
  • 雄安专业网站建设方案长沙做网站建设
  • 微信上的网站实物黄金哪个网站做的好
  • 网站建设的作用和用途wordpress外网固定链接
  • 网站做多长时间才有流量上海商城网站制作公司
  • 做电影网站服务器网站如何备案 流程图
  • 太原建站模板搭建wordpress attachment
  • 购买腾讯备案网站网站错误列表
  • 怎么查看网站的外链php网站建设流程图
  • 顺企网萍乡网站建设wordpress 读者墙
  • 电力建设期刊网站投稿域名提供商
  • 广东网站备案需要多久oa信息化管理系统平台
  • 哪个网站可以做担保交易小程序排行榜
  • 网站用html做的怎么弄后台中铁十六局个人门户网
  • 一个网站怎么做流量统计佛山市seo广告优化工具
  • 机关网站建设需求文档国家住建部官网