lightmapper updates

This commit is contained in:
turanszkij
2018-12-07 21:08:15 +00:00
parent d50255337b
commit 156e481a38
5 changed files with 51 additions and 42 deletions
+1
View File
@@ -426,6 +426,7 @@ ObjectWindow::ObjectWindow(wiGUI* gui) : GUI(gui)
objectcomponent->ClearLightmap();
objectcomponent->SetLightmapRenderRequest(true);
wiRenderer::InvalidateBVH();
}
}
+47 -40
View File
@@ -91,6 +91,7 @@ bool requestReflectionRendering = false;
bool advancedLightCulling = true;
bool advancedRefractions = false;
bool ldsSkinningEnabled = true;
bool scene_bvh_invalid = true;
float SPECULARAA = 0.0f;
float renderTime = 0;
float renderTime_Prev = 0;
@@ -6964,31 +6965,11 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID)
SAFE_DELETE_ARRAY(out_rects);
}
static TracedRenderingMaterial materialArray[1000] = {}; // todo realloc!
static GPUBuffer* materialBuffer = nullptr;
if (materialBuffer == nullptr)
{
GPUBufferDesc desc;
HRESULT hr;
SAFE_DELETE(materialBuffer);
materialBuffer = new GPUBuffer;
desc.BindFlags = BIND_SHADER_RESOURCE;
desc.StructureByteStride = sizeof(TracedRenderingMaterial);
desc.ByteWidth = desc.StructureByteStride * ARRAYSIZE(materialArray);
desc.CPUAccessFlags = 0;
desc.Format = FORMAT_UNKNOWN;
desc.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED;
desc.Usage = USAGE_DEFAULT;
hr = device->CreateBuffer(&desc, nullptr, materialBuffer);
assert(SUCCEEDED(hr));
}
static std::vector<TracedRenderingMaterial> materialArray;
materialArray.clear();
// Pre-gather scene properties:
uint32_t totalTriangles = 0;
uint32_t totalMaterials = 0;
for (size_t i = 0; i < scene.objects.GetCount(); ++i)
{
const ObjectComponent& object = scene.objects[i];
@@ -7003,17 +6984,19 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID)
{
const MaterialComponent& material = *scene.materials.GetComponent(subset.materialID);
TracedRenderingMaterial global_material;
// Copy base params:
materialArray[totalMaterials].baseColor = material.baseColor;
materialArray[totalMaterials].texMulAdd = material.texMulAdd;
materialArray[totalMaterials].roughness = material.roughness;
materialArray[totalMaterials].reflectance = material.reflectance;
materialArray[totalMaterials].metalness = material.metalness;
materialArray[totalMaterials].emissive = material.emissive;
materialArray[totalMaterials].refractionIndex = material.refractionIndex;
materialArray[totalMaterials].subsurfaceScattering = material.subsurfaceScattering;
materialArray[totalMaterials].normalMapStrength = material.normalMapStrength;
materialArray[totalMaterials].parallaxOcclusionMapping = material.parallaxOcclusionMapping;
global_material.baseColor = material.baseColor;
global_material.texMulAdd = material.texMulAdd;
global_material.roughness = material.roughness;
global_material.reflectance = material.reflectance;
global_material.metalness = material.metalness;
global_material.emissive = material.emissive;
global_material.refractionIndex = material.refractionIndex;
global_material.subsurfaceScattering = material.subsurfaceScattering;
global_material.normalMapStrength = material.normalMapStrength;
global_material.parallaxOcclusionMapping = material.parallaxOcclusionMapping;
// Add extended properties:
const TextureDesc& desc = atlasTexture->GetDesc();
@@ -7033,7 +7016,7 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID)
rect.y += atlasWrapBorder;
rect.w -= atlasWrapBorder * 2;
rect.h -= atlasWrapBorder * 2;
materialArray[totalMaterials].baseColorAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
global_material.baseColorAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
(float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height);
@@ -7051,7 +7034,7 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID)
rect.y += atlasWrapBorder;
rect.w -= atlasWrapBorder * 2;
rect.h -= atlasWrapBorder * 2;
materialArray[totalMaterials].surfaceMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
global_material.surfaceMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
(float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height);
@@ -7070,19 +7053,38 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID)
rect.y += atlasWrapBorder;
rect.w -= atlasWrapBorder * 2;
rect.h -= atlasWrapBorder * 2;
materialArray[totalMaterials].normalMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
global_material.normalMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height,
(float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height);
totalMaterials++;
materialArray.push_back(global_material);
}
}
}
device->UpdateBuffer(materialBuffer, materialArray, threadID, sizeof(TracedRenderingMaterial) * totalMaterials);
static GPUBuffer* materialBuffer = nullptr;
if (materialBuffer == nullptr || materialBuffer->GetDesc().ByteWidth != sizeof(TracedRenderingMaterial) * materialArray.size())
{
GPUBufferDesc desc;
HRESULT hr;
SAFE_DELETE(materialBuffer);
materialBuffer = new GPUBuffer;
desc.BindFlags = BIND_SHADER_RESOURCE;
desc.StructureByteStride = sizeof(TracedRenderingMaterial);
desc.ByteWidth = desc.StructureByteStride * (UINT)materialArray.size();
desc.CPUAccessFlags = 0;
desc.Format = FORMAT_UNKNOWN;
desc.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED;
desc.Usage = USAGE_DEFAULT;
hr = device->CreateBuffer(&desc, nullptr, materialBuffer);
assert(SUCCEEDED(hr));
}
device->UpdateBuffer(materialBuffer, materialArray.data(), threadID, sizeof(TracedRenderingMaterial) * (int)materialArray.size());
TracedSceneParams result;
result.triangleCount = totalTriangles;
result.materialCount = totalMaterials;
result.materialCount = (uint)materialArray.size();
result.materialBuffer = materialBuffer;
result.materialAtlas = atlasTexture;
@@ -7532,7 +7534,11 @@ void RenderObjectLightMap(ObjectComponent& object, bool updateBVHAndScene, GRAPH
if (updateBVHAndScene)
{
BuildSceneBVH(threadID);
if (scene_bvh_invalid)
{
scene_bvh_invalid = false;
BuildSceneBVH(threadID);
}
TracedSceneParams tracedSceneParams = PrepareTracedSceneResources(threadID);
GPUResource* res[] = {
@@ -8404,5 +8410,6 @@ void SetOceanEnabled(bool enabled)
}
}
bool GetOceanEnabled() { return ocean != nullptr; }
void InvalidateBVH() { scene_bvh_invalid = true; }
}
+1
View File
@@ -263,6 +263,7 @@ namespace wiRenderer
float GetGameSpeed();
void SetOceanEnabled(bool enabled);
bool GetOceanEnabled();
void InvalidateBVH(); // invalidates scene bvh so if something wants to use it, it will recompute and validate it
// Gets pick ray according to the current screen resolution and pointer coordinates. Can be used as input into RayIntersectWorld()
RAY GetPickRay(long cursorX, long cursorY);
+1 -1
View File
@@ -789,7 +789,7 @@ namespace wiSceneSystem
}
FORMAT ObjectComponent::GetLightmapFormat()
{
uint32_t stride = lightmapTextureData.size() / lightmapWidth / lightmapHeight;
uint32_t stride = (uint32_t)lightmapTextureData.size() / lightmapWidth / lightmapHeight;
switch (stride)
{
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates
const int minor = 24;
// minor bug fixes, alterations, refactors, updates
const int revision = 5;
const int revision = 6;
long GetVersion()