History

Basic splatting.

Andrzej Kapolka committed 12 years ago

Commit 72500631 parent 416d9ba6 files · +138 −39Browse files

Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 6 files). Show all

Unified · Split

interface/src/MetavoxelSystem.cpp+58−5
@@ -673,13 +673,17 @@ public: · 672 unmodified lines
673673 glm::vec3 vertex;
674674 };
675675
676+const int SPLAT_COUNT = 4;
677+const GLint SPLAT_TEXTURE_UNITS[] = { 3, 4, 5, 6 };
678+
676679 void HeightfieldBuffer::render(bool cursor) {
677680 // initialize textures, etc. on first render
678681 if (_heightTextureID == 0) {
679682 glGenTextures(1, &_heightTextureID);
680683 glBindTexture(GL_TEXTURE_2D, _heightTextureID);
681684 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
682− glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
685+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
686+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
683687 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
684688 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
685689 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, _heightSize, _heightSize, 0,
@@ -702,7 +706,8 @@ void HeightfieldBuffer::render(bool cursor) { · 16 unmodified lines
702706 if (!_texture.isEmpty()) {
703707 glGenTextures(1, &_textureTextureID);
704708 glBindTexture(GL_TEXTURE_2D, _textureTextureID);
705− glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
709+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
710+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
706711 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
707712 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
708713 int textureSize = glm::sqrt(_texture.size());
@@ -800,11 +805,53 @@ void HeightfieldBuffer::render(bool cursor) { · 91 unmodified lines
800805 glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
801806
802807 glDepthFunc(GL_LEQUAL);
808+ glDepthMask(false);
803809 glEnable(GL_BLEND);
804− glBlendFunc(GL_DST_COLOR, GL_ZERO);
810+ glDisable(GL_ALPHA_TEST);
805811 glEnable(GL_POLYGON_OFFSET_FILL);
806812 glPolygonOffset(-1.0f, -1.0f);
813+
814+ DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().bind();
815+ DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
816+ DefaultMetavoxelRendererImplementation::getSplatHeightScaleLocation(), 1.0f / _heightSize);
817+ DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
818+ DefaultMetavoxelRendererImplementation::getSplatTextureScaleLocation(), (float)_heightSize / innerSize);
819+
820+ glBindTexture(GL_TEXTURE_2D, _textureTextureID);
821+
822+ const int TEXTURES_PER_SPLAT = 4;
823+ for (int i = 0; i < _textures.size(); i += TEXTURES_PER_SPLAT) {
824+ for (int j = 0; j < SPLAT_COUNT; j++) {
825+ glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[j]);
826+ int index = i + j;
827+ if (index < _networkTextures.size()) {
828+ const NetworkTexturePointer& texture = _networkTextures.at(index);
829+ glBindTexture(GL_TEXTURE_2D, texture ? texture->getID() : 0);
830+ } else {
831+ glBindTexture(GL_TEXTURE_2D, 0);
832+ }
833+ }
834+ const float QUARTER_STEP = 0.25f * EIGHT_BIT_MAXIMUM_RECIPROCAL;
835+ DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
836+ DefaultMetavoxelRendererImplementation::getSplatTextureValueMinimaLocation(),
837+ (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP,
838+ (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL - QUARTER_STEP);
839+ DefaultMetavoxelRendererImplementation::getSplatHeightfieldProgram().setUniformValue(
840+ DefaultMetavoxelRendererImplementation::getSplatTextureValueMaximaLocation(),
841+ (i + 1) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 2) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP,
842+ (i + 3) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP, (i + 4) * EIGHT_BIT_MAXIMUM_RECIPROCAL + QUARTER_STEP);
843+ glDrawRangeElements(GL_TRIANGLES, 0, vertexCount - 1, indexCount, GL_UNSIGNED_INT, 0);
844+ }
845+
846+ glEnable(GL_ALPHA_TEST);
847+ glBlendFunc(GL_DST_COLOR, GL_ZERO);
848+
849+ for (int i = 0; i < SPLAT_COUNT; i++) {
850+ glActiveTexture(GL_TEXTURE0 + SPLAT_TEXTURE_UNITS[i]);
851+ glBindTexture(GL_TEXTURE_2D, 0);
852+ }
807853
854+ glActiveTexture(GL_TEXTURE1);
808855 glBindTexture(GL_TEXTURE_2D, 0);
809856
810857 if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) {
@@ -831,7 +878,8 @@ void HeightfieldBuffer::render(bool cursor) { · 20 unmodified lines
831878 glDisable(GL_BLEND);
832879 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE);
833880 glDepthFunc(GL_LESS);
834−
881+ glDepthMask(true);
882+
835883 glActiveTexture(GL_TEXTURE0);
836884
837885 } else {
@@ -992,9 +1040,12 @@ void DefaultMetavoxelRendererImplementation::init() { · 154 unmodified lines
9921040
9931041 _splatHeightfieldProgram.bind();
9941042 _splatHeightfieldProgram.setUniformValue("heightMap", 0);
995− _splatHeightfieldProgram.setUniformValue("diffuseMap", 1);
1043+ _splatHeightfieldProgram.setUniformValue("textureMap", 1);
1044+ _splatHeightfieldProgram.setUniformValueArray("diffuseMaps", SPLAT_TEXTURE_UNITS, SPLAT_COUNT);
9961045 _splatHeightScaleLocation = _splatHeightfieldProgram.uniformLocation("heightScale");
9971046 _splatTextureScaleLocation = _splatHeightfieldProgram.uniformLocation("textureScale");
1047+ _splatTextureValueMinimaLocation = _splatHeightfieldProgram.uniformLocation("textureValueMinima");
1048+ _splatTextureValueMaximaLocation = _splatHeightfieldProgram.uniformLocation("textureValueMaxima");
9981049 _splatHeightfieldProgram.release();
9991050
10001051 _lightHeightfieldProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() +
@@ -1638,6 +1689,8 @@ int DefaultMetavoxelRendererImplementation::_baseColorScaleLocation; · 637 unmodified lines
16381689 ProgramObject DefaultMetavoxelRendererImplementation::_splatHeightfieldProgram;
16391690 int DefaultMetavoxelRendererImplementation::_splatHeightScaleLocation;
16401691 int DefaultMetavoxelRendererImplementation::_splatTextureScaleLocation;
1692+int DefaultMetavoxelRendererImplementation::_splatTextureValueMinimaLocation;
1693+int DefaultMetavoxelRendererImplementation::_splatTextureValueMaximaLocation;
16411694 ProgramObject DefaultMetavoxelRendererImplementation::_lightHeightfieldProgram;
16421695 int DefaultMetavoxelRendererImplementation::_lightHeightScaleLocation;
16431696 ProgramObject DefaultMetavoxelRendererImplementation::_shadowLightHeightfieldProgram;