As you might be able to see in the following image, a "graphic glitch" occurs between triangles. I know you are able to make this less visible by enabling anti-aliasing but i was wondering if there is another way to fix this issue.

This is how my wireframe looks (not the same area): 
So the problem is caused by "T-junktions". But for my case, this isn't easy to fix. This is the way I create my meshes, it works as the greedy meshing algorithm but then my own version.
First I calculate the faces for each block.
if(current.front){//If this block has a front face continue int x2 = x; int y2 = y; //while the next block in the x direction contains a front face and has equal properties, combine the faces while(x2 < CHUNK_SIZE && m_pBlocks[x2][y][z].front && m_pBlocks[x2][y][z].getBlockType() == current.getBlockType() && m_pBlocks[x2][y][z].getBlockData() == current.getBlockData() && AOInfoPerBlock[x2][y][z].hasEqualAO(info, FRONT)){ m_pBlocks[x2][y][z].front = false; x2++; } //while the next block in the y direction contains a front face and has equal properties, combine the faces y2++; while(y2 < CHUNK_HEIGHT){ int x3 = x; while(x3 < x2){ if(m_pBlocks[x3][y2][z].front && m_pBlocks[x3][y2][z].getBlockType() == current.getBlockType() && m_pBlocks[x3][y][z].getBlockData() == current.getBlockData() && AOInfoPerBlock[x3][y2][z].hasEqualAO(info, FRONT)){ m_pBlocks[x3][y2][z].front = false; x3++; }else{ for(int x4 = x3-1; x4 >= x; x4--){ m_pBlocks[x4][y2][z].front = true; } break; } } if(x3 == x2){ y2++; }else{ break; } } if(x2 > x){//If the mesh exists out of one x block, it has gone one to far x2--; } if(y2 > y){//If the mesh exists out of one y block, it has gone one to far y2--; } if(info.f1 + info.f3 > info.f0 + info.f2) { //If this block should be flipped for the screen space ambient occlusion, render in flipped order /*1*/ vertPos.push_back(Vertex(x * BLOCK_RENDER_SIZE , y2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f1 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*2*/ vertPos.push_back(Vertex(x2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , y2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f2 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*3*/ vertPos.push_back(Vertex(x2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , y * BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f3 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*0*/ vertPos.push_back(Vertex(x * BLOCK_RENDER_SIZE , y * BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f0 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); }else{ /*0*/ vertPos.push_back(Vertex(x * BLOCK_RENDER_SIZE , y * BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f0 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*1*/ vertPos.push_back(Vertex(x * BLOCK_RENDER_SIZE , y2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f1 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*2*/ vertPos.push_back(Vertex(x2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , y2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f2 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); /*3*/ vertPos.push_back(Vertex(x2 * BLOCK_RENDER_SIZE + BLOCK_RENDER_SIZE , y * BLOCK_RENDER_SIZE , z * BLOCK_RENDER_SIZE , /*D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f)/*/color * ((1.0f - 0.8f) + (info.f3 * 0.8f) / (float)3), D3DXVECTOR3(0.0f, 0.0f, -1.0f))); } indices.push_back(index++); indices.push_back(index++); indices.push_back(index++); indices.push_back(index-3); indices.push_back(index-1); indices.push_back(index++); } The same thing is used for each face