mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 10:17:40 +02:00
Update material binding
This commit is contained in:
parent
ddd60ded03
commit
d858d34523
3 changed files with 119 additions and 13 deletions
|
@ -20,9 +20,12 @@
|
||||||
#include <ColorUtils.h>
|
#include <ColorUtils.h>
|
||||||
|
|
||||||
#include <gpu/Resource.h>
|
#include <gpu/Resource.h>
|
||||||
|
#include <gpu/TextureTable.h>
|
||||||
|
|
||||||
class Transform;
|
class Transform;
|
||||||
|
|
||||||
|
#define USE_BINDLESS_TEXTURES 1
|
||||||
|
|
||||||
namespace graphics {
|
namespace graphics {
|
||||||
|
|
||||||
class TextureMap;
|
class TextureMap;
|
||||||
|
@ -360,6 +363,11 @@ public:
|
||||||
|
|
||||||
void setModel(const std::string& model) { _model = model; }
|
void setModel(const std::string& model) { _model = model; }
|
||||||
|
|
||||||
|
#if USE_BINDLESS_TEXTURES
|
||||||
|
const gpu::TextureTablePointer& getTextureTable() const { return _textureTable; }
|
||||||
|
void setTextureTable(const gpu::TextureTablePointer& textureTable) { _textureTable = textureTable; }
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string _name { "" };
|
std::string _name { "" };
|
||||||
|
|
||||||
|
@ -367,6 +375,9 @@ private:
|
||||||
mutable MaterialKey _key;
|
mutable MaterialKey _key;
|
||||||
mutable UniformBufferView _schemaBuffer;
|
mutable UniformBufferView _schemaBuffer;
|
||||||
mutable UniformBufferView _texMapArrayBuffer;
|
mutable UniformBufferView _texMapArrayBuffer;
|
||||||
|
#if USE_BINDLESS_TEXTURES
|
||||||
|
mutable gpu::TextureTablePointer _textureTable;
|
||||||
|
#endif
|
||||||
|
|
||||||
TextureMaps _textureMaps;
|
TextureMaps _textureMaps;
|
||||||
|
|
||||||
|
|
|
@ -54,32 +54,31 @@ TexMapArray getTexMapArray() {
|
||||||
|
|
||||||
TextureTable(0, matTex);
|
TextureTable(0, matTex);
|
||||||
<!
|
<!
|
||||||
EMISSIVE_MAP = 0,
|
ALBEDO = 0,
|
||||||
ALBEDO_MAP,
|
NORMAL, 1
|
||||||
METALLIC_MAP,
|
METALLIC, 2
|
||||||
ROUGHNESS_MAP,
|
EMISSIVE_LIGHTMAP, 3
|
||||||
NORMAL_MAP,
|
ROUGHNESS, 4
|
||||||
OCCLUSION_MAP,
|
OCCLUSION, 5
|
||||||
LIGHTMAP_MAP,
|
SCATTERING, 6
|
||||||
SCATTERING_MAP,
|
|
||||||
!>
|
!>
|
||||||
|
|
||||||
<@if withAlbedo@>
|
<@if withAlbedo@>
|
||||||
#define albedoMap 1
|
#define albedoMap 0
|
||||||
vec4 fetchAlbedoMap(vec2 uv) {
|
vec4 fetchAlbedoMap(vec2 uv) {
|
||||||
return tableTexValue(matTex, albedoMap, uv);
|
return tableTexValue(matTex, albedoMap, uv);
|
||||||
}
|
}
|
||||||
<@endif@>
|
<@endif@>
|
||||||
|
|
||||||
<@if withRoughness@>
|
<@if withRoughness@>
|
||||||
#define roughnessMap 3
|
#define roughnessMap 4
|
||||||
float fetchRoughnessMap(vec2 uv) {
|
float fetchRoughnessMap(vec2 uv) {
|
||||||
return tableTexValue(matTex, roughnessMap, uv).r;
|
return tableTexValue(matTex, roughnessMap, uv).r;
|
||||||
}
|
}
|
||||||
<@endif@>
|
<@endif@>
|
||||||
|
|
||||||
<@if withNormal@>
|
<@if withNormal@>
|
||||||
#define normalMap 4
|
#define normalMap 1
|
||||||
vec3 fetchNormalMap(vec2 uv) {
|
vec3 fetchNormalMap(vec2 uv) {
|
||||||
return tableTexValue(matTex, normalMap, uv).xyz;
|
return tableTexValue(matTex, normalMap, uv).xyz;
|
||||||
}
|
}
|
||||||
|
@ -93,7 +92,7 @@ float fetchMetallicMap(vec2 uv) {
|
||||||
<@endif@>
|
<@endif@>
|
||||||
|
|
||||||
<@if withEmissive@>
|
<@if withEmissive@>
|
||||||
#define emissiveMap 0
|
#define emissiveMap 3
|
||||||
vec3 fetchEmissiveMap(vec2 uv) {
|
vec3 fetchEmissiveMap(vec2 uv) {
|
||||||
return tableTexValue(matTex, emissiveMap, uv).rgb;
|
return tableTexValue(matTex, emissiveMap, uv).rgb;
|
||||||
}
|
}
|
||||||
|
@ -107,7 +106,7 @@ float fetchOcclusionMap(vec2 uv) {
|
||||||
<@endif@>
|
<@endif@>
|
||||||
|
|
||||||
<@if withScattering@>
|
<@if withScattering@>
|
||||||
#define scatteringMap 7
|
#define scatteringMap 6
|
||||||
float fetchScatteringMap(vec2 uv) {
|
float fetchScatteringMap(vec2 uv) {
|
||||||
float scattering = texture(tableTex(matTex, scatteringMap), uv).r; // boolean scattering for now
|
float scattering = texture(tableTex(matTex, scatteringMap), uv).r; // boolean scattering for now
|
||||||
return max(((scattering - 0.1) / 0.9), 0.0);
|
return max(((scattering - 0.1) / 0.9), 0.0);
|
||||||
|
|
|
@ -612,6 +612,21 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) {
|
||||||
#include "RenderPipelines.h"
|
#include "RenderPipelines.h"
|
||||||
#include <model-networking/TextureCache.h>
|
#include <model-networking/TextureCache.h>
|
||||||
|
|
||||||
|
#if USE_BINDLESS_TEXTURES
|
||||||
|
gpu::TextureTablePointer makeTextureTable() {
|
||||||
|
auto textureCache = DependencyManager::get<TextureCache>();
|
||||||
|
auto textureTable = std::make_shared<gpu::TextureTable>();
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::ALBEDO, textureCache->getWhiteTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::ROUGHNESS, textureCache->getWhiteTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::NORMAL, textureCache->getBlueTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::METALLIC, textureCache->getBlackTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::OCCLUSION, textureCache->getWhiteTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::SCATTERING, textureCache->getWhiteTexture());
|
||||||
|
textureTable->setTexture(ShapePipeline::Slot::EMISSIVE_LIGHTMAP, textureCache->getBlackTexture());
|
||||||
|
return textureTable;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void RenderPipelines::bindMaterial(graphics::MaterialPointer material, gpu::Batch& batch, bool enableTextures) {
|
void RenderPipelines::bindMaterial(graphics::MaterialPointer material, gpu::Batch& batch, bool enableTextures) {
|
||||||
if (!material) {
|
if (!material) {
|
||||||
return;
|
return;
|
||||||
|
@ -630,6 +645,86 @@ void RenderPipelines::bindMaterial(graphics::MaterialPointer material, gpu::Batc
|
||||||
numUnlit++;
|
numUnlit++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_BINDLESS_TEXTURES
|
||||||
|
if (!material->getTextureTable()) {
|
||||||
|
material->setTextureTable(makeTextureTable());
|
||||||
|
}
|
||||||
|
|
||||||
|
batch.setResourceTextureTable(material->getTextureTable());
|
||||||
|
if (!enableTextures) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& drawMaterialTextures = material->getTextureTable();
|
||||||
|
|
||||||
|
// Albedo
|
||||||
|
if (materialKey.isAlbedoMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::ALBEDO_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::ALBEDO, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Roughness map
|
||||||
|
if (materialKey.isRoughnessMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::ROUGHNESS_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::ROUGHNESS, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal map
|
||||||
|
if (materialKey.isNormalMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::NORMAL_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::NORMAL, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metallic map
|
||||||
|
if (materialKey.isMetallicMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::METALLIC_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::METALLIC, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Occlusion map
|
||||||
|
if (materialKey.isOcclusionMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::OCCLUSION_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::OCCLUSION, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scattering map
|
||||||
|
if (materialKey.isScatteringMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::SCATTERING_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::SCATTERING, itr->second->getTextureView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Emissive / Lightmap
|
||||||
|
if (materialKey.isLightmapMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::LIGHTMAP_MAP);
|
||||||
|
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::EMISSIVE_LIGHTMAP, itr->second->getTextureView());
|
||||||
|
} else {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::EMISSIVE_LIGHTMAP, textureCache->getGrayTexture());
|
||||||
|
}
|
||||||
|
} else if (materialKey.isEmissiveMap()) {
|
||||||
|
auto itr = textureMaps.find(graphics::MaterialKey::EMISSIVE_MAP);
|
||||||
|
if (itr != textureMaps.end() && itr->second->isDefined()) {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::EMISSIVE_LIGHTMAP, itr->second->getTextureView());
|
||||||
|
} else {
|
||||||
|
drawMaterialTextures->setTexture(ShapePipeline::Slot::EMISSIVE_LIGHTMAP, textureCache->getBlackTexture());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
if (!enableTextures) {
|
if (!enableTextures) {
|
||||||
batch.setResourceTexture(ShapePipeline::Slot::ALBEDO, textureCache->getWhiteTexture());
|
batch.setResourceTexture(ShapePipeline::Slot::ALBEDO, textureCache->getWhiteTexture());
|
||||||
batch.setResourceTexture(ShapePipeline::Slot::MAP::ROUGHNESS, textureCache->getWhiteTexture());
|
batch.setResourceTexture(ShapePipeline::Slot::MAP::ROUGHNESS, textureCache->getWhiteTexture());
|
||||||
|
@ -729,4 +824,5 @@ void RenderPipelines::bindMaterial(graphics::MaterialPointer material, gpu::Batc
|
||||||
batch.setResourceTexture(ShapePipeline::Slot::MAP::EMISSIVE_LIGHTMAP, textureCache->getBlackTexture());
|
batch.setResourceTexture(ShapePipeline::Slot::MAP::EMISSIVE_LIGHTMAP, textureCache->getBlackTexture());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue