diff --git a/WickedEngine/shaders/ResourceMapping.h b/WickedEngine/shaders/ResourceMapping.h index 6a3e1e66c..33030dad4 100644 --- a/WickedEngine/shaders/ResourceMapping.h +++ b/WickedEngine/shaders/ResourceMapping.h @@ -19,27 +19,6 @@ #define TEXSLOT_BVH_PRIMITIVES 5 #define TEXSLOT_BVH_NODES 6 -#define SBSLOT_ENTITYARRAY 7 -#define SBSLOT_MATRIXARRAY 8 - -#define TEXSLOT_SHADOWARRAY_2D 12 -#define TEXSLOT_SHADOWARRAY_CUBE 13 -#define TEXSLOT_SHADOWARRAY_TRANSPARENT_2D 14 -#define TEXSLOT_SHADOWARRAY_TRANSPARENT_CUBE 15 - -#define TEXSLOT_SKYVIEWLUT 16 -#define TEXSLOT_TRANSMITTANCELUT 17 -#define TEXSLOT_MULTISCATTERINGLUT 18 -#define TEXSLOT_SKYLUMINANCELUT 19 - -#define TEXSLOT_SHEENLUT 20 -#define TEXSLOT_BLUENOISE 21 -#define TEXSLOT_RANDOM64X64 22 - -#define TEXSLOT_VOXELGI 23 - -#define TEXSLOT_FONTATLAS 29 - @@ -82,12 +61,6 @@ #define TEXSLOT_COUNT 64 -// Skinning: -#define SKINNINGSLOT_IN_VERTEX_POS TEXSLOT_ONDEMAND0 -#define SKINNINGSLOT_IN_VERTEX_TAN TEXSLOT_ONDEMAND1 -#define SKINNINGSLOT_IN_VERTEX_BON TEXSLOT_ONDEMAND2 -#define SKINNINGSLOT_IN_BONEBUFFER TEXSLOT_ONDEMAND3 - // RenderPath texture mappings: #define TEXSLOT_RENDERPATH_ENTITYTILES TEXSLOT_ONDEMAND13 #define TEXSLOT_RENDERPATH_REFLECTION TEXSLOT_ONDEMAND14 @@ -98,10 +71,5 @@ #define TEXSLOT_RENDERPATH_RTSHADOW TEXSLOT_ONDEMAND19 #define TEXSLOT_RENDERPATH_SURFELGI TEXSLOT_ONDEMAND20 -// wiImage: -#define TEXSLOT_IMAGE_BASE TEXSLOT_ONDEMAND0 -#define TEXSLOT_IMAGE_MASK TEXSLOT_ONDEMAND1 -#define TEXSLOT_IMAGE_BACKGROUND TEXSLOT_ONDEMAND2 - #endif // WI_RESOURCE_MAPPING_H diff --git a/WickedEngine/shaders/ShaderInterop_Renderer.h b/WickedEngine/shaders/ShaderInterop_Renderer.h index d8d1108b9..8bef57f44 100644 --- a/WickedEngine/shaders/ShaderInterop_Renderer.h +++ b/WickedEngine/shaders/ShaderInterop_Renderer.h @@ -812,6 +812,26 @@ struct FrameCB int ObjectShaderSamplerIndex; float BlueNoisePhase; + int texture_random64x64_index; + int texture_bluenoise_index; + int texture_sheenlut_index; + int texture_skyviewlut_index; + + int texture_transmittancelut_index; + int texture_multiscatteringlut_index; + int texture_skyluminancelut_index; + int texture_shadowarray_2d_index; + + int texture_shadowarray_cube_index; + int texture_shadowarray_transparent_2d_index; + int texture_shadowarray_transparent_cube_index; + int texture_voxelgi_index; + + int buffer_entityarray_index; + int buffer_entitymatrixarray_index; + int padding1; + int padding2; + AtmosphereParameters Atmosphere; VolumetricCloudParameters VolumetricClouds; @@ -970,5 +990,16 @@ CBUFFER(PaintRadiusCB, CBSLOT_RENDERER_MISC) uint2 pad; }; +struct SkinningPushConstants +{ + int bonebuffer_index; + int vb_pos_nor_wind; + int vb_tan; + int vb_bon; + + int so_pos_nor_wind; + int so_tan; +}; + #endif // WI_SHADERINTEROP_RENDERER_H diff --git a/WickedEngine/shaders/emittedparticle_simulateCS.hlsl b/WickedEngine/shaders/emittedparticle_simulateCS.hlsl index dd840f32e..e135ad877 100644 --- a/WickedEngine/shaders/emittedparticle_simulateCS.hlsl +++ b/WickedEngine/shaders/emittedparticle_simulateCS.hlsl @@ -31,7 +31,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) // simulate: for (uint i = 0; i < g_xFrame.ForceFieldArrayCount; ++i) { - ShaderEntity forceField = EntityArray[g_xFrame.ForceFieldArrayOffset + i]; + ShaderEntity forceField = load_entity(g_xFrame.ForceFieldArrayOffset + i); [branch] if (forceField.layerMask & xEmitterLayerMask) diff --git a/WickedEngine/shaders/forceFieldPlaneVisualizerVS.hlsl b/WickedEngine/shaders/forceFieldPlaneVisualizerVS.hlsl index 20695213a..16ef9393f 100644 --- a/WickedEngine/shaders/forceFieldPlaneVisualizerVS.hlsl +++ b/WickedEngine/shaders/forceFieldPlaneVisualizerVS.hlsl @@ -14,7 +14,7 @@ PSIn main(uint vID : SV_VERTEXID) Out.pos = float4(CreateCube(vID) * 2 - 1, 1); uint forceFieldID = g_xFrame.ForceFieldArrayOffset + (uint)g_xColor.w; - ShaderEntity forceField = EntityArray[forceFieldID]; + ShaderEntity forceField = load_entity(forceFieldID); Out.pos.xyz *= forceField.GetConeAngleCos(); // range... Out.pos.xyz += forceField.position; diff --git a/WickedEngine/shaders/forceFieldPointVisualizerVS.hlsl b/WickedEngine/shaders/forceFieldPointVisualizerVS.hlsl index 25d8f8e75..e5864b421 100644 --- a/WickedEngine/shaders/forceFieldPointVisualizerVS.hlsl +++ b/WickedEngine/shaders/forceFieldPointVisualizerVS.hlsl @@ -16,7 +16,7 @@ PSIn main(uint vID : SV_VERTEXID) uint forceFieldID = g_xFrame.ForceFieldArrayOffset + (uint)g_xColor.w; - ShaderEntity forceField = EntityArray[forceFieldID]; + ShaderEntity forceField = load_entity(forceFieldID); Out.pos.xyz *= forceField.GetConeAngleCos(); // range... Out.pos.xyz += forceField.position; diff --git a/WickedEngine/shaders/forceFieldVisualizerPS.hlsl b/WickedEngine/shaders/forceFieldVisualizerPS.hlsl index 89ab0b8c6..2cd0329ef 100644 --- a/WickedEngine/shaders/forceFieldVisualizerPS.hlsl +++ b/WickedEngine/shaders/forceFieldVisualizerPS.hlsl @@ -10,7 +10,7 @@ struct PSIn float4 main(PSIn input) : SV_TARGET { uint forceFieldID = g_xFrame.ForceFieldArrayOffset + (uint)g_xColor.w; - ShaderEntity forceField = EntityArray[forceFieldID]; + ShaderEntity forceField = load_entity(forceFieldID); float4 color = forceField.GetEnergy() < 0 ? float4(0, 0, 1, 1) : float4(1, 0, 0, 1); diff --git a/WickedEngine/shaders/globals.hlsli b/WickedEngine/shaders/globals.hlsli index 9be56feda..9c4d51442 100644 --- a/WickedEngine/shaders/globals.hlsli +++ b/WickedEngine/shaders/globals.hlsli @@ -8,10 +8,12 @@ ByteAddressBuffer bindless_buffers[] : register(space2); SamplerState bindless_samplers[] : register(space3); Buffer bindless_ib[] : register(space4); +Texture2DArray bindless_textures2DArray[] : register(space5); TextureCube bindless_cubemaps[] : register(space5); TextureCubeArray bindless_cubearrays[] : register(space6); Texture3D bindless_textures3D[] : register(space7); RWTexture2D bindless_rwtextures[] : register(space8); +RWByteAddressBuffer bindless_rwbuffers[] : register(space9); ShaderMeshInstance load_instance(uint instanceIndex) { @@ -29,29 +31,37 @@ ShaderMaterial load_material(uint materialIndex) { return bindless_buffers[g_xFrame.scene.materialbuffer].Load(materialIndex * sizeof(ShaderMaterial)); } +ShaderEntity load_entity(uint entityIndex) +{ + return bindless_buffers[g_xFrame.buffer_entityarray_index].Load(entityIndex * sizeof(ShaderEntity)); +} +float4x4 load_entitymatrix(uint matrixIndex) +{ + return transpose(bindless_buffers[g_xFrame.buffer_entitymatrixarray_index].Load(matrixIndex * sizeof(float4x4))); +} #define texture_globalenvmap bindless_cubemaps[g_xFrame.scene.globalenvmap] #define texture_envmaparray bindless_cubearrays[g_xFrame.scene.envmaparray] +#define texture_random64x64 bindless_textures[g_xFrame.texture_random64x64_index] +#define texture_bluenoise bindless_textures[g_xFrame.texture_bluenoise_index] +#define texture_sheenlut bindless_textures[g_xFrame.texture_sheenlut_index] +#define texture_skyviewlut bindless_textures[g_xFrame.texture_skyviewlut_index] +#define texture_transmittancelut bindless_textures[g_xFrame.texture_transmittancelut_index] +#define texture_multiscatteringlut bindless_textures[g_xFrame.texture_multiscatteringlut_index] +#define texture_skyluminancelut bindless_textures[g_xFrame.texture_skyluminancelut_index] +#define texture_shadowarray_2d bindless_textures2DArray[g_xFrame.texture_shadowarray_2d_index] +#define texture_shadowarray_cube bindless_cubearrays[g_xFrame.texture_shadowarray_cube_index] +#define texture_shadowarray_transparent_2d bindless_textures2DArray[g_xFrame.texture_shadowarray_transparent_2d_index] +#define texture_shadowarray_transparent_cube bindless_cubearrays[g_xFrame.texture_shadowarray_transparent_cube_index] +#define texture_voxelgi bindless_textures3D[g_xFrame.texture_voxelgi_index] + TEXTURE2D(texture_depth, float, TEXSLOT_DEPTH); TEXTURE2D(texture_lineardepth, float, TEXSLOT_LINEARDEPTH); TEXTURE2D(texture_gbuffer0, uint2, TEXSLOT_GBUFFER0); TEXTURE2D(texture_gbuffer1, float2, TEXSLOT_GBUFFER1); -TEXTURE2D(texture_skyviewlut, float4, TEXSLOT_SKYVIEWLUT); -TEXTURE2D(texture_transmittancelut, float4, TEXSLOT_TRANSMITTANCELUT); -TEXTURE2D(texture_multiscatteringlut, float4, TEXSLOT_MULTISCATTERINGLUT); -TEXTURE2D(texture_skyluminancelut, float4, TEXSLOT_SKYLUMINANCELUT); -TEXTURE2DARRAY(texture_shadowarray_2d, float, TEXSLOT_SHADOWARRAY_2D); -TEXTURECUBEARRAY(texture_shadowarray_cube, float, TEXSLOT_SHADOWARRAY_CUBE); -TEXTURE2DARRAY(texture_shadowarray_transparent_2d, float4, TEXSLOT_SHADOWARRAY_TRANSPARENT_2D); -TEXTURECUBEARRAY(texture_shadowarray_transparent_cube, float4, TEXSLOT_SHADOWARRAY_TRANSPARENT_CUBE); -TEXTURE3D(texture_voxelgi, float4, TEXSLOT_VOXELGI); -TEXTURE2D(texture_sheenlut, float, TEXSLOT_SHEENLUT); -TEXTURE2D(texture_bluenoise, float4, TEXSLOT_BLUENOISE); -TEXTURE2D(texture_random64x64, float4, TEXSLOT_RANDOM64X64); -STRUCTUREDBUFFER(EntityArray, ShaderEntity, SBSLOT_ENTITYARRAY); -STRUCTUREDBUFFER(MatrixArray, float4x4, SBSLOT_MATRIXARRAY); +// These are static samplers, don't need to be bound: SAMPLERSTATE( sampler_linear_clamp, SSLOT_LINEAR_CLAMP ); SAMPLERSTATE( sampler_linear_wrap, SSLOT_LINEAR_WRAP ); SAMPLERSTATE( sampler_linear_mirror, SSLOT_LINEAR_MIRROR ); diff --git a/WickedEngine/shaders/hairparticle_simulateCS.hlsl b/WickedEngine/shaders/hairparticle_simulateCS.hlsl index 09d844526..80a919824 100644 --- a/WickedEngine/shaders/hairparticle_simulateCS.hlsl +++ b/WickedEngine/shaders/hairparticle_simulateCS.hlsl @@ -116,7 +116,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint groupIn float3 force = 0; for (uint i = 0; i < g_xFrame.ForceFieldArrayCount; ++i) { - ShaderEntity forceField = EntityArray[g_xFrame.ForceFieldArrayOffset + i]; + ShaderEntity forceField = load_entity(g_xFrame.ForceFieldArrayOffset + i); [branch] if (forceField.layerMask & xHairLayerMask) diff --git a/WickedEngine/shaders/lightCullingCS.hlsl b/WickedEngine/shaders/lightCullingCS.hlsl index 582f05523..ecdc38a7e 100644 --- a/WickedEngine/shaders/lightCullingCS.hlsl +++ b/WickedEngine/shaders/lightCullingCS.hlsl @@ -212,7 +212,7 @@ void main(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : // Each thread will cull one entity until all entities have been culled: for (i = groupIndex; i < entityCount; i += TILED_CULLING_THREADSIZE * TILED_CULLING_THREADSIZE) { - ShaderEntity entity = EntityArray[i]; + ShaderEntity entity = load_entity(i); if (entity.GetFlags() & ENTITY_FLAG_LIGHT_STATIC) { @@ -287,7 +287,7 @@ void main(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : // frustum AABB in world space transformed into the space of the probe/decal OBB: AABB b = GroupAABB_WS; - AABBtransform(b, MatrixArray[entity.GetMatrixIndex()]); + AABBtransform(b, load_entitymatrix(entity.GetMatrixIndex())); if (IntersectAABB(a, b)) { diff --git a/WickedEngine/shaders/lightingHF.hlsli b/WickedEngine/shaders/lightingHF.hlsli index cf1fa7e1b..c823aab47 100644 --- a/WickedEngine/shaders/lightingHF.hlsli +++ b/WickedEngine/shaders/lightingHF.hlsli @@ -50,18 +50,18 @@ inline float3 shadowCascade(in ShaderEntity light, in float3 shadowPos, in float float3 shadow = 0; #ifndef DISABLE_SOFT_SHADOWMAP // sample along a rectangle pattern around center: - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, -1) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, 0) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, 1) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(0, -1) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(0, 1) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, -1) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, 0) * g_xFrame.ShadowKernel2D, slice), realDistance); - shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, 1) * g_xFrame.ShadowKernel2D, slice), realDistance); + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, -1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, 0) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(-1, 1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(0, -1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(0, 1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, -1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, 0) * g_xFrame.ShadowKernel2D, slice), realDistance).r; + shadow.x += texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV + float2(1, 1) * g_xFrame.ShadowKernel2D, slice), realDistance).r; shadow = shadow.xxx / 9.0; #else - shadow = texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV, slice), realDistance); + shadow = texture_shadowarray_2d.SampleCmpLevelZero(sampler_cmp_depth, float3(shadowUV, slice), realDistance).r; #endif // DISABLE_SOFT_SHADOWMAP #ifndef DISABLE_TRANSPARENT_SHADOWMAP @@ -89,15 +89,15 @@ inline float3 shadowCube(in ShaderEntity light, in float3 L, in float3 Lunnormal #ifndef DISABLE_SOFT_SHADOWMAP // sample along a cube pattern around center: L = -L; - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, -1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, -1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, 1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, 1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, -1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, -1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, 1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, 1, -1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L, slice), remappedDistance).r; - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, -1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, -1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, 1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); - shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, 1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance); + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, -1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, -1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(-1, 1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; + shadow += texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(L + float3(1, 1, 1) * g_xFrame.ShadowKernelCube, slice), remappedDistance).r; shadow /= 9.0; #else shadow = texture_shadowarray_cube.SampleCmpLevelZero(sampler_cmp_depth, float4(-Lunnormalized, slice), remappedDistance).r; @@ -145,7 +145,7 @@ inline void DirectionalLight(in ShaderEntity light, in Surface surface, inout Li for (uint cascade = 0; cascade < g_xFrame.ShadowCascadeCount; ++cascade) { // Project into shadow map space (no need to divide by .w because ortho projection!): - float3 ShPos = mul(MatrixArray[light.GetMatrixIndex() + cascade], float4(surface.P, 1)).xyz; + float3 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + cascade), float4(surface.P, 1)).xyz; float3 ShTex = ShPos * float3(0.5, -0.5, 0.5) + 0.5; // Determine if pixel is inside current cascade bounds and compute shadow if it is: @@ -162,7 +162,7 @@ inline void DirectionalLight(in ShaderEntity light, in Surface surface, inout Li { // Project into next shadow cascade (no need to divide by .w because ortho projection!): cascade += 1; - ShPos = mul(MatrixArray[light.GetMatrixIndex() + cascade], float4(surface.P, 1)).xyz; + ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + cascade), float4(surface.P, 1)).xyz; ShTex = ShPos * float3(0.5, -0.5, 0.5) + 0.5; const float3 shadow_fallback = shadowCascade(light, ShPos, ShTex.xy, cascade); @@ -282,7 +282,7 @@ inline void SpotLight(in ShaderEntity light, in Surface surface, inout Lighting if ((g_xFrame.Options & OPTION_BIT_RAYTRACED_SHADOWS) == 0) #endif // SHADOW_MASK_ENABLED { - float4 ShPos = mul(MatrixArray[light.GetMatrixIndex() + 0], float4(surface.P, 1)); + float4 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + 0), float4(surface.P, 1)); ShPos.xyz /= ShPos.w; float2 ShTex = ShPos.xy * float2(0.5, -0.5) + 0.5; [branch] diff --git a/WickedEngine/shaders/objectHF.hlsli b/WickedEngine/shaders/objectHF.hlsli index 5fc87abcd..7006dc6e8 100644 --- a/WickedEngine/shaders/objectHF.hlsli +++ b/WickedEngine/shaders/objectHF.hlsli @@ -452,11 +452,11 @@ inline void ForwardLighting(inout Surface surface, inout Lighting lighting) [branch] if (decalAccumulation.a < 1) { - ShaderEntity decal = EntityArray[g_xFrame.DecalArrayOffset + entity_index]; + ShaderEntity decal = load_entity(g_xFrame.DecalArrayOffset + entity_index); if ((decal.layerMask & surface.layerMask) == 0) continue; - float4x4 decalProjection = MatrixArray[decal.GetMatrixIndex()]; + float4x4 decalProjection = load_entitymatrix(decal.GetMatrixIndex()); int decalTexture = asint(decalProjection[3][0]); int decalNormal = asint(decalProjection[3][1]); decalProjection[3] = float4(0, 0, 0, 1); @@ -527,11 +527,11 @@ inline void ForwardLighting(inout Surface surface, inout Lighting lighting) [branch] if (envmapAccumulation.a < 1) { - ShaderEntity probe = EntityArray[g_xFrame.EnvProbeArrayOffset + entity_index]; + ShaderEntity probe = load_entity(g_xFrame.EnvProbeArrayOffset + entity_index); if ((probe.layerMask & surface.layerMask) == 0) continue; - const float4x4 probeProjection = MatrixArray[probe.GetMatrixIndex()]; + const float4x4 probeProjection = load_entitymatrix(probe.GetMatrixIndex()); const float3 clipSpacePos = mul(probeProjection, float4(surface.P, 1)).xyz; const float3 uvw = clipSpacePos.xyz * float3(0.5, -0.5, 0.5) + 0.5; [branch] @@ -595,7 +595,7 @@ inline void ForwardLighting(inout Surface surface, inout Lighting lighting) const uint entity_index = bucket * 32 + bucket_bit_index; bucket_bits ^= 1u << bucket_bit_index; - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + entity_index]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + entity_index); if ((light.layerMask & surface.layerMask) == 0) continue; @@ -667,11 +667,11 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting) [branch] if (entity_index >= first_item && entity_index <= last_item && decalAccumulation.a < 1) { - ShaderEntity decal = EntityArray[entity_index]; + ShaderEntity decal = load_entity(entity_index); if ((decal.layerMask & surface.layerMask) == 0) continue; - float4x4 decalProjection = MatrixArray[decal.GetMatrixIndex()]; + float4x4 decalProjection = load_entitymatrix(decal.GetMatrixIndex()); int decalTexture = asint(decalProjection[3][0]); int decalNormal = asint(decalProjection[3][1]); decalProjection[3] = float4(0, 0, 0, 1); @@ -755,11 +755,11 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting) [branch] if (entity_index >= first_item && entity_index <= last_item && envmapAccumulation.a < 1) { - ShaderEntity probe = EntityArray[entity_index]; + ShaderEntity probe = load_entity(entity_index); if ((probe.layerMask & surface.layerMask) == 0) continue; - const float4x4 probeProjection = MatrixArray[probe.GetMatrixIndex()]; + const float4x4 probeProjection = load_entitymatrix(probe.GetMatrixIndex()); const float3 clipSpacePos = mul(probeProjection, float4(surface.P, 1)).xyz; const float3 uvw = clipSpacePos.xyz * float3(0.5, -0.5, 0.5) + 0.5; [branch] @@ -841,7 +841,7 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting) [branch] if (entity_index >= first_item && entity_index <= last_item) { - ShaderEntity light = EntityArray[entity_index]; + ShaderEntity light = load_entity(entity_index); if ((light.layerMask & surface.layerMask) == 0) continue; diff --git a/WickedEngine/shaders/objectPS_voxelizer.hlsl b/WickedEngine/shaders/objectPS_voxelizer.hlsl index 8a985448d..0f41d1ea6 100644 --- a/WickedEngine/shaders/objectPS_voxelizer.hlsl +++ b/WickedEngine/shaders/objectPS_voxelizer.hlsl @@ -191,7 +191,7 @@ void main(PSInput input) const uint entity_index = bucket * 32 + bucket_bit_index; bucket_bits ^= 1u << bucket_bit_index; - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + entity_index]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + entity_index); if (light.GetFlags() & ENTITY_FLAG_LIGHT_STATIC) { @@ -214,7 +214,7 @@ void main(PSInput input) if (light.IsCastingShadow() >= 0) { const uint cascade = g_xFrame.ShadowCascadeCount - 1; // biggest cascade (coarsest resolution) will be used to voxelize - float3 ShPos = mul(MatrixArray[light.GetMatrixIndex() + cascade], float4(P, 1)).xyz; // ortho matrix, no divide by .w + float3 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + cascade), float4(P, 1)).xyz; // ortho matrix, no divide by .w float3 ShTex = ShPos.xyz * float3(0.5f, -0.5f, 0.5f) + 0.5f; [branch] if ((saturate(ShTex.x) == ShTex.x) && (saturate(ShTex.y) == ShTex.y) && (saturate(ShTex.z) == ShTex.z)) @@ -291,7 +291,7 @@ void main(PSInput input) [branch] if (light.IsCastingShadow() >= 0) { - float4 ShPos = mul(MatrixArray[light.GetMatrixIndex() + 0], float4(P, 1)); + float4 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + 0), float4(P, 1)); ShPos.xyz /= ShPos.w; float2 ShTex = ShPos.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); [branch] diff --git a/WickedEngine/shaders/raytraceCS.hlsl b/WickedEngine/shaders/raytraceCS.hlsl index 3d6b98fde..242f9773f 100644 --- a/WickedEngine/shaders/raytraceCS.hlsl +++ b/WickedEngine/shaders/raytraceCS.hlsl @@ -124,7 +124,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) [loop] for (uint iterator = 0; iterator < g_xFrame.LightArrayCount; iterator++) { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + iterator]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + iterator); Lighting lighting; lighting.create(0, 0, 0, 0); diff --git a/WickedEngine/shaders/renderlightmapPS.hlsl b/WickedEngine/shaders/renderlightmapPS.hlsl index 6644466c0..2a6f4071f 100644 --- a/WickedEngine/shaders/renderlightmapPS.hlsl +++ b/WickedEngine/shaders/renderlightmapPS.hlsl @@ -36,7 +36,7 @@ float4 main(Input input) : SV_TARGET [loop] for (uint iterator = 0; iterator < g_xFrame.LightArrayCount; iterator++) { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + iterator]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + iterator); Lighting lighting; lighting.create(0, 0, 0, 0); diff --git a/WickedEngine/shaders/rtreflectionLIB.hlsl b/WickedEngine/shaders/rtreflectionLIB.hlsl index a044f2030..9f469b42c 100644 --- a/WickedEngine/shaders/rtreflectionLIB.hlsl +++ b/WickedEngine/shaders/rtreflectionLIB.hlsl @@ -136,7 +136,7 @@ void RTReflection_ClosestHit(inout RayPayload payload, in BuiltInTriangleInterse [loop] for (uint iterator = 0; iterator < g_xFrame.LightArrayCount; iterator++) { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + iterator]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + iterator); if ((light.layerMask & surface.material.layerMask) == 0) continue; diff --git a/WickedEngine/shaders/screenspaceshadowCS.hlsl b/WickedEngine/shaders/screenspaceshadowCS.hlsl index 6144f63fd..0240b1ea8 100644 --- a/WickedEngine/shaders/screenspaceshadowCS.hlsl +++ b/WickedEngine/shaders/screenspaceshadowCS.hlsl @@ -105,7 +105,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint3 GTid : if (shadow_index >= MAX_RTSHADOWS) break; - ShaderEntity light = EntityArray[entity_index]; + ShaderEntity light = load_entity(entity_index); if (!light.IsCastingShadow()) { diff --git a/WickedEngine/shaders/skinningCS.hlsl b/WickedEngine/shaders/skinningCS.hlsl index d89f45a14..a6a6e504e 100644 --- a/WickedEngine/shaders/skinningCS.hlsl +++ b/WickedEngine/shaders/skinningCS.hlsl @@ -1,17 +1,8 @@ -#include "ResourceMapping.h" -#include "ShaderInterop_Renderer.h" +#include "globals.hlsli" -STRUCTUREDBUFFER(boneBuffer, ShaderTransform, SKINNINGSLOT_IN_BONEBUFFER); +PUSHCONSTANT(push, SkinningPushConstants); -RAWBUFFER(vertexBuffer_POS, SKINNINGSLOT_IN_VERTEX_POS); -RAWBUFFER(vertexBuffer_TAN, SKINNINGSLOT_IN_VERTEX_TAN); -RAWBUFFER(vertexBuffer_BON, SKINNINGSLOT_IN_VERTEX_BON); - -RWRAWBUFFER(streamoutBuffer_POS, 0); -RWRAWBUFFER(streamoutBuffer_TAN, 1); - - -inline void Skinning(inout float3 pos, inout float3 nor, inout float3 tan, in float4 inBon, in float4 inWei) +inline void Skinning(inout float3 pos, inout float3 nor, inout float3 tan, in uint4 inBon, in float4 inWei) { if (any(inWei)) { @@ -25,7 +16,7 @@ inline void Skinning(inout float3 pos, inout float3 nor, inout float3 tan, in fl [loop] for (uint i = 0; ((i < 4) && (weisum < 1.0f)); ++i) { - float4x4 m = boneBuffer[(uint)inBon[i]].GetMatrix(); + float4x4 m = bindless_buffers[push.bonebuffer_index].Load(inBon[i] * sizeof(ShaderTransform)).GetMatrix(); p += mul(m, float4(pos.xyz, 1)) * inWei[i]; n += mul((float3x3)m, nor.xyz) * inWei[i]; @@ -49,9 +40,9 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) const uint fetchAddress_BON = DTid.x * sizeof(uint4); // Manual type-conversion for pos: - uint4 pos_nor_u = vertexBuffer_POS.Load4(fetchAddress_POS_NOR); + uint4 pos_nor_u = bindless_buffers[push.vb_pos_nor_wind].Load4(fetchAddress_POS_NOR); float3 pos = asfloat(pos_nor_u.xyz); - uint vtan = vertexBuffer_TAN.Load(fetchAddress_TAN); + uint vtan = bindless_buffers[push.vb_tan].Load(fetchAddress_TAN); // Manual type-conversion for normal: float4 nor = 0; @@ -72,14 +63,14 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) } // Manual type-conversion for bone props: - uint4 ind_wei_u = vertexBuffer_BON.Load4(fetchAddress_BON); + uint4 ind_wei_u = bindless_buffers[push.vb_bon].Load4(fetchAddress_BON); float4 ind = 0; float4 wei = 0; { - ind.x = (float)((ind_wei_u.x >> 0) & 0x0000FFFF); - ind.y = (float)((ind_wei_u.x >> 16) & 0x0000FFFF); - ind.z = (float)((ind_wei_u.y >> 0) & 0x0000FFFF); - ind.w = (float)((ind_wei_u.y >> 16) & 0x0000FFFF); + ind.x = (ind_wei_u.x >> 0) & 0x0000FFFF; + ind.y = (ind_wei_u.x >> 16) & 0x0000FFFF; + ind.z = (ind_wei_u.y >> 0) & 0x0000FFFF; + ind.w = (ind_wei_u.y >> 16) & 0x0000FFFF; wei.x = (float)((ind_wei_u.z >> 0) & 0x0000FFFF) / 65535.0f; wei.y = (float)((ind_wei_u.z >> 16) & 0x0000FFFF) / 65535.0f; @@ -96,7 +87,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) // Manual type-conversion for pos: pos_nor_u.xyz = asuint(pos.xyz); - + // Manual type-conversion for normal: pos_nor_u.w = 0; { @@ -116,6 +107,6 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) } // Store data: - streamoutBuffer_POS.Store4(fetchAddress_POS_NOR, pos_nor_u); - streamoutBuffer_TAN.Store(fetchAddress_TAN, vtan); + bindless_rwbuffers[push.so_pos_nor_wind].Store4(fetchAddress_POS_NOR, pos_nor_u); + bindless_rwbuffers[push.so_tan].Store(fetchAddress_TAN, vtan); } diff --git a/WickedEngine/shaders/surfel_raytraceCS.hlsl b/WickedEngine/shaders/surfel_raytraceCS.hlsl index 58b57ae54..108719541 100644 --- a/WickedEngine/shaders/surfel_raytraceCS.hlsl +++ b/WickedEngine/shaders/surfel_raytraceCS.hlsl @@ -169,7 +169,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [loop] for (uint iterator = 0; iterator < g_xFrame.LightArrayCount; iterator++) { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + iterator]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + iterator); Lighting lighting; lighting.create(0, 0, 0, 0); diff --git a/WickedEngine/shaders/volumetricLight_DirectionalPS.hlsl b/WickedEngine/shaders/volumetricLight_DirectionalPS.hlsl index c39727bf3..3e4bb5065 100644 --- a/WickedEngine/shaders/volumetricLight_DirectionalPS.hlsl +++ b/WickedEngine/shaders/volumetricLight_DirectionalPS.hlsl @@ -4,7 +4,7 @@ float4 main(VertexToPixel input) : SV_TARGET { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + (uint)g_xColor.x]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + (uint)g_xColor.x); if (!light.IsCastingShadow()) { @@ -41,7 +41,7 @@ float4 main(VertexToPixel input) : SV_TARGET for (uint cascade = 0; cascade < g_xFrame.ShadowCascadeCount; ++cascade) { - float3 ShPos = mul(MatrixArray[light.GetMatrixIndex() + cascade], float4(P, 1)).xyz; // ortho matrix, no divide by .w + float3 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + cascade), float4(P, 1)).xyz; // ortho matrix, no divide by .w float3 ShTex = ShPos.xyz * float3(0.5f, -0.5f, 0.5f) + 0.5f; [branch]if (is_saturated(ShTex)) diff --git a/WickedEngine/shaders/volumetricLight_PointPS.hlsl b/WickedEngine/shaders/volumetricLight_PointPS.hlsl index d016a5237..7a95f1a37 100644 --- a/WickedEngine/shaders/volumetricLight_PointPS.hlsl +++ b/WickedEngine/shaders/volumetricLight_PointPS.hlsl @@ -4,7 +4,7 @@ float4 main(VertexToPixel input) : SV_TARGET { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + (uint)g_xColor.x]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + (uint)g_xColor.x); float2 ScreenCoord = input.pos2D.xy / input.pos2D.w * float2(0.5f, -0.5f) + 0.5f; float depth = max(input.pos.z, texture_depth.SampleLevel(sampler_point_clamp, ScreenCoord, 2)); diff --git a/WickedEngine/shaders/volumetricLight_SpotPS.hlsl b/WickedEngine/shaders/volumetricLight_SpotPS.hlsl index 28725e368..55cd2289f 100644 --- a/WickedEngine/shaders/volumetricLight_SpotPS.hlsl +++ b/WickedEngine/shaders/volumetricLight_SpotPS.hlsl @@ -4,7 +4,7 @@ float4 main(VertexToPixel input) : SV_TARGET { - ShaderEntity light = EntityArray[g_xFrame.LightArrayOffset + (uint)g_xColor.x]; + ShaderEntity light = load_entity(g_xFrame.LightArrayOffset + (uint)g_xColor.x); float2 ScreenCoord = input.pos2D.xy / input.pos2D.w * float2(0.5f, -0.5f) + 0.5f; float depth = max(input.pos.z, texture_depth.SampleLevel(sampler_point_clamp, ScreenCoord, 2)); @@ -48,7 +48,7 @@ float4 main(VertexToPixel input) : SV_TARGET [branch] if (light.IsCastingShadow()) { - float4 ShPos = mul(MatrixArray[light.GetMatrixIndex() + 0], float4(P, 1)); + float4 ShPos = mul(load_entitymatrix(light.GetMatrixIndex() + 0), float4(P, 1)); ShPos.xyz /= ShPos.w; float2 ShTex = ShPos.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); [branch] diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index b4dba529f..abde8bd87 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1801,14 +1801,14 @@ void LoadBuffers() bd.Size = sizeof(ShaderEntity) * SHADER_ENTITY_COUNT; bd.BindFlags = BIND_SHADER_RESOURCE; - bd.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; + bd.MiscFlags = RESOURCE_MISC_BUFFER_RAW; bd.Stride = sizeof(ShaderEntity); device->CreateBuffer(&bd, nullptr, &resourceBuffers[RBTYPE_ENTITYARRAY]); device->SetName(&resourceBuffers[RBTYPE_ENTITYARRAY], "EntityArray"); bd.Size = sizeof(XMMATRIX) * MATRIXARRAY_COUNT; bd.BindFlags = BIND_SHADER_RESOURCE; - bd.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; + bd.MiscFlags = RESOURCE_MISC_BUFFER_RAW; bd.Stride = sizeof(XMMATRIX); device->CreateBuffer(&bd, nullptr, &resourceBuffers[RBTYPE_MATRIXARRAY]); device->SetName(&resourceBuffers[RBTYPE_MATRIXARRAY], "MatrixArray"); @@ -3231,6 +3231,21 @@ void UpdatePerFrameData( frameCB.VolumetricClouds = vis.scene->weather.volumetricCloudParameters; frameCB.scene = vis.scene->shaderscene; + frameCB.texture_random64x64_index = device->GetDescriptorIndex(wiTextureHelper::getRandom64x64(), SRV); + frameCB.texture_bluenoise_index = device->GetDescriptorIndex(wiTextureHelper::getBlueNoise(), SRV); + frameCB.texture_sheenlut_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_SHEENLUT], SRV); + frameCB.texture_skyviewlut_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYVIEWLUT], SRV); + frameCB.texture_transmittancelut_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_SKYATMOSPHERE_TRANSMITTANCELUT], SRV); + frameCB.texture_multiscatteringlut_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_SKYATMOSPHERE_MULTISCATTEREDLUMINANCELUT], SRV); + frameCB.texture_skyluminancelut_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYLUMINANCELUT], SRV); + frameCB.texture_shadowarray_2d_index = device->GetDescriptorIndex(&shadowMapArray_2D, SRV); + frameCB.texture_shadowarray_cube_index = device->GetDescriptorIndex(&shadowMapArray_Cube, SRV); + frameCB.texture_shadowarray_transparent_2d_index = device->GetDescriptorIndex(&shadowMapArray_Transparent_2D, SRV); + frameCB.texture_shadowarray_transparent_cube_index = device->GetDescriptorIndex(&shadowMapArray_Transparent_Cube, SRV); + frameCB.texture_voxelgi_index = device->GetDescriptorIndex(GetVoxelRadianceSecondaryBounceEnabled() ? &textures[TEXTYPE_3D_VOXELRADIANCE_HELPER] : &textures[TEXTYPE_3D_VOXELRADIANCE], SRV); + frameCB.buffer_entityarray_index = device->GetDescriptorIndex(&resourceBuffers[RBTYPE_ENTITYARRAY], SRV); + frameCB.buffer_entitymatrixarray_index = device->GetDescriptorIndex(&resourceBuffers[RBTYPE_MATRIXARRAY], SRV); + // Create volumetric cloud static resources if needed: if (scene.weather.IsVolumetricClouds() && !texture_shapeNoise.IsValid()) @@ -3712,20 +3727,14 @@ void UpdateRenderData( device->BindComputeShader(&shaders[CSTYPE_SKINNING], cmd); - // Do the skinning - const GPUResource* vbs[] = { - &mesh.vertexBuffer_POS, - &mesh.vertexBuffer_TAN, - &mesh.vertexBuffer_BON, - &armature.boneBuffer, - }; - const GPUResource* uavs[] = { - &mesh.streamoutBuffer_POS, - &mesh.streamoutBuffer_TAN, - }; - - device->BindResources(vbs, SKINNINGSLOT_IN_VERTEX_POS, arraysize(vbs), cmd); - device->BindUAVs(uavs, 0, arraysize(uavs), cmd); + SkinningPushConstants push; + push.bonebuffer_index = device->GetDescriptorIndex(&armature.boneBuffer, SRV); + push.vb_pos_nor_wind = device->GetDescriptorIndex(&mesh.vertexBuffer_POS, SRV); + push.vb_tan = device->GetDescriptorIndex(&mesh.vertexBuffer_TAN, SRV); + push.vb_bon = device->GetDescriptorIndex(&mesh.vertexBuffer_BON, SRV); + push.so_pos_nor_wind = device->GetDescriptorIndex(&mesh.streamoutBuffer_POS, UAV); + push.so_tan = device->GetDescriptorIndex(&mesh.streamoutBuffer_TAN, UAV); + device->PushConstants(&push, sizeof(push), cmd); device->Dispatch(((uint32_t)mesh.vertex_positions.size() + 63) / 64, 1, 1, cmd); @@ -5781,8 +5790,6 @@ void DrawDebugWorld( device->BindPipelineState(&PSO_debug[DEBUGRENDERING_VOXEL], cmd); - device->BindResource(GetVoxelRadianceSecondaryBounceEnabled() ? &textures[TEXTYPE_3D_VOXELRADIANCE_HELPER] : &textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELGI, cmd); - MiscCB sb; XMStoreFloat4x4(&sb.g_xTransform, XMMatrixTranslationFromVector(XMLoadFloat3(&voxelSceneData.center)) * camera.GetViewProjection()); @@ -6253,7 +6260,6 @@ void RefreshEnvProbes(const Visibility& vis, CommandList cmd) { // Refresh atmospheric textures, since each probe has different positions RefreshAtmosphericScatteringTextures(cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYLUMINANCELUT], TEXSLOT_SKYLUMINANCELUT, cmd); } device->RenderPassBegin(&vis.scene->renderpasses_envmap[probe.textureIndex], cmd); @@ -7345,39 +7351,6 @@ void RefreshLightmaps(const Scene& scene, CommandList cmd) void BindCommonResources(CommandList cmd) { device->BindConstantBuffer(&constantBuffers[CBTYPE_FRAME], CBSLOT_RENDERER_FRAME, cmd); - - device->BindSampler(&samplers[SSLOT_OBJECTSHADER], SSLOT_OBJECTSHADER, cmd); - - device->BindResource(wiTextureHelper::getRandom64x64(), TEXSLOT_RANDOM64X64, cmd); - device->BindResource(wiTextureHelper::getBlueNoise(), TEXSLOT_BLUENOISE, cmd); - - device->BindResource(&textures[TEXTYPE_2D_SHEENLUT], TEXSLOT_SHEENLUT, cmd); - - // Bind the GPU entity array for all shaders that need it here: - GPUResource* resources[] = { - &resourceBuffers[RBTYPE_ENTITYARRAY], - &resourceBuffers[RBTYPE_MATRIXARRAY], - }; - device->BindResources(resources, SBSLOT_ENTITYARRAY, arraysize(resources), cmd); - device->BindResources(resources, SBSLOT_ENTITYARRAY, arraysize(resources), cmd); - device->BindResources(resources, SBSLOT_ENTITYARRAY, arraysize(resources), cmd); - - device->BindResource(&shadowMapArray_2D, TEXSLOT_SHADOWARRAY_2D, cmd); - device->BindResource(&shadowMapArray_Cube, TEXSLOT_SHADOWARRAY_CUBE, cmd); - if (GetTransparentShadowsEnabled()) - { - device->BindResource(&shadowMapArray_Transparent_2D, TEXSLOT_SHADOWARRAY_TRANSPARENT_2D, cmd); - device->BindResource(&shadowMapArray_Transparent_Cube, TEXSLOT_SHADOWARRAY_TRANSPARENT_CUBE, cmd); - } - - // Bind the atmospheric textures, as lighting and sky needs them - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYVIEWLUT], TEXSLOT_SKYVIEWLUT, cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_TRANSMITTANCELUT], TEXSLOT_TRANSMITTANCELUT, cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_MULTISCATTEREDLUMINANCELUT], TEXSLOT_MULTISCATTERINGLUT, cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYLUMINANCELUT], TEXSLOT_SKYLUMINANCELUT, cmd); - - device->BindResource(GetVoxelRadianceSecondaryBounceEnabled() ? &textures[TEXTYPE_3D_VOXELRADIANCE_HELPER] : &textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELGI, cmd); - } void UpdateCameraCB( @@ -11118,8 +11091,6 @@ void Postprocess_VolumetricClouds( device->BindResource(&texture_detailNoise, TEXSLOT_ONDEMAND2, cmd); device->BindResource(&texture_curlNoise, TEXSLOT_ONDEMAND3, cmd); device->BindResource(&texture_weatherMap, TEXSLOT_ONDEMAND4, cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_TRANSMITTANCELUT], TEXSLOT_TRANSMITTANCELUT, cmd); - device->BindResource(&textures[TEXTYPE_2D_SKYATMOSPHERE_SKYLUMINANCELUT], TEXSLOT_SKYLUMINANCELUT, cmd); const GPUResource* uavs[] = { &res.texture_cloudRender, diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index 10e6d9350..2678af4be 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -1233,7 +1233,7 @@ namespace wiScene GPUBufferDesc bd; bd.Size = sizeof(ShaderTransform) * (uint32_t)boneCollection.size(); bd.BindFlags = BIND_SHADER_RESOURCE; - bd.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; + bd.MiscFlags = RESOURCE_MISC_BUFFER_RAW; bd.Stride = sizeof(ShaderTransform); device->CreateBuffer(&bd, nullptr, &boneBuffer); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 327854662..30fcd5723 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking compatibility changes const int minor = 57; // minor bug fixes, alterations, refactors, updates - const int revision = 9; + const int revision = 10; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);