transient buffer is not coherently mapped - renderdoc is way too slow with coherent buffers

This commit is contained in:
Mikulas Florek 2018-11-25 13:47:18 +01:00
parent 0e4bd3ab41
commit 4f4b3fe33e
27 changed files with 79 additions and 108 deletions

View file

@ -39,8 +39,8 @@ fragment_shader [[
in vec3 v_pos;
in vec4 v_rot;
uniform sampler2D u_gbuffer_depth;
uniform sampler2D u_texture;
layout (binding=0) uniform sampler2D u_gbuffer_depth;
layout (binding=1) uniform sampler2D u_texture;
void main()
{

View file

@ -17,11 +17,11 @@ vertex_shader [[
fragment_shader [[
in vec2 v_uv;
out vec4 o_color;
uniform sampler2D u_gbuffer0;
uniform sampler2D u_gbuffer1;
uniform sampler2D u_gbuffer2;
uniform sampler2D u_gbuffer_depth;
uniform sampler2D u_shadowmap;
layout (binding=0) uniform sampler2D u_gbuffer0;
layout (binding=1) uniform sampler2D u_gbuffer1;
layout (binding=2) uniform sampler2D u_gbuffer2;
layout (binding=3) uniform sampler2D u_gbuffer_depth;
layout (binding=4) uniform sampler2D u_shadowmap;
void main()
{

View file

@ -18,7 +18,7 @@ vertex_shader [[
fragment_shader [[
uniform sampler2D u_texture;
layout (binding=0) uniform sampler2D u_texture;
in vec4 v_color;
in vec2 v_uv;
out vec4 o_color;

View file

@ -1,6 +1,5 @@
texture_slot {
name = "Albedo",
uniform = "u_albedomap",
default_texture = "textures/common/white.tga"
}
@ -24,7 +23,7 @@ vertex_shader [[
---------------------
fragment_shader [[
uniform sampler2D u_albedomap;
layout (binding=0) uniform sampler2D u_albedomap;
in vec2 v_uv;
in vec3 v_normal;

View file

@ -21,11 +21,11 @@ fragment_shader [[
in vec3 v_uv;
out vec4 o_color;
uniform sampler2D u_gbuffer0;
uniform sampler2D u_gbuffer1;
uniform sampler2D u_gbuffer2;
uniform sampler2D u_gbuffer_depth;
uniform sampler2D u_shadowmap;
layout (binding=0) uniform sampler2D u_gbuffer0;
layout (binding=1) uniform sampler2D u_gbuffer1;
layout (binding=2) uniform sampler2D u_gbuffer2;
layout (binding=3) uniform sampler2D u_gbuffer_depth;
layout (binding=4) uniform sampler2D u_shadowmap;
uniform vec4 u_pos_radius;
void main()

View file

@ -101,7 +101,7 @@ fragment_shader [[
return in_color + noise * grainamount;
}
uniform sampler2D u_source;
layout (binding=0) uniform sampler2D u_source;
in vec2 v_uv;
out vec4 o_color;
void main() {

View file

@ -711,7 +711,7 @@ fragment_shader [[
return FxaaTexTop(tex, posM);
}
uniform sampler2D u_fxaa_buffer;
layout (binding=0) uniform sampler2D u_fxaa_buffer;
in vec2 v_uv;
out vec4 o_color;

View file

@ -50,10 +50,10 @@ fragment_shader [[
in vec3 v_dir;
in float v_fov;
uniform sampler2D u_gbuffer0;
uniform sampler2D u_gbuffer1;
uniform sampler2D u_gbuffer2;
uniform sampler2D u_gbuffer_depth;
layout (binding=0) uniform sampler2D u_gbuffer0;
layout (binding=1) uniform sampler2D u_gbuffer1;
layout (binding=2) uniform sampler2D u_gbuffer2;
layout (binding=3) uniform sampler2D u_gbuffer_depth;
void main()
{

View file

@ -13,7 +13,7 @@ vertex_shader [[
fragment_shader [[
uniform sampler2D u_mask;
layout (binding=0) uniform sampler2D u_mask;
in vec2 v_uv;
layout(location = 0) out vec4 o_color;

View file

@ -1,24 +1,20 @@
texture_slot {
name = "Albedo",
uniform = "u_albedomap",
default_texture = "textures/common/white.tga"
}
texture_slot {
name = "Normal",
uniform = "u_normalmap",
default_texture = "textures/common/default_normal.tga"
}
texture_slot {
name = "Roughness",
uniform = "u_roughnessmap",
default_texture = "textures/common/white.tga"
}
texture_slot {
name = "Metallic",
uniform = "u_metallicmap",
default_texture = "textures/common/white.tga"
}
@ -82,11 +78,11 @@ vertex_shader [[
---------------------
fragment_shader [[
uniform sampler2D u_albedomap;
uniform sampler2D u_normalmap;
uniform sampler2D u_roughnessmap;
uniform sampler2D u_metallicmap;
uniform sampler2D u_shadowmap;
layout (binding=0) uniform sampler2D u_albedomap;
layout (binding=1) uniform sampler2D u_normalmap;
layout (binding=2) uniform sampler2D u_roughnessmap;
layout (binding=3) uniform sampler2D u_metallicmap;
layout (binding=4) uniform sampler2D u_shadowmap;
uniform vec4 u_material_params;
uniform vec4 u_material_color;
in vec2 v_uv;

View file

@ -2,19 +2,16 @@ include "pipelines/common.glsl"
texture_slot {
name = "Heightmap",
uniform = "u_hm",
default_texture = "textures/common/white.tga"
}
texture_slot {
name = "Albedo",
uniform = "u_albedo",
default_texture = "textures/common/white.tga"
}
texture_slot {
name = "Splatmap",
uniform = "u_splatmap",
default_texture = "textures/common/white.tga"
}
@ -28,6 +25,11 @@ vertex_shader [[
]]
common [[
const float hscale = 32;
]]
geometry_shader [[
layout (points) in;
layout (triangle_strip, max_vertices = 4) out;
@ -41,8 +43,6 @@ geometry_shader [[
uniform ivec4 u_from_to;
uniform ivec4 u_from_to_sup;
const float hscale = 128;
void getVertex(ivec2 ij, out vec3 pos)
{
pos = vec3(ij.x, 0.0, ij.y) * (1 << u_lod);
@ -109,11 +109,9 @@ fragment_shader [[
in vec2 v_uv;
layout(binding = 0) uniform sampler2D u_hm;
layout(binding = 1) uniform samplerArray u_albedo;
layout(binding = 1) uniform sampler2DArray u_albedo;
uniform int u_lod;
const float hscale = 128;
vec3 getNormal(vec2 uv)
{
vec3 off = vec3(-1.0/2048.0, 0, 1.0/2048.0);
@ -129,10 +127,7 @@ fragment_shader [[
void getData()
{
data.normal = getNormal(v_uv);
data.albedo = texture(u_albedo, v_uv);
#ifdef ALPHA_CUTOUT
if(data.albedo.a < 0.5) discard;
#endif
data.albedo = texture(u_albedo, vec3(v_uv, 0));
data.wpos = vec3(0);
data.roughness = 0.9;
data.metallic = 0;

View file

@ -26,7 +26,7 @@ vertex_shader [[
fragment_shader [[
uniform sampler2D u_texture;
layout (binding=0) uniform sampler2D u_texture;
in vec4 v_color;
in vec2 v_uv;
layout(location = 0) out vec4 o_color;

View file

@ -11,7 +11,7 @@ vertex_shader [[
fragment_shader [[
uniform sampler2D u_texture;
layout (binding=0) uniform sampler2D u_texture;
in vec2 v_uv;
out vec4 o_color;
void main() {

View file

@ -37,7 +37,7 @@ fragment_shader [[
return (in_color / max(0.00001, lum)) * ld;
}
uniform sampler2D u_hdrbuffer;
layout (binding=0) uniform sampler2D u_hdrbuffer;
in vec2 v_uv;
out vec4 o_color;
void main() {

View file

@ -1523,21 +1523,11 @@ struct ShaderPlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
ImGui::CollapsingHeader(
"Texture slots", nullptr, ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed))
{
ImGui::Columns(2);
ImGui::Text("name");
ImGui::NextColumn();
ImGui::Text("uniform");
ImGui::NextColumn();
ImGui::Separator();
for (int i = 0; i < shader->m_texture_slot_count; ++i)
{
auto& slot = shader->m_texture_slots[i];
ImGui::Text("%s", slot.name);
ImGui::NextColumn();
ImGui::Text("%s", slot.uniform);
ImGui::NextColumn();
}
ImGui::Columns(1);
}
if (!shader->m_uniforms.empty() &&
ImGui::CollapsingHeader("Uniforms", nullptr, ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed))

View file

@ -335,6 +335,8 @@ void SceneView::renderGizmos()
memcpy(ib.ptr, indices, ib.size);
memcpy(vb.ptr, vertices, vb.size);
ffr::flushBuffer(ib.buffer, ib.offset, ib.size);
ffr::flushBuffer(vb.buffer, vb.offset, vb.size);
ffr::setUniformMatrix4f(model_uniform, &cmd.mtx.m11);
ffr::useProgram(prg);

View file

@ -36,10 +36,10 @@ namespace Lumix
static const ComponentType MODEL_INSTANCE_TYPE = Reflection::getComponentType("model_instance");
static const ComponentType TERRAIN_TYPE = Reflection::getComponentType("terrain");
static const ComponentType HEIGHTFIELD_TYPE = Reflection::getComponentType("physical_heightfield");
static const char* HEIGHTMAP_UNIFORM = "u_heightmap";
static const char* SPLATMAP_UNIFORM = "u_splatmap";
static const char* COLORMAP_UNIFORM = "u_colormap";
static const char* TEX_COLOR_UNIFORM = "u_detail_albedomap";
static const char* HEIGHTMAP_SLOT_NAME = "Heightmap";
static const char* SPLATMAP_SLOT_NAME = "Splatmap";
static const char* DETAIL_ALBEDO_SLOT_NAME = "Albedo";
static const char* SATELLITE_SLOT_NAME = "Satellite";
static const float MIN_BRUSH_SIZE = 0.5f;
@ -250,17 +250,17 @@ private:
case TerrainEditor::REMOVE_GRASS:
case TerrainEditor::ADD_GRASS:
case TerrainEditor::LAYER:
uniform_name = SPLATMAP_UNIFORM;
uniform_name = SPLATMAP_SLOT_NAME;
break;
case TerrainEditor::COLOR:
uniform_name = COLORMAP_UNIFORM;
uniform_name = SATELLITE_SLOT_NAME;
break;
default:
uniform_name = HEIGHTMAP_UNIFORM;
uniform_name = HEIGHTMAP_SLOT_NAME;
break;
}
return getMaterial()->getTextureByUniform(uniform_name);
return getMaterial()->getTextureByName(uniform_name);
}
@ -784,14 +784,14 @@ void TerrainEditor::splitSplatmap(const char* dir)
g_log_error.log("Renderer") << "Terrain has no material";
return;
}
Texture* splatmap = material->getTextureByUniform("u_texSplatmap");
Texture* splatmap = material->getTextureByName("Splatmap");
if (!splatmap)
{
g_log_error.log("Renderer") << "Terrain's material has no splatmap";
return;
}
Texture* diffuse = material->getTextureByUniform("u_texColor");
Texture* diffuse = material->getTextureByName("Albedo");
if (!diffuse)
{
g_log_error.log("Renderer") << "Terrain's material has no diffuse texture";
@ -858,7 +858,7 @@ void TerrainEditor::mergeSplatmap(const char* dir)
g_log_error.log("Renderer") << "Terrain has no material";
return;
}
Texture* splatmap = material->getTextureByUniform("u_texSplatmap");
Texture* splatmap = material->getTextureByName("Splatmap");
if (!splatmap)
{
g_log_error.log("Renderer") << "Terrain's material has no splatmap";
@ -975,7 +975,7 @@ void TerrainEditor::nextTerrainTexture()
{
Material* material = getMaterial();
if (!material) return;
Texture* tex = material->getTextureByUniform(TEX_COLOR_UNIFORM);
Texture* tex = material->getTextureByName(DETAIL_ALBEDO_SLOT_NAME);
if (tex) m_texture_idx = Math::minimum(tex->layers - 1, m_texture_idx + 1);
}
@ -1106,7 +1106,7 @@ Vec3 TerrainEditor::getRelativePosition(const Vec3& world_pos) const
Texture* TerrainEditor::getHeightmap()
{
return getMaterial()->getTextureByUniform(HEIGHTMAP_UNIFORM);
return getMaterial()->getTextureByName(HEIGHTMAP_SLOT_NAME);
}
@ -1531,16 +1531,16 @@ void TerrainEditor::onGUI()
{
case HEIGHT:
if (ImGui::Button("Save heightmap"))
getMaterial()->getTextureByUniform(HEIGHTMAP_UNIFORM)->save();
getMaterial()->getTextureByName(HEIGHTMAP_SLOT_NAME)->save();
break;
case GRASS:
case LAYER:
if (ImGui::Button("Save layermap and grassmap"))
getMaterial()->getTextureByUniform(SPLATMAP_UNIFORM)->save();
getMaterial()->getTextureByName(SPLATMAP_SLOT_NAME)->save();
break;
case COLOR:
if (ImGui::Button("Save colormap"))
getMaterial()->getTextureByUniform(COLORMAP_UNIFORM)->save();
getMaterial()->getTextureByName(SATELLITE_SLOT_NAME)->save();
break;
case ENTITY: break;
}
@ -1651,7 +1651,7 @@ void TerrainEditor::onGUI()
case LAYER:
{
m_action_type = TerrainEditor::LAYER;
Texture* tex = getMaterial()->getTextureByUniform(TEX_COLOR_UNIFORM);
Texture* tex = getMaterial()->getTextureByName(DETAIL_ALBEDO_SLOT_NAME);
if (tex)
{
for (int i = 0; i < tex->layers; ++i)

View file

@ -1198,6 +1198,14 @@ void bindUniformBuffer(uint index, BufferHandle buffer, size_t offset, size_t si
}
void flushBuffer(BufferHandle buffer, size_t offset, size_t len)
{
checkThread();
const GLuint buf = g_ffr.buffers[buffer.value].handle;
glFlushMappedNamedBufferRange(buf, offset, len);
}
void* map(BufferHandle buffer, size_t offset, size_t size, uint flags)
{
checkThread();

View file

@ -237,6 +237,7 @@ void bindLayer(FramebufferHandle fb, TextureHandle rb, uint layer);
void update(BufferHandle buffer, const void* data, size_t offset, size_t size);
void* map(BufferHandle buffer, size_t offset, size_t size, uint flags);
void unmap(BufferHandle buffer);
void flushBuffer(BufferHandle buffer, size_t offset, size_t len);
void bindUniformBuffer(uint index, BufferHandle buffer, size_t offset, size_t size);
void getTextureImage(ffr::TextureHandle texture, uint size, void* buf);
TextureInfo getTextureInfo(const void* data);

View file

@ -50,6 +50,7 @@ FFR_GL_IMPORT(PFNGLDRAWARRAYSINSTANCEDARBPROC, glDrawArraysInstanced);
FFR_GL_IMPORT(PFNGLDRAWBUFFERSPROC, glDrawBuffers);
FFR_GL_IMPORT(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
FFR_GL_IMPORT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
FFR_GL_IMPORT(PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC, glFlushMappedNamedBufferRange);
FFR_GL_IMPORT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
FFR_GL_IMPORT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
FFR_GL_IMPORT(PFNGLGENERATEMIPMAPPROC, glGenerateMipmap);

View file

@ -507,19 +507,12 @@ void Material::setShader(Shader* shader)
}
ffr::UniformHandle Material::getTextureUniform(int i) const
{
if (i < m_shader->m_texture_slot_count) return m_shader->m_texture_slots[i].uniform_handle;
return ffr::INVALID_UNIFORM;
}
Texture* Material::getTextureByUniform(const char* uniform) const
Texture* Material::getTextureByName(const char* name) const
{
if (!m_shader) return nullptr;
for (int i = 0, c = m_shader->m_texture_slot_count; i < c; ++i) {
if (equalStrings(m_shader->m_texture_slots[i].uniform, uniform)) {
if (equalStrings(m_shader->m_texture_slots[i].name, name)) {
return m_textures[i];
}
}

View file

@ -87,8 +87,7 @@ public:
int getTextureCount() const { return m_texture_count; }
Texture* getTexture(int i) const { return i < m_texture_count ? m_textures[i] : nullptr; }
ffr::UniformHandle getTextureUniform(int i) const;
Texture* getTextureByUniform(const char* uniform) const;
Texture* getTextureByName(const char* name) const;
bool isTextureDefine(u8 define_idx) const;
void setTexture(int i, Texture* texture);
void setTexturePath(int i, const Path& path);

View file

@ -581,6 +581,7 @@ struct PipelineImpl final : Pipeline
const Renderer::TransientSlice vb = pipeline->m_renderer.allocTransient(vertices.byte_size());
memcpy(vb.ptr, vertices.begin(), vb.size);
ffr::flushBuffer(vb.buffer, vb.offset, vb.size);
ffr::setVertexBuffer(&vertex_decl, vb.buffer, vb.offset, nullptr);
ffr::setIndexBuffer(ffr::INVALID_BUFFER);
@ -936,6 +937,7 @@ struct PipelineImpl final : Pipeline
const void* mem = blob.skip(byte_size);
memcpy(transient.ptr, mem, byte_size);
ffr::flushBuffer(transient.buffer, transient.offset, transient.size);
const Shader::Program& prog = Shader::getProgram(shader_data, 0);
if (prog.handle.isValid()) {
@ -1526,7 +1528,7 @@ struct PipelineImpl final : Pipeline
Renderer& renderer = m_pipeline->m_renderer;
const Renderer::TransientSlice transient = renderer.allocTransient(m_vertices.byte_size());
memcpy(transient.ptr, m_vertices.begin(), transient.size);
ffr::setUniform1i(m_texture_uniform, 0);
ffr::flushBuffer(transient.buffer, transient.offset, transient.size);
ffr::useProgram(p.handle);
ffr::VertexDecl decl;
const u64 blend_state = ffr::getBlendStateBits(ffr::BlendFactors::SRC_ALPHA, ffr::BlendFactors::ONE_MINUS_SRC_ALPHA, ffr::BlendFactors::SRC_ALPHA, ffr::BlendFactors::ONE_MINUS_SRC_ALPHA);
@ -1543,7 +1545,6 @@ struct PipelineImpl final : Pipeline
ffr::TextureHandle m_atlas;
ShaderRenderData* m_shader;
PipelineImpl* m_pipeline;
ffr::UniformHandle m_texture_uniform;
Array<TextMeshVertex> m_vertices;
};
@ -1552,7 +1553,6 @@ struct PipelineImpl final : Pipeline
RenderJob* job = LUMIX_NEW(allocator, RenderJob)(allocator);
job->m_pipeline = this;
job->m_shader = m_text_mesh_shader->m_render_data;
job->m_texture_uniform = m_text_mesh_shader->m_texture_slots[0].uniform_handle;
m_renderer.push(job);
}
@ -1613,6 +1613,8 @@ struct PipelineImpl final : Pipeline
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * instance_decl.size);
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
ffr::setInstanceBuffer(instance_decl, instance_buffer.buffer, instance_buffer.offset, 1, nullptr);
ffr::drawTrianglesInstanced(0, 36, instances_count);
}
@ -1740,9 +1742,7 @@ struct PipelineImpl final : Pipeline
for (int i = 0; i < 16; ++i) ffr::bindTexture(i, ffr::INVALID_TEXTURE);
for (int i = 0; i < material->textures_count; ++i) {
const ffr::TextureHandle handle = material->textures[i];
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
ffr::bindTexture(i, handle);
ffr::setUniform1i(uniform, i);
}
const Shader::Program& prog = Shader::getProgram(shader, instanced_mask);
@ -1763,6 +1763,7 @@ struct PipelineImpl final : Pipeline
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * sizeof(Vec4) * 2);
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
int instance_map[16];
for (uint i = 0; i < instance_decl.attributes_count; ++i) {
@ -1790,9 +1791,7 @@ struct PipelineImpl final : Pipeline
ShaderRenderData* shader = material->shader;
for (int i = 0; i < material->textures_count; ++i) {
const ffr::TextureHandle handle = material->textures[i];
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
ffr::bindTexture(i, handle);
ffr::setUniform1i(uniform, i);
}
const Shader::Program& prog = Shader::getProgram(shader, skinned_mask);
@ -1826,9 +1825,7 @@ struct PipelineImpl final : Pipeline
ShaderRenderData* shader = material->shader;
for (int i = 0; i < material->textures_count; ++i) {
const ffr::TextureHandle handle = material->textures[i];
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
ffr::bindTexture(i, handle);
ffr::setUniform1i(uniform, i);
}
const u8* instance_data = cmd;
@ -1843,6 +1840,8 @@ struct PipelineImpl final : Pipeline
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * decal_instance_decl.size);
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
ffr::setInstanceBuffer(decal_instance_decl, instance_buffer.buffer, instance_buffer.offset, 1, nullptr);
ffr::drawTrianglesInstanced(0, 36, instances_count);
++drawcalls_count;
@ -2899,7 +2898,6 @@ void Pipeline::renderModel(Model& model, const Matrix& mtx, ffr::UniformHandle m
for(int i = 0; i < textures_count; ++i) {
ffr::bindTexture(i, material->getTexture(i)->handle);
ffr::setUniform1i(material->getTextureUniform(i), i);
}
int attribute_map[16];

View file

@ -981,7 +981,6 @@ int RenderTask::task()
m_transient_buffer = ffr::allocBufferHandle();
m_transient_buffer_offset = 0;
const uint transient_flags = (uint)ffr::BufferFlags::PERSISTENT
| (uint)ffr::BufferFlags::COHERENT
| (uint)ffr::BufferFlags::MAP_WRITE;
ffr::createBuffer(m_transient_buffer, transient_flags, TRANSIENT_BUFFER_SIZE, nullptr);
m_transient_buffer_ptr = (u8*)ffr::map(m_transient_buffer, 0, TRANSIENT_BUFFER_SIZE, transient_flags);

View file

@ -270,11 +270,6 @@ int texture_slot(lua_State* L)
Shader::TextureSlot& slot = shader->m_texture_slots[shader->m_texture_slot_count];
LuaWrapper::getOptionalStringField(L, -1, "name", slot.name, lengthOf(slot.name));
if(LuaWrapper::getOptionalStringField(L, -1, "uniform", slot.uniform, lengthOf(slot.uniform))) {
slot.uniform_handle = ffr::allocUniform(slot.uniform, ffr::UniformType::INT, 1);
}
shader->m_render_data->texture_uniforms[shader->m_texture_slot_count] = slot.uniform_handle;
char tmp[MAX_PATH_LENGTH];
if(LuaWrapper::getOptionalStringField(L, -1, "default_texture", tmp, lengthOf(tmp))) {
ResourceManagerHub& manager = shader->getResourceManager().getOwner();

View file

@ -31,15 +31,11 @@ public:
TextureSlot()
{
name[0] = '\0';
uniform[0] = '\0';
define_idx = -1;
uniform_handle = ffr::INVALID_UNIFORM;
default_texture = nullptr;
}
char name[32];
char uniform[32];
ffr::UniformHandle uniform_handle;
int define_idx = -1;
Texture* default_texture = nullptr;
};
@ -125,7 +121,6 @@ struct ShaderRenderData
, common_source(allocator)
, attributes(allocator)
{}
ffr::UniformHandle texture_uniforms[Shader::MAX_TEXTURE_SLOT_COUNT];
IAllocator& allocator;
Renderer& renderer;
HashMap<u32, Shader::Program> programs;

View file

@ -674,7 +674,7 @@ void Terrain::onMaterialLoaded(Resource::State, Resource::State new_state, Resou
PROFILE_FUNCTION();
if (new_state == Resource::State::READY)
{
m_heightmap = m_material->getTextureByUniform("u_hm");
m_heightmap = m_material->getTextureByName("Heightmap");
bool is_data_ready = true;
if (m_heightmap && m_heightmap->getData() == nullptr)
{
@ -687,8 +687,8 @@ void Terrain::onMaterialLoaded(Resource::State, Resource::State new_state, Resou
m_height = m_heightmap->height;
}
m_albedomap = m_material->getTextureByUniform("u_albedo");
m_splatmap = m_material->getTextureByUniform("u_splatmap");
m_albedomap = m_material->getTextureByName("Albedo");
m_splatmap = m_material->getTextureByName("Splatmap");
/*
Texture* colormap = m_material->getTextureByUniform("u_colormap");