Add constant buffers alignment for data structures (16-byte boundaries)
This commit is contained in:
@@ -125,7 +125,7 @@ PACK_STRUCT(struct Vertex {
|
||||
Color32 Color;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Matrix ViewProjection;
|
||||
Float2 Padding;
|
||||
float ClipPosZBias;
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
// Maximum amount of thread groups per dimension for compute dispatch
|
||||
#define GPU_MAX_CS_DISPATCH_THREAD_GROUPS 65535
|
||||
|
||||
// Alignment of the shader data structures (16-byte boundaries) to improve memory copies efficiency.
|
||||
#define GPU_SHADER_DATA_ALIGNMENT 16
|
||||
|
||||
// Enable/disable assertion for graphics layers
|
||||
#define GPU_ENABLE_ASSERTION 1
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Config.h"
|
||||
#include "PixelFormat.h"
|
||||
#include "RenderView.h"
|
||||
#include "Engine/Scripting/ScriptingType.h"
|
||||
@@ -11,7 +12,7 @@ class SkinnedModel;
|
||||
struct RenderContext;
|
||||
struct FloatR10G10B10A2;
|
||||
|
||||
PACK_STRUCT(struct QuadShaderData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) QuadShaderData
|
||||
{
|
||||
Float4 Color;
|
||||
});
|
||||
|
||||
@@ -179,7 +179,7 @@ void ExponentialHeightFog::GetExponentialHeightFogData(const RenderView& view, S
|
||||
result.VolumetricFogMaxDistance = VolumetricFogDistance;
|
||||
}
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
ShaderGBufferData GBuffer;
|
||||
ShaderExponentialHeightFogData ExponentialHeightFog;
|
||||
});
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "Engine/Serialization/Serialization.h"
|
||||
#include "Engine/Level/Scene/SceneRendering.h"
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Matrix WVP;
|
||||
Float3 ViewOffset;
|
||||
float Padding;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
|
||||
|
||||
PACK_STRUCT(struct GPUParticlesData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) GPUParticlesData {
|
||||
Matrix ViewProjectionMatrix;
|
||||
Matrix InvViewProjectionMatrix;
|
||||
Matrix InvViewMatrix;
|
||||
|
||||
@@ -569,7 +569,7 @@ void DrawEmitterCPU(RenderContext& renderContext, ParticleBuffer* buffer, DrawCa
|
||||
|
||||
#if COMPILE_WITH_GPU_PARTICLES
|
||||
|
||||
PACK_STRUCT(struct GPUParticlesSortingData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) GPUParticlesSortingData {
|
||||
Float3 ViewPosition;
|
||||
uint32 ParticleCounterOffset;
|
||||
uint32 ParticleStride;
|
||||
|
||||
@@ -52,11 +52,11 @@
|
||||
// True if enable downscaling when rendering blur
|
||||
const bool DownsampleForBlur = false;
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Matrix ViewProjection;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct BlurData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) BlurData {
|
||||
Float2 InvBufferSize;
|
||||
uint32 SampleCount;
|
||||
float Dummy0;
|
||||
|
||||
@@ -19,7 +19,7 @@ class AmbientOcclusionPass : public RendererPass<AmbientOcclusionPass>
|
||||
private:
|
||||
|
||||
// Packed shader constant buffer structure (this MUST match shader code)
|
||||
PACK_STRUCT(struct ASSAOConstants {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ASSAOConstants {
|
||||
ShaderGBufferData GBuffer;
|
||||
|
||||
Float2 ViewportPixelSize;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "Engine/Graphics/Graphics.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
Float4 ScreenSize;
|
||||
});
|
||||
|
||||
@@ -15,7 +15,7 @@ class SMAA : public RendererPass<SMAA>
|
||||
{
|
||||
private:
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
Float4 RtSize;
|
||||
});
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "Engine/Renderer/GBufferPass.h"
|
||||
#include "Engine/Engine/Engine.h"
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
Float2 ScreenSizeInv;
|
||||
Float2 JitterInv;
|
||||
|
||||
@@ -61,7 +61,7 @@ protected:
|
||||
bool Run() override;
|
||||
};
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
float First;
|
||||
float AtmosphereR;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "Engine/Graphics/RenderTargetPool.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Float4 ColorSaturationShadows;
|
||||
Float4 ColorContrastShadows;
|
||||
Float4 ColorGammaShadows;
|
||||
|
||||
@@ -6,11 +6,12 @@
|
||||
#include "Engine/Core/Math/Vector2.h"
|
||||
#include "Engine/Core/Math/Vector3.h"
|
||||
#include "Engine/Core/Math/Vector4.h"
|
||||
#include "Engine/Graphics/Config.h"
|
||||
|
||||
/// <summary>
|
||||
/// Structure that contains information about GBuffer for shaders.
|
||||
/// </summary>
|
||||
PACK_STRUCT(struct ShaderGBufferData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderGBufferData
|
||||
{
|
||||
Float4 ViewInfo;
|
||||
Float4 ScreenSize;
|
||||
@@ -23,7 +24,7 @@ PACK_STRUCT(struct ShaderGBufferData
|
||||
/// <summary>
|
||||
/// Structure that contains information about exponential height fog for shaders.
|
||||
/// </summary>
|
||||
PACK_STRUCT(struct ShaderExponentialHeightFogData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderExponentialHeightFogData
|
||||
{
|
||||
Float3 FogInscatteringColor;
|
||||
float FogMinOpacity;
|
||||
@@ -48,7 +49,7 @@ PACK_STRUCT(struct ShaderExponentialHeightFogData
|
||||
/// <summary>
|
||||
/// Structure that contains information about atmosphere fog for shaders.
|
||||
/// </summary>
|
||||
PACK_STRUCT(struct ShaderAtmosphericFogData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderAtmosphericFogData
|
||||
{
|
||||
float AtmosphericFogDensityScale;
|
||||
float AtmosphericFogSunDiscScale;
|
||||
@@ -70,7 +71,7 @@ PACK_STRUCT(struct ShaderAtmosphericFogData
|
||||
/// <summary>
|
||||
/// Structure that contains information about light for shaders.
|
||||
/// </summary>
|
||||
PACK_STRUCT(struct ShaderLightData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderLightData {
|
||||
Float2 SpotAngles;
|
||||
float SourceRadius;
|
||||
float SourceLength;
|
||||
@@ -89,7 +90,7 @@ PACK_STRUCT(struct ShaderLightData {
|
||||
/// <summary>
|
||||
/// Packed env probe data
|
||||
/// </summary>
|
||||
PACK_STRUCT(struct ShaderEnvProbeData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderEnvProbeData {
|
||||
Float4 Data0; // x - Position.x, y - Position.y, z - Position.z, w - unused
|
||||
Float4 Data1; // x - Radius , y - 1 / Radius, z - Brightness, w - unused
|
||||
});
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#define DOF_GRID_SIZE 450
|
||||
#define DOF_DEPTH_BLUR_FORMAT PixelFormat::R16G16_Float
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Float2 ProjectionAB;
|
||||
float BokehDepthCullThreshold;
|
||||
float BokehDepthCutoff;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "Engine/Level/Scene/Scene.h"
|
||||
#include "Engine/Level/Actors/StaticModel.h"
|
||||
|
||||
PACK_STRUCT(struct LightmapUVsDensityMaterialShaderData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) LightmapUVsDensityMaterialShaderData {
|
||||
Matrix ViewProjectionMatrix;
|
||||
Matrix WorldMatrix;
|
||||
Rectangle LightmapArea;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
#include "Engine/Renderer/DrawCall.h"
|
||||
|
||||
PACK_STRUCT(struct VertexColorsMaterialShaderData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) VertexColorsMaterialShaderData {
|
||||
Matrix ViewProjectionMatrix;
|
||||
Matrix WorldMatrix;
|
||||
});
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "Engine/Engine/Engine.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
|
||||
PACK_STRUCT(struct EyeAdaptationData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) EyeAdaptationData {
|
||||
float MinBrightness;
|
||||
float MaxBrightness;
|
||||
float SpeedUp;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "Engine/Level/Actors/Decal.h"
|
||||
#include "Engine/Engine/Engine.h"
|
||||
|
||||
PACK_STRUCT(struct GBufferPassData{
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) GBufferPassData{
|
||||
ShaderGBufferData GBuffer;
|
||||
Float3 Dummy0;
|
||||
int32 ViewMode;
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
#define DDGI_PROBE_UPDATE_BORDERS_GROUP_SIZE 8
|
||||
#define DDGI_PROBE_CLASSIFY_GROUP_SIZE 32
|
||||
|
||||
PACK_STRUCT(struct Data0
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data0
|
||||
{
|
||||
DynamicDiffuseGlobalIlluminationPass::ConstantsData DDGI;
|
||||
GlobalSignDistanceFieldPass::ConstantsData GlobalSDF;
|
||||
@@ -54,7 +54,7 @@ PACK_STRUCT(struct Data0
|
||||
Int4 ProbeScrollClears[4];
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct Data1
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data1
|
||||
{
|
||||
// TODO: use push constants on Vulkan or root signature data on DX12 to reduce overhead of changing single DWORD
|
||||
Float2 Padding1;
|
||||
|
||||
@@ -13,7 +13,7 @@ class FLAXENGINE_API DynamicDiffuseGlobalIlluminationPass : public RendererPass<
|
||||
{
|
||||
public:
|
||||
// Constant buffer data for DDGI access on a GPU.
|
||||
PACK_STRUCT(struct ConstantsData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ConstantsData
|
||||
{
|
||||
Float4 ProbesOriginAndSpacing[4];
|
||||
Int4 ProbesScrollOffsets[4];
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#include "Engine/Debug/DebugDraw.h"
|
||||
#endif
|
||||
|
||||
PACK_STRUCT(struct Data0
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data0
|
||||
{
|
||||
Float3 ViewWorldPos;
|
||||
float ViewNearPlane;
|
||||
|
||||
@@ -11,7 +11,7 @@ class FLAXENGINE_API GlobalSurfaceAtlasPass : public RendererPass<GlobalSurfaceA
|
||||
{
|
||||
public:
|
||||
// Constant buffer data for Global Surface Atlas access on a GPU.
|
||||
PACK_STRUCT(struct ConstantsData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ConstantsData
|
||||
{
|
||||
Float3 ViewPos;
|
||||
float Padding0;
|
||||
|
||||
@@ -38,7 +38,7 @@ static_assert(GLOBAL_SDF_RASTERIZE_MODEL_MAX_COUNT % 4 == 0, "Must be multiple o
|
||||
#include "Engine/Debug/DebugDraw.h"
|
||||
#endif
|
||||
|
||||
PACK_STRUCT(struct ObjectRasterizeData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ObjectRasterizeData
|
||||
{
|
||||
Matrix3x4 WorldToVolume;
|
||||
Matrix3x4 VolumeToWorld;
|
||||
@@ -50,7 +50,7 @@ PACK_STRUCT(struct ObjectRasterizeData
|
||||
float DecodeAdd;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
Float3 ViewWorldPos;
|
||||
float ViewNearPlane;
|
||||
@@ -60,7 +60,7 @@ PACK_STRUCT(struct Data
|
||||
GlobalSignDistanceFieldPass::ConstantsData GlobalSDF;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct ModelsRasterizeData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ModelsRasterizeData
|
||||
{
|
||||
Int3 ChunkCoord;
|
||||
float MaxDistance;
|
||||
|
||||
@@ -12,7 +12,7 @@ class FLAXENGINE_API GlobalSignDistanceFieldPass : public RendererPass<GlobalSig
|
||||
{
|
||||
public:
|
||||
// Constant buffer data for Global SDF access on a GPU.
|
||||
PACK_STRUCT(struct ConstantsData
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ConstantsData
|
||||
{
|
||||
Float4 CascadePosDistance[4];
|
||||
Float4 CascadeVoxelSize;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#define THREADGROUP_SIZE_Y 16
|
||||
#define HISTOGRAM_SIZE 64
|
||||
|
||||
PACK_STRUCT(struct HistogramData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) HistogramData {
|
||||
uint32 InputSizeX;
|
||||
uint32 InputSizeY;
|
||||
float HistogramMul;
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
#include "Engine/Content/Assets/CubeTexture.h"
|
||||
#include "Engine/Content/Content.h"
|
||||
|
||||
PACK_STRUCT(struct PerLight{
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) PerLight{
|
||||
ShaderLightData Light;
|
||||
Matrix WVP;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct PerFrame{
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) PerFrame{
|
||||
ShaderGBufferData GBuffer;
|
||||
});
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
ShaderGBufferData GBuffer;
|
||||
Matrix CurrentVP;
|
||||
Matrix PreviousVP;
|
||||
|
||||
@@ -15,7 +15,7 @@ class PostProcessingPass : public RendererPass<PostProcessingPass>
|
||||
{
|
||||
private:
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
float BloomLimit;
|
||||
float BloomThreshold;
|
||||
float BloomMagnitude;
|
||||
@@ -56,7 +56,7 @@ private:
|
||||
Matrix LensFlareStarMat;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct GaussianBlurData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) GaussianBlurData {
|
||||
Float2 Size;
|
||||
float Dummy3;
|
||||
float Dummy4;
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
Float2 Dummy0;
|
||||
int32 CubeFace;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "Engine/Graphics/RenderTargetPool.h"
|
||||
#include "Engine/Level/Actors/EnvironmentProbe.h"
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
ShaderEnvProbeData PData;
|
||||
Matrix WVP;
|
||||
ShaderGBufferData GBuffer;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define TEXTURE1 5
|
||||
#define TEXTURE2 6
|
||||
|
||||
PACK_STRUCT(struct Data
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data
|
||||
{
|
||||
ShaderGBufferData GBuffer;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#define NormalOffsetScaleTweak METERS_TO_UNITS(1)
|
||||
#define LocalLightNearPlane METERS_TO_UNITS(0.1f)
|
||||
|
||||
PACK_STRUCT(struct Data{
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data{
|
||||
ShaderGBufferData GBuffer;
|
||||
ShaderLightData Light;
|
||||
Matrix WVP;
|
||||
|
||||
@@ -15,7 +15,7 @@ struct Item
|
||||
uint32 Value;
|
||||
};
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Item NullItem;
|
||||
uint32 CounterOffset;
|
||||
uint32 MaxIterations;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "Engine/Content/Content.h"
|
||||
#include "Engine/Graphics/GPUContext.h"
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
Float2 TexelSize;
|
||||
Float2 Padding;
|
||||
});
|
||||
|
||||
@@ -28,14 +28,14 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
PACK_STRUCT(struct SkyLightData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) SkyLightData {
|
||||
Float3 MultiplyColor;
|
||||
float VolumetricScatteringIntensity;
|
||||
Float3 AdditiveColor;
|
||||
float Dummy0;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct Data {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) Data {
|
||||
ShaderGBufferData GBuffer;
|
||||
|
||||
Float3 GlobalAlbedo;
|
||||
@@ -67,7 +67,7 @@ private:
|
||||
DynamicDiffuseGlobalIlluminationPass::ConstantsData DDGI;
|
||||
});
|
||||
|
||||
PACK_STRUCT(struct PerLight {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) PerLight {
|
||||
Float2 SliceToDepth;
|
||||
int32 MinZ;
|
||||
float LocalLightScatteringIntensity;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
namespace ShadowsOfMordor
|
||||
{
|
||||
PACK_STRUCT(struct ShaderData {
|
||||
PACK_STRUCT(struct alignas(GPU_SHADER_DATA_ALIGNMENT) ShaderData {
|
||||
Rectangle LightmapArea;
|
||||
Matrix WorldMatrix;
|
||||
Matrix ToTangentSpace;
|
||||
|
||||
Reference in New Issue
Block a user