diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-07-22 17:12:03 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-07-22 17:12:03 +0300 |
commit | 9c6387808590f8ea65f37bba17f3683c62ec0722 (patch) | |
tree | c751f3841d22fd077ded7f5e2d959ecdbbbe11c2 /source | |
parent | b2f91d8acf6455717cb6eebf977466a86f6b9f39 (diff) |
OpenSubdiv: Initial support of UV maps in material shading mode
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 18 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 4 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_geometry.glsl | 1 |
4 files changed, 17 insertions, 9 deletions
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 8ec932f4184..aec94f9f2cb 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -853,11 +853,14 @@ static char *code_generate_geometry(ListBase *nodes, bool use_opensubdiv) for (input = node->inputs.first; input; input = input->next) { if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) { if (input->attribtype == CD_MTFACE) { + /* NOTE: For now we are using varying on purpose, + * otherwise we are not able to write to the varying. + */ BLI_dynstr_appendf(ds, "%s %s var%d%s;\n", - GLEW_VERSION_3_0 ? "in" : "varying", + "varying", GPU_DATATYPE_STR[input->type], input->attribid, - GLEW_VERSION_3_0 ? "[]" : ""); + ""); BLI_dynstr_appendf(ds, "uniform int fvar%d_offset;\n", input->attribid); } @@ -872,11 +875,12 @@ static char *code_generate_geometry(ListBase *nodes, bool use_opensubdiv) for (input = node->inputs.first; input; input = input->next) { if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) { if (input->attribtype == CD_MTFACE) { - BLI_dynstr_appendf(ds, - "\t// INTERP_FACE_VARYING_2(var%d, " - "fvar%d_offset, st);\n", - input->attribid, - input->attribid); + BLI_dynstr_appendf( + ds, + "\tINTERP_FACE_VARYING_2(var%d, " + "int(texelFetch(FVarDataOffsetBuffer, fvar%d_offset).r), st);\n", + input->attribid, + input->attribid); } } } diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 98a2ceb472e..4775d2ed30a 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -2886,8 +2886,7 @@ void GPU_material_update_fvar_offset(GPUMaterial *gpu_material, "fvar%d_offset", input->attribid); location = GPU_shader_get_uniform(shader, name); - /* Multiply by 2 because we're offseting U and V variables. */ - GPU_shader_uniform_int(shader, location, layer_index * 2); + GPU_shader_uniform_int(shader, location, layer_index); } } diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 5a1b38e6be7..df1213b01e2 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -437,6 +437,10 @@ GPUShader *GPU_shader_create_ex(const char *vertexcode, /* TODO(sergey): Find a better place for this. */ if (use_opensubdiv && GLEW_VERSION_4_1) { glProgramUniform1i(shader->program, + glGetUniformLocation(shader->program, "FVarDataOffsetBuffer"), + 30); /* GL_TEXTURE30 */ + + glProgramUniform1i(shader->program, glGetUniformLocation(shader->program, "FVarDataBuffer"), 31); /* GL_TEXTURE31 */ } diff --git a/source/blender/gpu/shaders/gpu_shader_geometry.glsl b/source/blender/gpu/shaders/gpu_shader_geometry.glsl index 1663915549c..6f063883e37 100644 --- a/source/blender/gpu/shaders/gpu_shader_geometry.glsl +++ b/source/blender/gpu/shaders/gpu_shader_geometry.glsl @@ -32,6 +32,7 @@ uniform int osd_fvar_count; } uniform samplerBuffer FVarDataBuffer; +uniform isamplerBuffer FVarDataOffsetBuffer; out block { VertexData v; |