Render block programmatically in Drupal 8 returns 0
For display only your block in your templates with preprocess the best way is 

$block = Block::load('my_block_id');
$variables['My_region'] = \Drupal::entityManager()
      -&gt;getViewBuilder('block')
      -&gt;view($block);


And in your page.html.twig or node.html.twig or xxx.html.twig use your variable My_region like this :

{% if page.My_region %}
    {{ page.My_region }}
{% endif %}


And in rendable array (custom module) by exemple into an controller custom in content():

public function content() {
    $block = Block::load('my_block_id');
    $block_content = \Drupal::entityManager()
      -&gt;getViewBuilder('block')
      -&gt;view($block);

          return array(
            '#type' =&gt; 'container',
            '#attributes' =&gt; array(
            'class' =&gt; array("Myclass"),
          ),
           "element-content" =&gt; $block_content,
           '#weight' =&gt; 0,
  );
}


drupal_render is not usefull drupal already assume the render in D8 and this is deprecated (https://api.drupal.org/api/drupal/core!includes!common.inc/function/drupal_render/8)

it's a bit heavy, it is better to use the maximum area system and does not add load block from the preprocess. In the case of using a controller in your modules this seems a justified use.