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 /intern/opensubdiv | |
parent | b2f91d8acf6455717cb6eebf977466a86f6b9f39 (diff) |
OpenSubdiv: Initial support of UV maps in material shading mode
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r-- | intern/opensubdiv/gpu_shader_opensubd_display.glsl | 1 | ||||
-rw-r--r-- | intern/opensubdiv/opensubdiv_gpu_capi.cc | 39 |
2 files changed, 36 insertions, 4 deletions
diff --git a/intern/opensubdiv/gpu_shader_opensubd_display.glsl b/intern/opensubdiv/gpu_shader_opensubd_display.glsl index 3a9392e994c..cc9e05a11c8 100644 --- a/intern/opensubdiv/gpu_shader_opensubd_display.glsl +++ b/intern/opensubdiv/gpu_shader_opensubd_display.glsl @@ -99,6 +99,7 @@ in block { } uniform samplerBuffer FVarDataBuffer; +uniform isamplerBuffer FVarDataOffsetBuffer; out block { VertexData v; diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc index 60e742c8337..752dce7744c 100644 --- a/intern/opensubdiv/opensubdiv_gpu_capi.cc +++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc @@ -122,7 +122,11 @@ struct OpenSubdiv_GLMeshFVarData if (texture_buffer) { glDeleteTextures(1, &texture_buffer); } + if (offset_buffer) { + glDeleteTextures(1, &offset_buffer); + } texture_buffer = 0; + offset_buffer = 0; fvar_width = 0; channel_offsets.clear(); } @@ -140,7 +144,7 @@ struct OpenSubdiv_GLMeshFVarData const int max_level = refiner->GetMaxLevel(); const int num_channels = patch_table->GetNumFVarChannels(); std::vector<float> data; - size_t fvar_data_offset = 0; + int fvar_data_offset = 0; channel_offsets.resize(num_channels); for (int channel = 0; channel < num_channels; ++channel) { OpenSubdiv::Far::ConstIndexArray indices = @@ -173,13 +177,23 @@ struct OpenSubdiv_GLMeshFVarData glGenTextures(1, &texture_buffer); glBindTexture(GL_TEXTURE_BUFFER, texture_buffer); glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer); - glBindTexture(GL_TEXTURE_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &buffer); + + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, channel_offsets.size()*sizeof(int), + &channel_offsets[0], GL_STATIC_DRAW); + + glGenTextures(1, &offset_buffer); + glBindTexture(GL_TEXTURE_BUFFER, offset_buffer); + glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, buffer); + glBindTexture(GL_TEXTURE_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); } GLuint texture_buffer; - std::vector<size_t> channel_offsets; + GLuint offset_buffer; + std::vector<int> channel_offsets; int fvar_width; }; @@ -299,6 +313,10 @@ GLuint linkProgram(const char *version, const char *define) 0); /* GL_TEXTURE0 */ glProgramUniform1i(program, + glGetUniformLocation(program, "FVarDataOffsetBuffer"), + 30); /* GL_TEXTURE30 */ + + glProgramUniform1i(program, glGetUniformLocation(program, "FVarDataBuffer"), 31); /* GL_TEXTURE31 */ @@ -357,6 +375,12 @@ void bindProgram(OpenSubdiv_GLMesh *gl_mesh, int program) glActiveTexture(GL_TEXTURE0); } + if (gl_mesh->fvar_data->offset_buffer) { + glActiveTexture(GL_TEXTURE30); + glBindTexture(GL_TEXTURE_BUFFER, gl_mesh->fvar_data->offset_buffer); + glActiveTexture(GL_TEXTURE0); + } + glUniform1i(glGetUniformLocation(program, "osd_fvar_count"), gl_mesh->fvar_data->fvar_width); if (gl_mesh->fvar_data->channel_offsets.size() > 0 && @@ -542,6 +566,13 @@ static GLuint prepare_patchDraw(OpenSubdiv_GLMesh *gl_mesh, glActiveTexture(GL_TEXTURE0); } + if (gl_mesh->fvar_data->offset_buffer) { + glActiveTexture(GL_TEXTURE30); + glBindTexture(GL_TEXTURE_BUFFER, + gl_mesh->fvar_data->offset_buffer); + glActiveTexture(GL_TEXTURE0); + } + GLint location = glGetUniformLocation(program, "osd_fvar_count"); if (location != -1) { glUniform1i(location, gl_mesh->fvar_data->fvar_width); |