本文续前一篇《在Unity中使用ComputeShader》
https://blog.csdn.net/tangyin025/article/details/110876760
修改成使用URP环境下实现ComputeShader
Unity2019需要安装Package:Universal RP
安装之后,通过菜单 Asset | Create | Rendering | Universal Render Pipeline | Pipeline Asset (Forward Renderer),创建UniversalRenderPipelineAsset.asset、UniversalRenderPipelineAsset_Renderer.asset
再到菜单 Edit | Project Settings… | Graphics,设置Scriptable Render Pipeline Settings为刚才创建的asset,这样就将现有的工程修改为URP环境了
接下来准备好和上一篇一样的资源:
- Cube.prefab
- NewComputeShader.compute
- NewSurfaceShader 1.shader
- New Material 1.mat
- NewBehaviourScript1.cs
其中NewSurfaceShader 1.shader必须修改为支持URP的HLSL版本
Shader "Custom/NewSurfaceShader 1"
{
Properties
{
}
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#pragma instancing_options procedural:ConfigureProcedural
#pragma editor_sync_compilation
#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED)
StructuredBuffer<float3> _Positions;
#endif
float2 _Scale;
void ConfigureProcedural()
{
#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED)
float3 position = _Positions[unity_InstanceID];
unity_ObjectToWorld = 0.0f;
unity_ObjectToWorld._m03_m13_m23_m33 = float4(position, 1.0f);
unity_ObjectToWorld._m00_m11_m22 = _Scale.x;
unity_WorldToObject = 0.0f;
unity_WorldToObject._m03_m13_m23_m33 = float4(-position, 1.0f);
unity_WorldToObject._m00_m11_m22 = _Scale.y;
#endif
}
struct Attributes
{
float4 positionOS : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
// UNITY_VERTEX_OUTPUT_STEREO // VR、立体眼镜支持
};
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
// UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
output.positionCS = vertexInput.positionCS;
output.color = float4(saturate(vertexInput.positionWS * 0.5f + 0.5f), 1);
return output;
}
half4 frag(Varyings input) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(input);
// UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
return input.color;
}
ENDHLSL
}
}
FallBack "Diffuse"
}
修改之后,工程Reimport一下,确保没有错误。新建场景、新建Empty Object,挂载NewBehaviourScript1.cs,设置好Compute Shader、Material、Mesh等参数,就能运行了