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

思维导图在线制作网站科技网站设计公司

思维导图在线制作网站,科技网站设计公司,企业宣传网站制作,国外有没有做物理小实验的网站转载#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.yutouwan.com/news/91306/

相关文章:

  • 厦门网站建设设计网站备案幕布
  • 金泉网站建设开发哪些网站可以医生做兼职
  • 公司网站的留言板怎么做网站开发编码选择一般是
  • 做网站店铺装修的软件如何建设一个博客网站
  • 网站开发找公司好还是个人阳谷聊城做网站
  • 可以建网站的公司cms影视建站系统
  • 免费的奖励网站有哪些铜山徐州网站开发
  • 便利的微网站建设vi视觉识别系统设计
  • 如何用一个域名做多个网站wordpress整合问答系统
  • 网站建设工作标准南京网站设计哪家公司好
  • 设计网站页面要多少钱网站为什么被百度k了
  • 表格做的网站影响收录天津哪家做企业网站
  • 做流程图用什么网站最近几年做电影网站怎么样
  • 云南专业做网站多少钱做网站的时候字体应该多大
  • 静态网站添加到织梦项目计划书的六大要素
  • 网站建设公司 优势代做网站推广的公司
  • 阿里巴巴网站建设教程视频长春网站推广优化
  • 东莞服饰网站建设哪家好上海网站优化推广
  • 网站首页被k 不恢复建设银行网站怎么查工资明细
  • 做网站最下面写什么做网站感觉挣不到钱啊
  • 深圳房产网站建设国外手机网站模板
  • dede网站首页加悬浮广告路桥区商用营销型网站建设
  • 一般网站建设好多久被收录vi设计模板源文件
  • 天津网站设计怎样自学开网店
  • 建设广告联盟网站让百度收入 wordpress
  • 帮中介做网站赚钱吗衡阳网站制作公司
  • 网站开发公司需要什么资质简单网页制作工具
  • 泾川网站建设电子商务网站建设包括哪些内容
  • 注册了网站之后怎么设计免费网站源码
  • 赢展网站建设访问不到自己做的网站