Water::Water(Loader loader) { float positions[] = { -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f }; int indices[] = { 0, 1, 3, 3, 1, 2 }; // create a ground-plane that is 2x2 meters and scale it so it becomes 100x100 meters. waterplane = loader.createModel(positions, 12, indices, 6); Mat4 scaleMatrix; scaleMatrix.loadScale(150, 1, 150); waterplane.setModelMatrix(scaleMatrix); dudvTexture = loader.loadBMPtexture("water_dudv.bmp"); normalTexture = loader.loadBMPtexture("water_nomal.bmp"); shader.createShader("waterVertexShader.glsl", "waterFragmentShader.glsl"); reflectionFrameBuffer = FrameBufferUtilities::createBuffer(); reflectionTexture = FrameBufferUtilities::createTextureAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT); reflectionDepthBuffer = FrameBufferUtilities::createDepthBufferAttachment(REFLECTION_WIDTH, REFLECTION_HEIGHT); FrameBufferUtilities::unbindCurrentBuffer(); refractionFrameBuffer = FrameBufferUtilities::createBuffer(); refractionTexture = FrameBufferUtilities::createTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT); refractionDepthTexture = FrameBufferUtilities::createDepthTextureAttachment(REFRACTION_WIDTH, REFRACTION_HEIGHT); FrameBufferUtilities::unbindCurrentBuffer(); double waterheight = 0; reflection_clip_plane = Vec4{ 0, 1, 0, -waterheight + 0.05 }; refraction_clip_plane = Vec4{ 0, -1, 0, -waterheight }; }