I realise that there are already 4 answers to this question but they all address it by creating it as new geometry. I wanted to provide a different approach by using a procedural texture to give the appearance of the grill. In this way we only need to add a single plane - rather than geometry for each individual cell of the grill.

Here's the final result :

[![Final Result][1]][1]

This answer https://blender.stackexchange.com/a/67654/29586 developed a material that defined the cells of a regular hexagonal grid. It produces two outputs - a measure of the distance to the edge of a hexagonal 'cell' (used to drive the Strength of the Emission shader in the original solution) and the Vector coordinates of the centre of the corresponding cell (used as the input to a Noise Texture to generate colors of the cells in the original solution).  The following Node Group takes this a stage further by also providing the distance to the centre of the cell, the distance to the centre of the next closest cell and the Vector coordinates of the next closest cell.

[![Node Group external][2]][2]
[![Node Group internal][3]][3]

By using the Edge Distance to mix between a Transparent and Diffuse shader we can produce the following simple effect :

[![simple grid material][4]][4]
[![simple grid][5]][5]

For a more convincing grid we need to add depth. For a ray to pass through the grill it would need to pass through the 'hole' at the surface and out the corresponding hole on the other side. The depth of the grill will determine how perpendicular the ray must be to be able to pass through the surface. To achieve this we can use two identical hexagonal grids - one to represent the 'top' surface of the grid and the second to represent the bottom surface of the grid. The path of each ray can then be determined by considering how it interacts with each of those grids.

[![edge view ray passing through][6]][6]

By 'sliding' the second grid to the side based on the angle of the ray and the depth of the grill we can simulate where it would be when the ray reaches the 'bottom' of the grid. In a 'real' grill the ray will only pass through if it is at a steep enough angle to pass through the top and bottom surfaces. The calculation of the position of the second grid can be done as shown below :

[![bottom grid offset calculation][7]][7]

There are two parts to this calculation. The first part (top row) determines the direction of the offset parallel to the surface. This is achieved with a pair of Cross Product nodes. The first combines the Incoming ray with the Normal to generate a ray parallel with the surface but at right-angles to the incoming ray. The second Cross Product flips it around the Normal again - by 90 degrees - so it is along the line of the incoming ray (but still parallel to the surface). The bottom row of the calculation determines the magnitude of the required offset based on the incoming angle (determines via the Dot Product with the Normal) and the set Thickness of the grill. The results of these branches are Multiplied together to give the required offset.

The following image shows the interesting regions based on where it strikes the top and bottom grids.

[![colored regions][8]][8]

The colors represent the following :

1. White - The ray is close to a top cell 'edge' and so has hit the top surface of the grill
2. Red - The passes through one cell on the surface but would be 'out' of a different cell - ie, it must have hit the side of a cell.
3. Green - The ray is close to the cell 'edge' on exiting the grill and so has still hit the side of the cell (but almost got through)
4. Blue - The ray enters through one cell and exits through the corresponding cell in the other grid - ie, it's passed all the way through.

Shading the White region with one material for the surface of the grill, Red and Green with another for the edges of each 'hole', and Blue as Transparent we get the following result :

[![simple hex grid with depth][9]][9]

The above material does produce more convincing results - especially in the way more oblique angles result in less light passing through the grill - but the surfaces are still 'flat'. To improve this further we can generate Normals based on where the grill is struck - ie, on an inside edge it will be angled parallel to the surface (perpendicular to the side of the 'cell') while on the top surface (the edge of a cell) it will be closer to the surface Normal. In addition, we can add a curve or bevel to the top surface of the cells.

To achieve this we can use the following material :

[![final material][10]][10]

Note the calculation of the Normal using a combination of the Cell Vector and 2nd Cell Vector to determine the direction of the Normal of the corresponding cell wall. The Vector Transform node is used to transform the calculated Normal (which will be in Object space) into World space as required for the Normal passed to the Shader.

And this produces the following results :

[![final results][11]][11]

The material can be used on more complicated shapes - although, as it stands, care needs to be taken since the calculated Normal for the inner edges and upper surface of the cells does not take the actual surface normal into account  (I'm sure this could be improved by tweaking the calculation but haven't yet had the chance to look into it in much depth). However, it still produces reasonable results as shown with this 'wireframe' Suzanne.

[![suzanne_animated][12]][12]

Limitations

Note that the shading on the edges of the cells isn't perfect - it can produce odd results with thick grills when viewed at an oblique angle - where the calculated normal is miscalculated as the wrong edge. This is due to the 'second nearest' being the incorrect cell to use for the angle of the ray and is difficult to correct for as it is dependent on the 'depth' through the grill where the ray hits the side. The problem is illustrated by this image :

[![bad edges][13]][13]

The result is sufficient for this slight discrepancy to not be generally noticable but if anyone has any suggestions on a way to address this then please do let me know! One potential solution is to calculate the depth at the point the ray hit the cell and to position a third hex grid at that depth to determine which cell boundary is most relevant. However, this would have an impact on efficiency as the hex grid is already quite computationally intensive.

Another limitation is that currently the Normal calculation assumes that the surface is oriented in the X/Y plane. For more complicated surfaces (such as Suzanne), this is not always the case and the calculated normals may produce odd results (such as when viewed from behind). This is generally not noticable but can result in incorrect lighting and/or incorrect reflections - especially on the 'internal' surfaces of the cells. Also, this means it is not suitable to UV unwrapped meshes (stick to Generated or displaced Object coordinates).

Note also that nodes that generate the hexagon pattern require *positive* X/Y coordinates only. When using Object coordinates (or any other coordinates that could result in negative values), use a Mapping node to shift the coordinates a suitable amount to make sure they're always positive.


  [1]: https://i.sstatic.net/WbnQF.png
  [2]: https://i.sstatic.net/eOmtM.png
  [3]: https://i.sstatic.net/cVTEe.jpg
  [4]: https://i.sstatic.net/MEqCl.png
  [5]: https://i.sstatic.net/UBqg7.png
  [6]: https://i.sstatic.net/ynNtf.png
  [7]: https://i.sstatic.net/GIIHP.png
  [8]: https://i.sstatic.net/HkVtI.png
  [9]: https://i.sstatic.net/hRcZB.png
  [10]: https://i.sstatic.net/1zld0.png
  [11]: https://i.sstatic.net/VvZv5.png
  [12]: https://i.sstatic.net/g19xz.gif
  [13]: https://i.sstatic.net/Il2xp.png