Faits :
A.
A._ travaillait en qualité de monteur IP ("Infrastructural Projects") auprès de la société B._ SA depuis le 1 er octobre 2013. Le 29 janvier 2014, il a été victime d'un infarctus du myocarde, en raison duquel il a subi une incapacité de travail d'environ trois mois. A nouveau en incapacité de travail depuis le 6 janvier 2016, il a présenté une demande de prestations de l'assurance-invalidité le 11 février suivant.
Après avoir recueilli les rapports des médecins traitants de l'assuré et mis celui-ci au bénéfice de mesures d'ordre professionnel, l'Office de l'assurance-invalidité pour le canton de Vaud (ci-après: l'office AI) a ordonné la mise en oeuvre d'une expertise pluridisciplinaire (en médecine interne générale, cardiologie, rhumatologie et psychiatrie). L'expertise a été diligentée par les médecins du centre médical d'expertises CEMEDEX SA à Fribourg, lesquels ont retenu, comme seul diagnostic incapacitant, une cardiopathie ischémique avec STEMI antérieur en 2014 et fraction d'éjection du ventricule gauche depuis mars 2018 et actuelle à 50 % (rapport d'expertise du 4 avril 2019). Ils ont conclu à une capacité de travail dans l'activité habituelle de 60 % depuis mai 2016 et l'ont considérée entière dans une activité adaptée aux limitations fonctionnelles, à savoir dans une activité sans efforts physiques soutenus, sans port de charges de plus de dix kilos, sans efforts de soulèvement à partir du sol, sans position en porte-à-faux ou tronc fléchi en avant, sans position accroupie de manière répétitive et, enfin, ne nécessitant pas trop d'attention ni de prise de décision.
Sur la base des conclusions du rapport d'expertise, confirmées par le Service médical régional dans un avis du 19 juillet 2019, l'office AI a nié le droit de l'assuré à une rente d'invalidité, motif pris que l'incapacité de gain de 15 % était inférieure au taux de 40 % ouvrant le droit à cette prestation (décision du 7 octobre 2019).
B.
Saisie d'un recours contre la décision de l'office AI du 7 octobre 2019, la Cour des assurances sociales du Tribunal cantonal du canton de Vaud l'a rejeté par arrêt du 29 octobre 2020.
C.
A._ interjette un recours en matière de droit public contre cet arrêt dont il demande l'annulation, en concluant au renvoi de la cause principalement à l'office AI, subsidiairement à la juridiction cantonale, pour nouvelle décision dans le sens des considérants.

Considérant en droit :
1.
1.1. Le recours en matière de droit public peut être formé notamment pour violation du droit fédéral (<ref-law>), que le Tribunal fédéral applique d'office (<ref-law>), n'étant limité ni par les arguments de la partie recourante, ni par la motivation de l'autorité précédente. Le Tribunal fédéral fonde son raisonnement sur les faits retenus par la juridiction de première instance (<ref-law>), sauf s'ils ont été établis de façon manifestement inexacte (c'est-à-dire arbitraire au sens de l'art. 9 Cst.; <ref-ruling> consid. 6.7; <ref-ruling> consid. 2.2) ou en violation du droit au sens de l'<ref-law> (<ref-law>).
1.2. Les constatations de l'autorité cantonale de recours sur l'atteinte à la santé, la capacité de travail de la personne assurée et l'exigibilité - pour autant qu'elles ne soient pas fondées sur l'expérience générale de la vie - relèvent d'une question de fait et ne peuvent donc être contrôlées par le Tribunal fédéral que sous un angle restreint (<ref-ruling> consid. 3.2; consid. 1 supra). En outre, il n'y a pas arbitraire du seul fait qu'une solution autre que celle de l'autorité cantonale semble concevable, voire préférable. Pour qu'une décision soit annulée pour cause d'arbitraire, il ne suffit pas que sa motivation soit insoutenable; il faut encore que cette décision soit arbitraire dans son résultat (<ref-ruling> consid. 5.4).
2.
Le litige porte sur le droit du recourant à une rente d'invalidité. Compte tenu des motifs du recours, il s'agit en particulier de déterminer si la juridiction cantonale était en droit de se fonder sur le rapport d'expertise pluridisciplinaire pour admettre que le recourant présentait depuis mai 2016 une capacité de travail entière dans une activité adaptée à ses limitations fonctionnelles. A cet égard, l'arrêt entrepris expose de manière complète les dispositions légales et la jurisprudence nécessaires à la résolution du litige, en particulier celles relatives à la notion d'invalidité (<ref-law> et art. 6, 7 et 8 al. 1 LPGA [RS 830.1]) et à son évaluation (<ref-law> et <ref-law>), ainsi qu'à la valeur probante des rapports médicaux (<ref-ruling> consid. 5.1; <ref-ruling> consid. 3a). Il suffit d'y renvoyer.
3.
La cour cantonale a considéré que le rapport d'expertise du 4 avril 2019 répondait aux réquisits jurisprudentiels en matière de valeur probante des documents médicaux.
En ce qui concernait la problématique cardiaque, les juges cantonaux ont constaté que si un rapport d'IRM tridimensionnelle du 28 octobre 2019 évoquait certes une fraction d'éjection du ventricule gauche de 41 %, en comparaison aux 50 % évalués dans l'expertise, il ne permettait toutefois pas de remettre en question la fiabilité de celle-ci. En effet, à supposer que l'IRM en question fût sensiblement plus précise que l'échocardiographie bidimensionnelle sur laquelle se fondait l'expertise (comme l'alléguait le recourant), un tel examen restait difficilement exploitable puisqu'il n'avait jamais été réalisé auparavant. On ne pouvait donc en tirer des conclusions sur les données échographiques de l'expertise sans également émettre des réserves sur la totalité des valeurs antérieures, y compris celles récoltées par la cardiologue consultée par le recourant. Quoi qu'il en fût, le rapport d'IRM faisait état d'une diminution discrète de la fraction d'éjection du ventricule, de sorte que le constat ne semblait pas inquiétant. En outre, les experts avaient tenu compte de la fraction d'éjection dans la détermination des limitations fonctionnelles et il ressortait du test d'effort pratiqué aux fins de l'expertise que la capacité physique limitée du recourant était en grande partie liée à sa sédentarité et à son manque de motivation. L'experte en cardiologie avait également relevé que la dernière coronarographie du 9 janvier 2018 avait mis en évidence l'absence de progression de la maladie coronarienne, que l'assuré n'avait pas présenté de récidive ischémique, ni d'épisode de décompensation cardiaque, et qu'il existait une incohérence entre les plaintes, l'état clinique et les résultats des examens cardiologiques.
Sur le plan psychiatrique, les juges cantonaux ont suivi les conclusions de l'expert psychiatrique, dont l'appréciation de la capacité de travail était motivée de manière conforme à la jurisprudence, selon laquelle les affections psychosomatiques et psychiques doivent faire l'objet d'une procédure probatoire structurée au sens de l'<ref-ruling>. L'appréciation de l'expert n'était pas remise en cause par les autres pièces figurant au dossier, en particulier les rapports successifs du docteur C._, spécialiste en psychiatrie et psychothérapie et médecin traitant de l'assuré. Ce praticien faisait certes état d'une capacité de travail de 60 % dans une activité adaptée, qu'il expliquait par une fatigabilité liée à la baisse d'énergie vitale, mais cette capacité de travail réduite n'était que peu documentée de manière objective. En outre, la baisse d'énergie vitale ne se retrouvait pas dans les descriptions du quotidien faites par l'assuré aux experts. Enfin, les rapports du médecin traitant, peu motivés, ne permettaient pas de comprendre la fatigabilité évoquée, ni les raisons d'une stagnation de la capacité résiduelle de travail à 60 % malgré la description d'une amélioration constante depuis la prise en charge du recourant.
4.
4.1. Se plaignant d'une appréciation arbitraire des preuves, le recourant reproche aux premiers juges d'avoir mis sa capacité physique limitée sur le compte de sa sédentarité et de son manque de motivation en perdant totalement de vue son affection cardio-vasculaire. A l'appui de son argumentation, il se prévaut de plusieurs certificats de travail et de rapports de mesure/stage mis en oeuvre par l'office AI en 2017, lesquels démontreraient qu'il est un travailleur consciencieux. Par ailleurs, en référence au refus des premiers juges d'ordonner un complément d'instruction, le recourant soutient que ceux-ci se sont fondés sur l'idée erronée que son diagnostic n'était pas évolutif et que sa situation médicale en mars 2018 était la même qu'en octobre 2019. Il le conteste en évoquant le rapport d'IRM du 28 octobre 2019 qui, selon lui, ne contredit pas forcément l'expertise mais reflète simplement son état cardiaque à un moment différent. Dans ce contexte, le recourant précise qu'une fraction d'éjection du ventricule gauche de 50 % constitue le seuil inférieur d'un ventricule en bonne santé et fait valoir qu'en octobre 2019, une fraction d'éjection du ventricule gauche de 41 % a été constatée.
4.2. En l'occurrence, le recourant fait une mauvaise lecture de l'arrêt attaqué. En effet, si la juridiction cantonale a relevé une problématique de sédentarité et de manque de motivation, c'est uniquement au regard du test d'effort mis en oeuvre dans le contexte de l'expertise. Sur le plan de la capacité résiduelle de travail du recourant, elle a considéré que la cardiopathie ischémique avec une fraction d'éjection du ventricule gauche engendrait des limitations fonctionnelles, l'empêchant en particulier d'exercer une activité impliquant des efforts physiques. Par son argumentation, le recourant ne démontre pas en quoi ces constatations seraient entachées d'arbitraire. Par conséquent, le point de savoir si les certificats et rapports annexés au recours, invoqués pour démontrer les qualités professionnelles de l'assuré, constituent des nova improprement dits admissibles au sens de l'<ref-law> - comme il le soutient - n'apparaît pas pertinent.
En ce qui concerne les résultats de l'IRM du 28 octobre 2019, la juridiction cantonale en a déduit sans arbitraire que la différence de valeur de la fraction d'éjection du ventricule gauche par rapport à l'examen du CEMEDEX n'était pas déterminante. Quoi qu'en dise le recourant, cette seule différence de valeur ne permet pas d'admettre une aggravation de son état de santé, limitant davantage sa capacité de travail. En effet, dans le rapport du 29 octobre 2019, les médecins radiologues ont fait état d'une diminution discrète de la fonction systolique du ventricule gauche de repos sans autre précision, alors que le docteur D._, cardiologue traitant, n'en a tiré aucune conclusion quant à une péjoration de l'état de santé de son patient (rapport du 6 novembre 2019). En l'absence d'une dégradation rendue suffisamment probable, c'est sans arbitraire que la juridiction cantonale a renoncé à instruire plus avant ce point.
5.
5.1. Sur le plan psychiatrique, le recourant reproche à l'autorité précédente d'avoir considéré sans aucun fondement que les rapports médicaux de son psychiatre traitant étaient peu documentés, peu objectifs et peu motivés. Selon lui, le seul fait que les résultats d'examens médicaux pratiqués avec des méthodes différentes et à des moments différents divergent n'implique pas nécessairement qu'une expertise a seule force probante à l'exclusion des autres avis médicaux.
5.2. Ce faisant, le recourant se limite à contester l'appréciation des preuves par les premiers juges sans en démontrer le caractère arbitraire. En particulier, il n'expose pas en quoi les rapports du docteur C._ seraient suffisamment documentés et objectifs. Son argumentation, purement appellatoire, n'a pas à être suivie.
6.
Vu ce qui précède, le recours se révèle en tous points mal fondé.
7.
Succombant, le recourant doit supporter les frais judiciaires (<ref-law>). Il n'est pas alloué de dépens (art. 68 al. 1 et 3 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 800 fr., sont mis à la charge du recourant.
3.
Le présent arrêt est communiqué aux parties, à la Cour des assurances sociales du Tribunal cantonal du canton de Vaud et à l'Office fédéral des assurances sociales.
Lucerne, le 7 septembre 2021
Au nom de la IIe Cour de droit social
du Tribunal fédéral suisse
Le Président : Parrino
La Greffière : Castella