diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-05-15 17:12:51 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-05-15 17:14:18 +0300 |
commit | e053fade993204bbfaa98ced1b056e02226a3e61 (patch) | |
tree | 3990b649fe9a0b3d73ded25f9fab47b1aeca4790 /source/blender/gpu | |
parent | ae9da3786a3ea2e62b1ece7e28628c2dbadf0605 (diff) |
Mesh Batch Cache: get rid of the ORCO VBO data, and reconstruct it in shader.
With only one MADD instruction we recover the orco data and reduce both the storage and the fetching cost of an attrib layer.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 8e97b208877..33655396d88 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -787,7 +787,11 @@ static char *code_generate_vertex_new(ListBase *nodes, const char *vert_code) if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) { /* XXX FIXME : see notes in mesh_render_data_create() */ /* NOTE : Replicate changes to mesh_render_data_create() in draw_cache_impl_mesh.c */ - if (input->attribname[0] == '\0') { + if (input->attribtype == CD_ORCO) { + /* orco is computed from local positions, see bellow */ + BLI_dynstr_appendf(ds, "uniform vec3 OrcoTexCoFactors[2];\n"); + } + else if (input->attribname[0] == '\0') { BLI_dynstr_appendf(ds, "in %s %s;\n", GPU_DATATYPE_STR[input->type], attrib_prefix_get(input->attribtype)); BLI_dynstr_appendf(ds, "#define att%d %s\n", input->attribid, attrib_prefix_get(input->attribtype)); } @@ -808,7 +812,7 @@ static char *code_generate_vertex_new(ListBase *nodes, const char *vert_code) BLI_dynstr_append(ds, "#define ATTRIB\n"); BLI_dynstr_append(ds, "uniform mat3 NormalMatrix;\n"); - BLI_dynstr_append(ds, "void pass_attrib(void) {\n"); + BLI_dynstr_append(ds, "void pass_attrib(in vec3 position) {\n"); for (node = nodes->first; node; node = node->next) { for (input = node->inputs.first; input; input = input->next) { @@ -821,6 +825,10 @@ static char *code_generate_vertex_new(ListBase *nodes, const char *vert_code) ds, "\tvar%d.w = att%d.w;\n", input->attribid, input->attribid); } + else if (input->attribtype == CD_ORCO) { + BLI_dynstr_appendf(ds, "\tvar%d = OrcoTexCoFactors[0] + position * OrcoTexCoFactors[1];\n", + input->attribid); + } else { BLI_dynstr_appendf(ds, "\tvar%d = att%d;\n", input->attribid, input->attribid); |