Wikilivres
frwikibooks
https://fr.wikibooks.org/wiki/Accueil
MediaWiki 1.47.0-wmf.7
first-letter
Média
Spécial
Discussion
Utilisateur
Discussion utilisateur
Wikilivres
Discussion Wikilivres
Fichier
Discussion fichier
MediaWiki
Discussion MediaWiki
Modèle
Discussion modèle
Aide
Discussion aide
Catégorie
Discussion catégorie
Transwiki
Discussion Transwiki
Wikijunior
Discussion Wikijunior
TimedText
TimedText talk
Module
Discussion module
Event
Event talk
Discussion Wikilivres:Présentation
5
756
768242
768216
2026-06-21T12:39:31Z
JackPotte
5426
Révocation d’une modification de [[Special:Contributions/Association Marocains Victimes Expulsion Arbitraire Algérie|Association Marocains Victimes Expulsion Arbitraire Algérie]] ([[User talk:Association Marocains Victimes Expulsion Arbitraire Algérie|discussion]]) vers la dernière version de [[User:DavidL|DavidL]]
688754
wikitext
text/x-wiki
==Wikilivres dans d'autres langues==
J'ai édité la section "Wikilivres dans d'autres langues" qui était obsolète puisqu'elle disait que ça n'existait pas encore, ce qui n'est plus le cas maintenant. J'y ai mis un modèle <nowiki>{{langues}}</nowiki>, comme sur le [[:en:Template:Languages|site anglais]]. Dites-moi ce que vous en pensez.
[[Utilisateur:Esope|Esope]] 6 nov 2004 à 16:15 (UTC)
== Wikilivres ou Wikibooks pour les nuls ==
''Déplacé depuis le [[w:wikipédia:le Bistro|le bistro]] de l'encyclopédie''.
[[b:Wikilivres:Wikilivres|Wikilivres]] n’est pas les horreurs que je lis ici, mettre Wikipédia sur un piédestal et affirmer que Wikilivres n’est qu’un trou où l’on oublie tout est faux et gratuit.
Pour les nouveaux ; Wikilivres est un wiki créé par Wikimedia de livres et guides collaboratifs sur les savoir-faire, techniques (comme les recettes)...
Le lien vers wikilivres est trivial, l’interwiki est la lettre b:, comme [[b:wikilivres:le Bistro]] pour venir sur le bistro.
Wikipédia t'offre le poisson, Wikilivres t’apprends à pêcher. [[Utilisateur:Greudin|Greudin]] 19 jan 2005 à 18:01 (CET)
:: C'est "La pèche pour les nuls"? ''I'm a fish'' (sic). Etre maltraitée comme ça sur wikipédia... c'est très diététique, le poisson!--[[Utilisateur:Floreal|fl0]] 20 jan 2005 à 16:22 (CET)Fl0
: Hum, savoir-faire, savoir-faire... je m'y suis laissé piégé ce matin, alors j'aimerais apporter une nuance : on peut parfaitement parler de choses relatives au savoir (je pense que tout le monde saisi que c'est par opposition au savoir-faire, là) dans un wikilivres : si on prend l'exemple de [[b:Tribologie|Tribologie]], il s'agit d'un livre très complet qui mêle théorie physique et exemples pratiques. Un des critères pertinents est tout simplement... la taille ! On peut faire un article de fond sur wikipédia, et vouloir encore plus approfondir le sujet, avec force de sources, pour en faire quelque chose qui serait carrément publiable sous le format d'un livre, par exemple à destination des étudiants.
: J'ai commencé ce soir un wikilivre sur CSS ([[b:wikilivres:Programmation CSS|wikilivres:Programmation CSS]]) ; pourquoi sur wikibooks et pas sur wikipédia ? Après tout, j'aurai pu le mettre ici, je compte y parler aussi de « théorie » ou de l'histoire de CSS... En définitive, c'est parce que sur wikibooks, je peux envisager de relier plusieurs articles, d'adopter un ton plus scolaire, de donner plus d'exemples, de m'attarder sur des points annexes... et, à moyen terme, arriver à un résultat suffisament gros pour que ce soit un document apparenté à un livre, plus qu'à un article. La frontière est assez floue, je trouve (mais en même temps on l'appréhende assez bien, avec de la bonne volonté...). Pour des infos supplémentaires, voyez le [[Discussion_Wikipédia:Champs de connaissance#Recettes de Cuisines|débat sur les recettes de cuisine]] ;)
: Page d'informations sur wikilivres : [[b:wikilivres:Wikilivres|wikilivres:Wikilivres]]
: [[Utilisateur:Meanos|Meanos]] [[Discussion_Utilisateur:Meanos|+]] 19 jan 2005 à 23:24 (CET)
::Dans la plupart des exemples débattus la frontière n'est pas floue. Les noms d'articles commençant par un verbe à l'infinitif ici peuvent être développés sur wikilivres. [[Utilisateur:Greudin|Greudin]] 20 jan 2005 à 14:40 (CET)
::: Dans ce sens en effet (voir [[Construire sa maison]]). Mais dans l'autre, non : le wikilivre sur [[b:Histoire de l'Europe|Histoire de l'Europe]] est un contre-exemple (''Apprendre l'histoire de l'Europe'' a tout aussi bien sa place sur Wikipédia que sur Wikibooks, en théorie, donc ce critère n'est pas non plus totalement pertinent — en tout cas pas dans toutes les situations). Personnellement, je ne suis pas contre les wikilivres (sinon je ne serais pas allé voir et n'en aurais pas commencé un), mais chaque cas est ''encore'' à débattre. Un gros article ne fera pas nécessaire un bon wikilivre, et un petit wikilivre en devenir ne fera pas nécessairement un bon article sur Wikipédia. [[Utilisateur:Meanos|Meanos]] [[Discussion_Utilisateur:Meanos|+]] 20 jan 2005 à 17:05 (CET)
Il faut bien dire que tout les projets wikimedia sont complémentaires. Les définitions sur wiktionnaire, les images sur commons les articles sur wikipédia et les ouvrages (ou assimilés comme tels) sur wikilivre. Il n'y a rien de dégradant qu'un "article" de wikipédia se retrouve sur "wikilivre". De plus, il faudrait que le nombre de liens entre les projets augmente pour bien montrer cette complémentarité.--[[Utilisateur:Dav 59|David]] 20 jan 2005 à 19:16 (CET)
:si techniquement un mediawiki peut supporter tous les wiki, je ne vois pas l'utilité de scinder(wikilivres,wikitionnary,...) et donc, a mon avis, se compliquer la vie --[[Utilisateur:Vev|Vev]] 21 jan 2005 à 16:17 (CET)
== Liens Wikipen renvoie des écrans en japonais ==
Bonjour,
Le § relatif à Wikipen renvoie des écrans en japonais... Qui peut corriger ? Je ne sais pas ce que l'auteur a voulu faire !!! Merci, Guy, on ne signe pas ici avec un bouton ad hoc ????[[Utilisateur:Guy6631|Guy6631]] ([[Discussion utilisateur:Guy6631|discussion]]) 18 février 2016 à 08:34 (CET)
:{{fait}} J'ai retiré cette référence, sans aller jusqu'à renvoyer les gens vers Publibook, lulu.com, et autres Wattpad. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 18 février 2016 à 08:48 (CET)
== Accès à cette page de Présentation générale ==
Bonjour,
J'ai eu beaucoup de mal à trouver cette page de présentation... Il faut aller en bas de page "accueil" et lire les titres en police 6 pour la trouver... Suggestion : Mettre un bouton-lien "Présentation" dans le panneau de gauche sous le bouton "accueil". Je ne sais pas le faire sinon je n'hésiterais pas... A+ Guy,[[Utilisateur:Guy6631|Guy6631]] ([[Discussion utilisateur:Guy6631|discussion]]) 18 février 2016 à 08:39 (CET)
:Le panneau de gauche n'est modifiable que par les administrateurs élus sur le site. Je vais y réfléchir ce soir... [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 18 février 2016 à 08:49 (CET)
:A la réflexion, cette page est déjà visible depuis l'accueil (en petit en haut), dans {{M|bienvenue nouveau}} et dans toutes les pages via le pied de page (''à propos''). De plus, la barre de gauche publie les liens fréquents, mais celui-ci ne sert qu'une fois ou deux par personne. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 18 février 2016 à 22:46 (CET)
== Contradiction sur la propriété ==
Bonjour, Je relève une contradiction entre :
- "Tout le contenu de ce site est couvert par la licence juridique CC-BY-SA. '''Les contributions demeurent la propriété de leurs créateurs''', alors que le copyleft assure que le contenu demeurera toujours librement distribuable et reproductible. Voyez les copyrights pour plus d'information."
- et les phrases où l'on prescrit la collaboration pour l'élaboration d'un livre sous ce Wiki...
Je ne suis pas juriste, c'est une lacune grave oui oui !!!... peut-être donc qu'une subtilité m'échappe... Des explications SVP, Merci d'avance, Guy,[[Utilisateur:Guy6631|Guy6631]] ([[Discussion utilisateur:Guy6631|discussion]]) 18 février 2016 à 08:52 (CET)
:{{fait}} J'ai retiré le mot ''copyleft'' qui ne s'appliquait pas stricto sensu. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<font color="#FF6600">$</font>♠]]) 18 février 2016 à 09:15 (CET)
== Pas de travail original ? ==
J'ai écrit deux wikilivres [[Théorie quantique de l'observation]] et [[Précis d'épistémologie]]. Ce sont des livres pédagogiques qui visent à amener l'étudiant au niveau de la recherche actuelle. La plupart des connaissances exposées sont un savoir bien établi, déjà connu de tous ceux qui connaissent le sujet. Mais bien sûr je ne résiste pas à la tentation d'exposer mes propres résultats, lorsque je crois qu'ils peuvent éclairer l'étudiant qui comprend leurs preuves. Suis-je en tort ? Dois-je renoncer à poursuivre mon travail sur wikilivres ? Si on m'interdisait de publier mes travaux, je serais évidemment beaucoup moins motivé.
Je ne parle pas seulement de mon cas personnel. Il me semble que l'interdiction pure et simple de tout travail original sur une page d'accueil des nouveaux contributeurs a un effet trop dissuasif. Livre pédagogique n'est pas incompatible avec travail original. Wikibooks peut être un lieu où chacun enseigne comme bon lui semble. On n'a pas toujours une telle liberté. De fait Wikibooks est déjà un lieu qui accueille l'originalité, puisque n'importe quel livre est original, ne serait-ce que par sa façon de présenter son sujet. C'est pourquoi il me semble qu'il vaudrait mieux un critère tel que : wikibooks accueille les travaux originaux pourvu qu'ils soient intégrés à des livres pédagogiques. Si cette liberté était utilisée de façon abusive, il faudrait un critère plus restrictif. --[[Utilisateur:Thierry Dugnolle|Thierry Dugnolle]] ([[Discussion utilisateur:Thierry Dugnolle|discussion]]) 10 mars 2017 à 08:11 (CET)
:Je suis d'accord avec Thierry Dugnolle. Le fait de cette interdiction nous dissuade tout de suite de rester sur Wikilivres et de continuer à y écrire. [[Utilisateur:HarryPotterSuperCool!|HarryPotterSuperCool!]] ([[Discussion utilisateur:HarryPotterSuperCool!|discussion]]) 18 janvier 2023 à 13:35 (CET)
6jsi06w0rq4j7kvkdtopl5zesg7wyhl
Le langage HTML/Style de texte
0
15800
768296
724884
2026-06-22T08:47:19Z
Cdang
1202
/* Éléments HTML de mise en forme */ titre plus pertinent
768296
wikitext
text/x-wiki
<noinclude>{{Le langage HTML}}</noinclude>
Le '''style du texte''' indique au navigateur la mise en forme à appliquer au texte selon l'élément.
Comme pour les titres, la manière dont le texte est mis en forme dépend des réglages du navigateur pour le style par défaut, et de la feuille de style (voir ''[[Le langage CSS]]'').
Plutôt que de « style de texte », il vaudrait mieux parler d'« éléments de texte » (« éléments de phrase » et « de citation »), puisque les balises décrivent des portions de texte.
== Éléments HTML de description ==
{| border="1"
|+ Styles de texte les plus courants
|-
! Style !! Balise !! Mnémotechnique !! Rendu par défaut
|-
| mise en emphase
| <code><em></code>…<code></em></code>
| emphase
| italique
|-
| mise en emphase forte
| <code><strong></code>…<code></strong></code>
| « fort »
| gras
|-
| citation d'une référence
| <code><cite></code>…<code></cite></code>
| …
| italiques
|-
| citation courte dans le texte
| <code><q></code>…<code></q></code>
|''quote'' (citation)
| entre guillemets
|-
| citation à part
| <code><blockquote></code>…<code></blockquote></code>
| « bloc de citation »
| marge à gauche plus grande
|-
| code source
| <code><code></code>…<code></code></code>
| …
| police à chasse fixe avec empattement (type Courier)
|-
| texte préformaté (par exemple pour aligner avec des espaces, ou faire des dessins ASCII)
| <code><pre></code>…<code></pre></code>
| ''preformatted'' (préformaté)
| police à chasse fixe, en général avec empattement (type Courrier)
|}
La tendance est de préférer utiliser les balises<ref>https://www.alsacreations.com/article/lire/552-strong-b-em-i-quelle-balise-utiliser-et-pourquoi.html</ref> :
* <code><i></code>…<code></i></code> par <code>em</code>.
* <code><b></code>…<code></b></code> par <code>strong</code>.
En effet, cela revient à définir la description de texte plutôt que faire sa mise en forme, tâche plutôt dévolue au CSS.
Dans la pratique, si cela ne change pas grand chose pour un rendu graphique (sauf si la feuille de style ou le rendu du navigateur en décide autrement), et cela favorise l'accessibilité : s'il est possible pour un lecteur d'interpréter une mise en emphase (par exemple en changeant le ton de la voix), il est en revanche impossible de rendre une variation de mise en forme.
<div class="flex-content">
<div class="flex-content-half">
'''Exemple'''
<syntaxhighlight lang="html">
<p>Selon Boileau :</p>
<blockquote>
Vingt fois sur le métier
remettez votre ouvrage
</blockquote>
<p>bref, <em>ne vous découragez pas !</em>
<strong>Soyez patient !</strong></p>
</syntaxhighlight>
</div>
<div class="flex-content-half">
ce qui donne :
{{Début cadre|bleu}}
Selon Boileau :
<blockquote>
Vingt fois sur le métier
remettez votre ouvrage
</blockquote>
bref, <em>ne vous découragez pas !</em>
<strong>Soyez patient !</strong>
{{Fin cadre}}
</div>
</div>
Voici quelques autres styles de texte :
{| border="1"
|+ Autres styles de texte
|-
! Style !! Balise !! Mnémotechnique !! Rendu par défaut
|-
| saisie clavier
| <code><kbd></code>…<code></kbd></code>
| ''keyboard'' (clavier)
| ''idem'' <code><code></code>
|-
| abréviation
| <code><abbr></code>…<code></abbr></code>
| ''abbreviation''
| souligné par un trait pointillé
|-
| acronyme
| <code><acronym></code>…<code></acronym></code>
| …
| ''idem'' <code>abbr</code>
|}
----
; Note
: En français, un acronyme est lexicalisé, c'est-à-dire prononcé comme un mot (comme laser, ovni), alors que dans un sigle, les lettres sont prononcées séparément (SNCF). En anglais, langue de référence du HTML, la définition est plus floue : certains distinguent les termes ''initialism'' (sigle) et ''acronym'' (sigle lexicalisé, même sens qu'en français), alors que pour d'autres ''acronym'' désigne un sigle qu'il soit lexicalisé ou non (voir l'article du Wikipédia anglophone ''[[:en:Acronym|Acronym]]''). Dans la pratique, il n'y a pas de différence dans le traitement de <code><abbr></code> et de <code><acronym></code>, cette dernière disparaît d'ailleurs du XHTML 2.
----
Même lorsqu'elles ne modifient pas la mise en forme, les balises <code>abbr</code> et <code>acronym</code> sont utiles pour les analyseurs syntaxiques ''(parsers)'' et les correcteurs d'orthographe. Elles sont surtout utiles avec le paramètre <code>title</code> (titre), qui permet d'expliciter l'abréviation ; en général, le titre s'affiche dans une info-bulle.
'''Exemple'''
<div class="flex-content">
<div class="flex-content-half">
Les pages Web sont écrites en <acronym title="Hypertext Markup Language">HTML</acronym>.
</div>
<div class="flex-content-half">
donne (passez le curseur de la souris sur l'abréviation « HTML » ci-dessous) :
{{début cadre|bleu}}
Les pages Web sont écrites en <span class="explain" title="Hypertext Markup Language">HTML</span>
{{fin cadre}}
</div>
</div>
== Paramètres ==
Pour les balises de citation (<code><q></code> et <code><blockquote></code>), on peut préciser la source, avec le paramètre <code>cite</code> indiquant son URL.
; Exemple
<syntaxhighlight lang="html">
Selon le site Alsacréations,
<q cite="http://css.alsacreations.com/Bases-et-indispensables/Quelle-est-la-difference-entre-un-div-et-un-calque">
cet abus de langage
est malheureusement demeuré très ancré
et induit de nombreux amalgames.
</q>
</syntaxhighlight>
== Balises de mise en forme ==
Avant le CSS, la modification de la police était déjà une préoccupation, le W3C a donc créé des balises permettant ces modifications — donc de la mise en forme — que l'on peut toujours trouver dans du code ou des ouvrages. Les balises sont donc données à titre d'information, mais elles devraient être proscrites au profit du CSS.
{{attention|Les balises "center", "font", "strike" et "tt" sont dépréciées en HTML5, [[mw:Help:Lint_errors/obsolete-tag/fr|remplacées par "span style"]].}}
{| border="1"
|+ Autres styles de texte
|-
! Style !! Balise !! Mnémotechnique
|-
| affichage écran (''idem'' code source)
| <code><tt></code>…<code></tt></code>
| ''teletype'' (terminal)
|-
| italique
| <code><i></code>…<code></i></code>
| ''italic''
|-
| gras
| <code><b></code>…<code></b></code>
| ''bold'' (gras)
|-
| grandes lettres
| <code><big></code>…<code></big></code>
| (grand)
|-
| petites lettres
| <code><small></code>…<code></small></code>
| (petit)
|-
| texte barré
| <code><strike></code>…<code></strike></code> ou <code><s></code>…<code></s></code>
| (barré)
|-
| texte souligné
| <code><u></code>…<code></u></code>
| ''underligned'' (souligné)
|}
On peut également modifier :
* la taille de la police : <code><font size="''taille''"></code>…<code></font></code>, ou ''taille'' est un nombre absolu en unité arbitraire (la taille normale est 3), ou un nombre relatif (<code>+1</code> pour la taille courante augmentée de 1, <code>-2</code> pour la taille courante diminuée de 2) ;
* la nature de la police : <code><font face="''nom de la police''"></code>…<code></font></code>.
On peut combiner les deux, par exemple <code><font size="12" face="Times New Roman"></code>…<code></font></code>
Ces balises sont maintenant déconseillées. On peut utiliser <code>em</code> et <code>strong</code> pour l'italique et le gras, et le CSS pour le reste :
* lettres plus grandes de 10 % : <code><span style="font-size:1.1em">…</span></code>
* lettres plus petites de 10 % : <code><span style="font-size:0.9em">…</span></code>
* souligner : <code><span style="text-decoration:underline">…</span></code>
* barrer : <code><span style="text-decoration:linethrough">…</span></code>
* type de police : <code><span style="font-family:"Times New Roman" ">…</span></code>
mais il vaut mieux définir des styles dans un fichier à part et faire appel à ces styles (ce qui simplifie la maintenance des fichiers), par exemple, mettre dans le fichier CSS :
<syntaxhighlight lang="css">
.grand {font-size:1.1em}
.petit {font-size:0.9em}
.souligner {text-decoration:underline}
.barrer {text-decoration:linethrough}
</syntaxhighlight>
ce qui s'exploite dans le fichier HTML de la manière suivante :
<syntaxhighlight lang="html">
<p>
Du texte en <span class="grand">grandes</span>
ou <span class="petit">petites</span> lettres,
<span class="souligner">souligné</span>
ou <span class="barrer">barré</span>.
</p>
</syntaxhighlight>
{{loupe|Le langage CSS/Texte}}
== Équivalence de taille de caractères ==
Les éléments <font>, <big> et <small> sont désuets, ce qui signifie qu'ils pourraient ne plus fonctionner sur les prochains navigateurs.
Les tableaux ci-dessous donnent leur équivalent utilisant <span> et [[Le langage CSS|CSS]].
{| class="wikitable"
! Taille absolue, élément obsolète
! Taille relative, élément obsolète
! CSS font-size équivalent
! CSS font-size équivalent en points
|-
|
<font size="0"><font size=0></font>
|
<font size="-3"><font size=-3></font>
| style="font-size:xx-small" | xx-small
| style="font-size:7pt" | font-size: 7pt
|-
|
<font size="1"><font size=1></font>
|
<font size="-2"><font size=-2></font>
| style="font-size:x-small" | x-small
| style="font-size:8pt" | font-size: 8pt
|-
|
<font size="2"><font size=2></font>
|
<font size="-1"><font size=-1></font>
| style="font-size:small" | small
| style="font-size:10pt" | font-size: 10pt
|-
|
<font size="3"><font size=3></font>
|
<font size="+0"><font size=+0></font>
| style="font-size:medium" | medium
| style="font-size:12pt" | font-size: 12pt
|-
|
<font size="4"><font size=4></font>
|
<font size="+1"><font size=+1></font>
| style="font-size:large" | large
| style="font-size:14pt" | font-size: 14pt
|-
|
<font size="5"><font size=5></font>
|
<font size="+2"><font size=+2></font>
| style="font-size:x-large" | x-large
| style="font-size:18pt" | font-size: 18pt
|-
|
<font size="6"><font size=6></font>
|
<font size="+3"><font size=+3></font>
| style="font-size:xx-large" | xx-large
| style="font-size:24pt" | font-size: 24pt
|-
|
<font size="7"><font size=7></font>
|
<font size="+4"><font size=+4></font>
| style="font-size:xxx-large" | xxx-large
| style="font-size:36pt" | font-size: 36pt
|}
{| class="wikitable"
! HTML à remplacer
! CSS équivalent
|-
|
<small><small>Du texte de petite taille.</small></small>
| style="font-size:85%;" | <span style="font-size:85%;">Du texte de petite taille.</span>
|-
|
<big><big>Du texte de grande taille.</big></big>
| style="font-size:120%;" | <span style="font-size:120%;">Du texte de grande taille.</span>
|}
== Références ==
{{Références}}
14i6saer6fxr72f2q4t3oy50u0dndye
Dictionnaire de philosophie/B
0
30554
768292
767967
2026-06-22T04:32:14Z
PandaMystique
119061
768292
wikitext
text/x-wiki
{{DicoPhilo |B}}
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5em; width: 100%;">
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:[[Dictionnaire de philosophie/Willard Van Orman Quine/Barbe de Platon|Barbe de Platon]] (<small>voir aussi : [[Dictionnaire de philosophie/Willard Van Orman Quine|Quine]]</small>)
:[[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
:[[Dictionnaire de philosophie/Beau|Beau]]
:Béhaviorisme
:[[Dictionnaire de philosophie/Besoin|Besoin]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:[[Dictionnaire de philosophie/Bien|Bien]]
:Bien commun
:[[Dictionnaire de philosophie/Bioéthique|Bioéthique]] ᕻ
:Bon sens
:[[Dictionnaire de philosophie/Bonheur|Bonheur]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
</div>
</div>
{{PhiloRecherche}}
{{Autocat}}
cdafdo15us7mw0cxb0qkfvt7yrdhmyu
Dictionnaire de philosophie/C
0
30593
768287
767916
2026-06-22T03:33:33Z
PandaMystique
119061
768287
wikitext
text/x-wiki
{{DicoPhilo|C}}
<!-- Grille de contenu -->
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;">
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:[[Dictionnaire de philosophie/Carnéade|Carnéade]]
:Catégorie
:[[Dictionnaire de philosophie/Causalité|Causalité]]
:Cause
:Caverne (allégorie)
:[[Dictionnaire de philosophie/Certitude|Certitude]]
:{{MotPhilo|David Chalmers}}
:{{MotPhilo|Chamfort}}
: ''Chine''
::— [[Dictionnaire de philosophie/Chine|Pensée chinoise]]
::— [[Dictionnaire de philosophie/Esthétique dans la pensée chinoise|Esthétique dans la pensée chinoise]]
:Chose
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:Civilisation
:''Clinamen''
:''{{MotPhilo|Cogito}}''
:[[Dictionnaire de philosophie/Concept|Concept]]
:[[Dictionnaire de philosophie/Connaissance|Connaissance]]
:[[Dictionnaire de philosophie/Conscience|Conscience]]
:{{Page|Consensus}}
:Contemplation
:[[Dictionnaire de philosophie/Contingence|Contingence]]
:Contradiction
:Contrat
:[[Dictionnaire de philosophie/Convention|Convention]]
:[[Dictionnaire de philosophie/Courage|Courage]]
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:{{Page|Criticisme}}
:[[Dictionnaire de philosophie/Croyance|Croyance]]
:[[Dictionnaire de philosophie/Culture|Culture]]
:Cynisme
</div>
</div>
{{PhiloRecherche}}
{{Autocat}}
1gbo84023ukwjsvkc5xgf277yoa0r05
Dictionnaire de philosophie/Déisme
0
37433
768285
753990
2026-06-22T03:29:57Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768285
wikitext
text/x-wiki
{{DicoPhilo|Déisme|lecture=oui}}
Terme créé au XVIe par les sociniens (qui nient la divinité du christ) pour se distinguer des athées. Très répandu au XVIIIe, le déisme rejette les dogmes, la révélation, les rites et croyances traditionnelles de la religion instituée. Il admet l'existence d'un Dieu créateur, ou Être suprême, et hérite d'une structure [[Philosophie/Monothéisme|monothéique]] (un Dieu, unique et transcendant). Issu d'une culture chrétienne, le déisme dépouille la divinité de ses aspects traditionnels pour ne conserver qu'un dieu fortement abstrait. Synonyme de religion naturelle, le déisme est en relation complexe avec le [[Philosophie/Théisme|théisme]], soit qu'on l'y ramène (synonymie), soit qu'on les distingue tout en les rapprochant. Le théisme étant alors pensé comme plus développé que le déisme. On dit Voltaire aussi bien déiste que théiste selon les sources. Note par ailleurs que Hume utilise « déisme » comme un euphémisme désignant l'athéisme.
==Bibliographie==
*{{RLivre|Dictionnaire de philosophie|2-213-62116-0|auteurs=Christian Godin|annee=2004|editeur=fayard|pages=1534|langue=fr}}
*{{RLivre|Dictionnaire de philosophie|2-200-26986-2|soustitre=3e édition|auteurs=Noëlla Baraquin, Anne Baudart, Jean Dugué, Jacqueline Lafitte, François Ribes, Joël Wilfert|annee=2007|editeur=Armand Colin|pages=375|langue=fr}}
*{{RLivre|La pratique de la philosophie de A à Z|2-218-73072-3|auteurs=Elisabeth Clément|annee=2000|editeur=Hatier|pages=479|langue=fr}}
*{{RLivre|Nouveau vocabulaire de la philosophie et des sciences humaines|2-200-26981-1|soustitre=3e édition, retirage avec corrections|auteurs=Louis-Marie Morfaux, Jean Lefranc|annee=2007|editeur=Armand Colin|pages=604|langue=fr}}
{{AutoCat}}
bso6f34vkzr61soy4npyiat3yytyky1
MySQL/Fonctions
0
56770
768243
758640
2026-06-21T12:57:23Z
JackPotte
5426
/* LENGTH(chaine) */
768243
wikitext
text/x-wiki
<noinclude>{{MySQL}}</noinclude>
== Syntaxe ==
À l'instar des mots réservés SQL, les noms des fonctions ne sont pas sensibles à la casse :
<syntaxhighlight lang=sql>
SELECT database() -- ok
SELECT DataBase() -- ok
SELECT DATABASE() -- ok
</syntaxhighlight>
Si le SQL_MODE IGNORE_SPACE SQL_MODE n'est pas défini, il est impossible de placer un espace entre le no de la fonction et la première parenthèse, sous peine de voir une erreur 1064. IGNORE_SPACE est généralement à 0, car cela accélère le parseur. Donc :
<syntaxhighlight lang=sql>
SELECT DATABASE () -- déconseillé
SELECT DATABASE() -- recommandé
</syntaxhighlight>
Toutefois, cette restriction ne s'applique qu'aux fonctions natives de MySQL (pas aux procédures stockées).
== Fonctions générales ==
Fonctions qui dépendent du type.
=== BENCHMARK(nombre, expression) ===
Exécute l'expression n fois et retourne toujours zéro<ref>http://dev.mysql.com/doc/refman/5.0/fr/information-functions.html</ref>, le chiffre pertinent est donc le temps pris par cette opération de simulation. Utile pour trouver les goulots d'étranglement des expressions SQL :
<pre>
SELECT BENCHMARK(10000, 'Bonjour'); -- Traitement en 0.0010 sec
</pre>
=== CAST(valeur AS type) ===
Renvoie la valeur convertie en chaine de caractères, comme les apostrophes.
<pre>
SELECT CAST(20130101 AS date); -- 2013-01-01
</pre>
Exemple avec encodage<ref>https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html</ref> :
<pre>
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;
</pre>
{{attention|1=
<pre>
SELECT CAST(0.1 as FLOAT), -- 0.1
0.1 = 0.1, -- 1
CAST(0.1 as FLOAT) = 0.1; -- 0
</pre>
}}
=== CHAR_LENGTH(chaine) ===
Renvoie le nombre de caractères de la chaine :
<pre>
SELECT CHARSET(20130101); -- 8
SELECT CHARSET('Hello'); -- 5
</pre>
=== CHARSET(chaine) ===
Renvoie le type de caractères de la chaine :
<pre>
SELECT CHARSET(20130101); -- binary
SHOW CHARACTER SET; -- montre tous les CHARACTER SET installés
</pre>
=== COALESCE(valeur, ...) ===
Renvoie le premier paramètre non nul. S'ils sont tous nuls, renvoie <code>NULL</code>.
<pre>
SELECT COALESCE(null, 'Bonjour', null); -- bonjour
</pre>
=== COERCIBILITY(chaine) ===
Renvoie la ''{{wt|coercibility}}'' d'une chaine (entre 0 et 5) :
<pre>
SELECT COERCIBILITY('bonjour'); -- 4
</pre>
{|class="wikitable"
!Coercibility<ref>http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_coercibility</ref>!! Signification !! Exemple
|-
| 0 || Explicit collation || Value with COLLATE clause
|-
| 1 || No collation || Concatenation of strings with different collations
|-
| 2 || Implicit collation || Column value
|-
| 3 || System constant || USER() return value
|-
| 4 || Coercible || Literal string
|-
| 5 || Ignorable || NULL or an expression derived from NULL
|}
=== COLLATION(chaine) ===
Renvoie la ''{{wt|collation}}'' d'une chaine :
<pre>
SELECT COLLATION('bonjour'); -- utf8_general_ci
</pre>
Pour obtenir celle par défaut d'une base :
<pre>
SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'maBase1'
</pre>
=== CONCAT() ===
Concaténation sans séparateur :
<pre>
SELECT CONCAT('Hello', 'World');
# HelloWorld
</pre>
=== CONCAT_WS() ===
Concaténation avec séparateur de son choix :
<pre>
SELECT CONCAT_WS(', ', 'Hello', 'World');
# Hello, World
</pre>
=== CONNECTION_ID() ===
Renvoie l'identifiant du thread courant :
<pre>
SELECT CONNECTION_ID(); -- 31
</pre>
=== CONVERT(valeur, type) ===
Tout comme <code>CAST()</code>, retourne la valeur convertie dans le type mentionné :
<pre>
SELECT CONVERT (20130101, date); -- 2013-01-01
</pre>
=== CONVERT(chaine USING charset) ===
Convertit la chaine string passée dans le CHARACTER SET spécifié :
<pre>
SELECT CONVERT ('Voici une écriture' USING utf8); -- Voici une écriture
SELECT CONVERT ('Voici une écriture' USING ASCII); -- Voici une ?criture
</pre>
=== CURRENT_USER() ===
Retourne les noms de l'utilisateur et de l'hôte courants :
<pre>
SELECT CURRENT_USER(); -- root@localhost
</pre>
=== DATABASE() ===
Retourne le nom de la base de données courante :
<pre>
SELECT DATABASE(); -- wiki1
</pre>
=== FOUND_ROWS() ===
Après un <code>SELECT</code> avec une <code>LIMIT</code> et le mot clé <code>SQL_CALC_FOUND_ROWS</code>, il est possible de lancer un autre <code>SELECT</code> avec <code>FOUND_ROWS()</code>. En effet il renvoie le nombre de ligne de la clause précédente, sans la limite :
<pre>
SELECT FOUND_ROWS() AS n; -- 0
SELECT SQL_CALC_FOUND_ROWS * FROM wiki1_page ORDER BY page_id LIMIT 10 OFFSET 2; -- deux lignes
SELECT FOUND_ROWS() AS n; -- 1
</pre>
=== GREATEST(valeur1, valeur2, ...) ===
Renvoie la plus grande valeur des paramètres :
<pre>
SELECT GREATEST(1, 2, 21, 3); -- 21
</pre>
=== INTERVAL(valeur1, valeur2, valeur3, ...) ===
Renvoie l'emplacement du premier argument supérieur au premier, en partant du zéro dans la liste des entiers en paramètres :
<pre>
SELECT INTERVAL(10, 20, 9, 8, 7); -- 0
SELECT INTERVAL(10, 9, 20, 8, 7); -- 1
SELECT INTERVAL(10, 9, 8, 20, 7); -- 2
SELECT INTERVAL(10, 9, 8, 7, 20); -- 3
</pre>
=== IF(valeur1, valeur2, valeur3) ===
If ''valeur1'' est vraie, renvoie ''valeur2'', sinon (fausse ou nulle) renvoie ''valeur3''.
<pre>
select if(1=2, 'irréel', 'réel'); -- réel
</pre>
=== IFNULL(valeur1, valeur2) ===
Si ''valeur1'' est nulle, renvoie ''valeur2'', sinon ''valeur1''.
<pre>
SELECT IFNULL('variable1', 'défaut'); -- variable1
</pre>
=== ISNULL(valeur) ===
Si la valeur passée est nulle, renvoie 1, sinon 0.
<pre>
SELECT ISNULL('variable1'); -- 0
</pre>
=== NULLIF(valeur1, valeur2) ===
Renvoie <code>NULL</code> si valeur1 = valeur2, sinon valeur1.
<pre>
SELECT NULLIF(10, 20); -- 10
</pre>
=== LAST_INSERT_ID() ===
Renvoie le dernier ID en AUTO_INCREMENT inséré dans la base, ce qui évite un SELECT lorsque l'on a besoin d'insérer deux enregistrements dont la deuxième avec une clé étrangère vers la première.
=== LEAST(valeur1, valeur2, ...) ===
Renvoie la plus petite valeur dans la liste des paramètres passés :
<pre>
SELECT LEAST(1, 2, 21, 3, -1); -- -1
</pre>
=== LENGTH(chaine) ===
Affiche la taille d'une chaine de caractères en octets.
{{attention|Pour avoir le nombre de caractères, utiliser <code>CHAR_LENGTH</code>.}}
=== LOCATE(sous-chaine, chaine) ===
Affiche la première position d'une sous-chaine dans une chaine de caractères.
=== REPLACE(chaine, 'sous-chaine à remplacer', 'par') ===
<pre>
SELECT REPLACE('helloworld', 'o', ''); -- hellwrld
</pre>
=== SUBSTR(chaine, début, taille) ===
Son alias "substring()" fonctionne aussi.
Découpe une chaine de caractère. Ex :
<pre>
SELECT SUBSTR('Hello World!', 7, 5); -- World
SELECT SUBSTR('Hello World!', -6); -- World!
</pre>
=== SUBSTRING_INDEX ===
Découpe une chaine selon un séparateur. Le troisième paramètre désigne la énième occurrence de ce dernier :
<pre>
SELECT SUBSTRING_INDEX('Hello World!', ' ', 1);
# Hello
SELECT SUBSTRING_INDEX('Hello World!', ' ', 2);
# Hello World!
</pre>
=== Fonctions JSON ===
MySQL (et MariaDB<ref>https://mariadb.com/kb/en/json_search/</ref>) offrent plusieurs fonctions de manipulation de champ varchar contenant du JSON.
==== JSON_VALID ====
Renvoie vrai si le champ est un JSON valide, faux sinon.
==== JSON_UNQUOTE ====
Retire les guillemets au début et à la fin d'une chaine (pour l'utiliser dans un JSON sans qu'ils soient interprétés). Ex :
<pre>
SELECT JSON_UNQUOTE('"1"');
-- 1
</pre>
==== JSON_KEYS ====
Renvoie toutes les clés du JSON en paramètre.
==== JSON_EXTRACT ====
Extrait un morceau du JSON par sa clé. Ex :
<pre>
SET @json = '{"1": "2", "3": "4"}';
SELECT JSON_EXTRACT(@json, '$.1');
-- "2"
</pre>
Cette fonction est combinable avec JSON_UNQUOTE pour les recherches dans des données JSON<ref>https://www.startutorial.com/articles/view/how-to-search-json-data-in-mysql</ref>.. Ex :
<pre>
SELECT JSON_UNQUOTE(JSON_EXTRACT(varchar_avec_json,'$.ma_clé')) AS ma_clé FROM users;
</pre>
==== JSON_SEARCH ====
Retourne les clés correspondant à la valeur recherchée. Son deuxième paramètre peut être "one" pour la première clé, ou "all" pour toutes. Ex :
<pre>
SET @json = '{"1": "2", "3": "4"}';
SELECT JSON_SEARCH(@json, 'one', '4');
-- "$.3"
</pre>
==== JSON_VALUE ====
Retourne la valeur à partir de la clé en paramètre.
==== JSON_CONTAINS ====
Renvoie 1 si la JSON contient la valeur en paramètre, ou 0 sinon.
==== JSON_REMOVE ====
Retire la paire clé/valeur de la clé passée en paramètre.
== Date et heure ==
Il existe des dizaines de fonctions liées aux dates<ref>https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html</ref>.
Pour trouver la date de l'an dernier :
<syntaxhighlight lang=sql>
SELECT CURDATE() - INTERVAL 1 YEAR
</syntaxhighlight>
Sélectionner toutes les pages du wiki non lues depuis plus un an :
<syntaxhighlight lang=sql>
SELECT * FROM wiki1_page
WHERE page_touched <= (CURDATE() - INTERVAL 1 YEAR);
</syntaxhighlight>
Autres exemples de sélections :
<syntaxhighlight lang=sql>
SELECT IF(DAYOFMONTH(CURDATE()) <= 15,
DATE_FORMAT(CURDATE(), '%Y-%m-15'),
DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-15')) AS next15
FROM table;
SELECT YEAR('2002-05-10'), MONTH('2002-05-10'), DAYOFMONTH('2002-05-10')
SELECT PurchaseDate FROM table WHERE YEAR(PurchaseDate) <= YEAR(CURDATE())
SELECT columns FROM table
WHERE start_time >= '2004-06-01 10:00:00' AND end_time <= '2004-06-03 18:00:00'
SELECT * FROM t1
WHERE DATE_FORMAT(datetime_column, '%T') BETWEEN 'HH:MM:SS' AND 'HH:MM:SS'
SELECT Start_time, End_time FROM Table
WHERE Start_time >= NOW() - INTERVAL 4 HOUR
SELECT NOW() + INTERVAL 60 SECOND
SELECT UNIX_TIMESTAMP('2007-05-01'); -- 1177970400
SELECT FROM_UNIXTIME(1177970400); -- 2007-05-01 00:00:00
</syntaxhighlight>
{{Attention|<code>convert('17/02/2016 15:49:03',datetime)</code> ou <code>convert('17-02-2016 15:49:03',datetime)</code> donne ''null'', donc une requête d'insertion le remplace par le même résultat que <code>now()</code>. La syntaxe doit être <code>convert('2016-02-17 15:49:03',datetime)</code> ou <code>convert('2016/02/17 15:49:03',datetime)</code>.}}
=== DATE_ADD() ===
Pour additionner deux dates. Par exemple pour calculer le jour d'une livraison prenant 48 h :
SELECT DATE_ADD(NOW(), INTERVAL 2 DAY)
Pour la date d'hier :
SELECT DATE_ADD(NOW(), INTERVAL -1 DAY)
Les unités à additionner ou soustraire les plus courantes sont<ref>https://www.w3schools.com/sql/func_mysql_date_add.asp</ref> :
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
YEAR
=== DATEDIFF() ===
Pour soustraire une date à une autre. Par exemple pour calculer un âge :
<pre>
SELECT DATEDIFF(NOW(), birthday_date) / 365
FROM user
WHERE ISNULL(birthday_date) = 0 AND birthday_date != '0000-00-00'
</pre>
=== STR_TO_DATE() ===
Un BETWEEN ou ">" de champ date avec une chaine de caractères ne marche pas. Il faut donc convertir la chaine en date :
<pre>
SELECT * FROM my_table WHERE start_date > STR_TO_DATE('2024-08-10', '%Y-%m-%d')
</pre>
== Fonctions d'agrégation ==
===COUNT(champ)===
Si le paramètre est "*" au lieu d'un nom de colonne, <code>COUNT()</code> renvoie les nombre de lignes total de la requête. Cela peut permettre de savoir combien de lignes possède une table, par exemple le nombre de pages d'un wiki :
<syntaxhighlight lang=mysql>
SELECT COUNT(*) FROM `wiki1_page`;
</syntaxhighlight>
Si le mot <code>DISTINCT</code> est employé, cela ignore les doublons :
<syntaxhighlight lang=mysql>
SELECT COUNT(DISTINCT id) FROM `wiki1_page`;
</syntaxhighlight>
Si le nom d'un champ est précisé, cela renvoie le nombre de valeurs non nulles :
<syntaxhighlight lang=mysql>
SELECT COUNT(`user_real_name`) FROM `wiki1_user`;
SELECT COUNT(DISTINCT `user_real_name`) FROM `wiki1_user`;
</syntaxhighlight>
Cela fonctionne aussi pour des expressions, des combinaisons de champs :
<syntaxhighlight lang=mysql>
SELECT COUNT(`user_name` + `user_real_name`) FROM `wiki1_user`;
</syntaxhighlight>
Pour afficher le décompte de plusieurs tables non jointes :
<syntaxhighlight lang=mysql>
SELECT
(SELECT COUNT(*) FROM maTable1) as t1,
(SELECT COUNT(*) FROM maTable2) as t2
</syntaxhighlight>
=== MAX(champ) ===
<code>MAX()</code> renvoie la valeur maximum d'une expression issue du résultat d'une requête, ou <code>NULL</code> s'il n'y en a pas :
<syntaxhighlight lang=sql>
SELECT MAX(`user_editcount`) FROM `wiki1_user`;
SELECT MAX(LENGTH(CONCAT(`user_name`, ' ', `user_real_name`))) FROM `wiki1_user`;
</syntaxhighlight>
==== Alternatives ====
Selon le contexte, la fonction <code>MAX()</code> n'est pas toujours la meilleure option pour obtenir un maximum. Par exemple en cas de sous-requêtes ou sans agrégation possible :
* <code>SELECT `user_editcount` FROM `wiki1_user` ORDER BY user_editcount DESC LIMIT 1;</code>
* <syntaxhighlight lang=mysql>
SELECT `user_editcount`
FROM `wiki1_user` wu1
LEFT JOIN `wiki1_user` wu2 ON wu1.user_editcount > wu2.user_editcount
WHERE wu2.user_editcount is null;
</syntaxhighlight>
===MIN(champ)===
MIN() renvoie la valeur minimum d'une expression issue du résultat d'une requête, ou <code>NULL</code> s'il n'y en a pas :
<syntaxhighlight lang=sql>
SELECT MIN(`user_editcount`) FROM `wiki1_user`;
SELECT MIN(LENGTH(CONCAT(`user_name`, ' ', `user_real_name`))) FROM `wiki1_user`;
</syntaxhighlight>
===AVG(champ)===
<code>AVG()</code> renvoie la valeur moyenne d'une expression, ou <code>NULL</code> s'il n'y en a pas :
* Moyenne des valeurs d'un champ entier :
<pre>
SELECT AVG(`user_editcount`) FROM `wiki1_user`;
</pre>
* Moyenne des valeurs d'un champ date :
<pre>
SELECT from_unixtime(avg(unix_timestamp(`user_registration`))) FROM `wiki1_user`;
</pre>
* Moyenne d'un total obtenu par COUNT :
<pre>
SELECT
AVG(p.nb) as moyenne
FROM (
SELECT count(*) as nb
FROM wiki1_user
where user_editcount > 1000
group by user_country
) as p;
</pre>
===SUM(champ)===
<code>SUM()</code> dresse la somme des valeurs d'une expression, ou <code>NULL</code> s'il n'y en a pas.
Si <code>SUM(DISTINCT expression)</code> est utilisé, les valeurs identiques ne sont ajoutées qu'une seule fois. Il a été ajouté après MySQL 5.1.
<syntaxhighlight lang=sql>
SELECT SUM( DISTINCT user_editcount )
FROM wiki1_user
</syntaxhighlight>
{{Attention|Cette fonction est impactée quand on ajoute des <code>LEFT JOIN</code> dans la même requête. Il faut alors les séparer dans des sous-requêtes.}}
===GROUP_CONCAT(champ)===
<code>GROUP_CONCAT()</code> concatène les valeurs de tous les enregistrements d'un groupe dans une seule chaine séparée par une virgule par défaut. En effet, le deuxième paramètre facultatif permet de définir un autre séparateur.
<syntaxhighlight lang=sql>
CREATE TEMPORARY TABLE product (
id INTEGER, product_type VARCHAR(10), product_name VARCHAR(50)
);
INSERT INTO product VALUES
(1, 'mp3', 'iPod'),
(2, 'mp3', 'Zune'),
(3, 'mp3', 'ZEN'),
(4, 'notebook', 'Acer Eee PC'),
(4, 'notebook', 'Everex CloudBook');
SELECT * FROM product;
SELECT product_type, group_concat(product_name), group_concat(' ', product_name)
FROM product
GROUP BY product_type;
/*
# product_type, group_concat(product_name), group_concat(' ', product_name)
'mp3', 'iPod,Zune,ZEN', ' iPod, Zune, ZEN'
'notebook', 'Acer Eee PC,Everex CloudBook', ' Acer Eee PC, Everex CloudBook'
*/
</syntaxhighlight>
=== Fonctions d'agrégation de bit ===
Syntaxe générale :
FUNCTION_NAME(''expression'')
Ces fonctions bit à bit calculent ''expression'' pour chaque ligne du résultat et entre les ''expression''s. La précision est de 64 bit.
==== AND ====
<syntaxhighlight lang=sql>
SELECT BIT_AND(ip) FROM log
</syntaxhighlight>
==== OR ====
<syntaxhighlight lang=sql>
SELECT BIT_OR(ip) FROM log
</syntaxhighlight>
(retourne 0 s'il n'y a aucun résultat)
==== XOR ====
<syntaxhighlight lang=sql>
SELECT BIT_XOR(ip) FROM log
</syntaxhighlight>
(retourne 0 s'il n'y a aucun résultat)
== Références ==
{{Références}}
[[en:MySQL/Language/Functions]]
klfeluk04c97v3kpzrv58f9dehrl5qz
Les cartes graphiques/Les Render Output Target
0
67394
768244
764891
2026-06-21T13:35:30Z
Mewtow
31375
/* Le traitement parallèle des fragments sur les GPU sort-last */
768244
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Un des premiers jeux vidéo à l'avoir utilisé était DOOM 3, sur PC et console XBOX. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude, du fait de ses défauts. Elle a beau créer des ombres très précises et consommer peu de mémoire, elle demande de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un volume d'ombre : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Les difficultés sont assez nombreuses. Déjà, il faut délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal. Ensuite, il faut tenir compte du cas où plusieurs ombres se recouvrent. Et ces calculs là sont réalisés sur le GPU.
Une implémentation classique utilise pour cela le fameux tampon de ''stencil'' abordé plus haut. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
dpdtidxvm0q1vrrliqbb9ketrdjma5l
768245
768244
2026-06-21T13:44:16Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768245
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un volume d'ombre : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Mais les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Par exemple, délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Plus haut, nous avons décrit comment sont extrudés les volumes d'ombres, ce qui était fait sur le CPU. Mais il faut tenir compte du cas où plusieurs ombres se recouvrent. Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
qec1634g5so39po1hw8ouu3f6r6ztli
768246
768245
2026-06-21T13:44:25Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768246
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Mais les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Par exemple, délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Plus haut, nous avons décrit comment sont extrudés les volumes d'ombres, ce qui était fait sur le CPU. Mais il faut tenir compte du cas où plusieurs ombres se recouvrent. Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
tsti0s67wouglp1ulgg5bcutctkzc7p
768248
768246
2026-06-21T13:46:42Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768248
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. Puis, les deux sont combinées de manière à appliquer les ombres. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Mais les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Par exemple, délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Plus haut, nous avons décrit comment sont extrudés les volumes d'ombres, ce qui était fait sur le CPU. Mais il faut tenir compte du cas où plusieurs ombres se recouvrent. Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
9iqvdufnxyxq06erwr6n1y4w2wr3l1k
768249
768248
2026-06-21T13:49:03Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768249
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Mais les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Par exemple, délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Plus haut, nous avons décrit comment sont extrudés les volumes d'ombres, ce qui était fait sur le CPU. Mais il faut tenir compte du cas où plusieurs ombres se recouvrent. Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
jdoia77gf3mit5k9v08q4skdupenaiy
768250
768249
2026-06-21T13:49:48Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768250
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Délimiter la silhouette de l'objet, et délimiter les volumes d'ombres. Les deux taches étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée.
Plus haut, nous avons décrit comment sont extrudés les volumes d'ombres, ce qui était fait sur le CPU. Mais il faut tenir compte du cas où plusieurs ombres se recouvrent. Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
h8h2g0srjb3tnoenif9r84fduhfwvbr
768251
768250
2026-06-21T14:12:56Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768251
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
Une implémentation théorique procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
r8t72cs0sw9rfsr3bqrshetf7kvhh1x
768252
768251
2026-06-21T14:14:16Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768252
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
Une implémentation théorique procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
epa17zvye6wui4595kyj511w4ts6rqu
768253
768252
2026-06-21T14:23:48Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768253
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
Une implémentation théorique procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée pour savoir si les volumes d'ombres sont situés devant ou derrière l'objet à rendre. L’image est donc rendue une seconde fois, avec les volumes d'ombre considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté.
Le problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre. Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
tw0yuflj6euikbttb9pzelkt58fbu6w
768254
768253
2026-06-21T14:24:41Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768254
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===Le ''depth pass/fail''===
Une implémentation théorique procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée pour savoir si les volumes d'ombres sont situés devant ou derrière l'objet à rendre. L’image est donc rendue une seconde fois, avec les volumes d'ombre considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté.
Le problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre. Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
===L'implémentation sur le GPU===
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
h0xql3yrwh87nz3y0p0bjhj0s84paok
768255
768254
2026-06-21T14:34:40Z
Mewtow
31375
/* Le depth pass/fail */
768255
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L'implementation de type ''depth pass===
Une implémentation théorique procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. Précisons que le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===L'implémentation sur le GPU===
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
93hbo72qky9dhen534ze035qgaaq6yc
768256
768255
2026-06-21T14:41:49Z
Mewtow
31375
/* L'implementation de type depth pass */
768256
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. Précisons que le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===L'implémentation sur le GPU===
Délimiter la silhouette de l'objet et délimiter les volumes d'ombres étaient réalisées sur le CPU dans les jeux vidéo qui utilisaient cette technique. Il est potentiellement possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais un simple ''vertex shader'' aura du mal.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
mtikx157yrdfda1oojuv52raz9a2x8l
768257
768256
2026-06-21T14:45:46Z
Mewtow
31375
/* L'implémentation sur le GPU */
768257
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. Précisons que le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===L'implémentation sur le GPU===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
4f7o5x88y5ds7krf3wbezju4o4nrouz
768258
768257
2026-06-21T14:51:48Z
Mewtow
31375
/* L'implémentation sur le GPU */
768258
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, le tampon de ''stencil'' contient un compteur par pixel. Il est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente le compteur, la sortie le décrémente. Le pixel est dans l'ombre si ce compteur a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est de rendre la scène en deux fois, afin de compter les entrées dans les volumes d'ombre séparément des sorties de volume d'ombre. Un volume d'ombre est considéré comme un volume géométrique transparent. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. Précisons que le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''.
L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les avantages et inconvénients des ombres volumétriques===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
===L'implémentation sur le GPU===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
4qtwpzpew7flck55ys714m4ikkotl2e
768259
768258
2026-06-21T14:54:00Z
Mewtow
31375
/* L’implémentation de type depth pass */
768259
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les avantages et inconvénients des ombres volumétriques===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
===L'implémentation sur le GPU===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
7z4b3n23yb11kmmb942vbc91ra6a77a
768260
768259
2026-06-21T14:56:42Z
Mewtow
31375
/* L'implémentation sur le GPU */
768260
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les avantages et inconvénients des ombres volumétriques===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
===L'implémentation sur le GPU===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
erex40xnto0s8qecfzlm9f1ggjleoel
768261
768260
2026-06-21T15:00:03Z
Mewtow
31375
/* L'implémentation sur le GPU */
768261
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les avantages et inconvénients des ombres volumétriques===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
===L'implémentation sur le GPU===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une autre optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soit le ''back-face culling'' ou le ''front-face culling'' activé.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
h2kr4p5kuimc7b3u412uawnns2qqo98
768262
768261
2026-06-21T15:15:44Z
Mewtow
31375
/* L'implémentation sur le GPU */
768262
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les avantages et inconvénients des ombres volumétriques===
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Pourtant, les ombres volumétriques ont des avantages. Déjà, vu que les calculs d'ombres sont réalisés au niveau géométrique, les ombres crées sont très précises. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même.
Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Le fait que l'algorithme est fondamentalement en plusieurs passes, avec une pré-passe z, n'aide pas les performances. Le calcul des ombres volumétriques fait beaucoup de lectures dans le tampon de profondeur. Un autre défaut est que délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
===L'implémentation sur le GPU===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une autre optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soit le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
jg31bhoccbgep7q1tipvykjcpfdtz51
768263
768262
2026-06-21T15:28:28Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768263
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres crées sont très précises, précises au pixel près. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques. La première est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une autre optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soit le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques.
Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
as8n2txnlg10unh8s9mcvcnzv0zmox6
768264
768263
2026-06-21T15:30:18Z
Mewtow
31375
/* Les optimisations matérielles des ombres volumétriques */
768264
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volémétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres crées sont très précises, précises au pixel près. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soit le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
b29uzbt60ku6bemymvgqth79eb5uhxg
768265
768264
2026-06-21T16:51:10Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768265
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique qui calcule les ombres dans une scène. Contrairement aux techniques comme les ''shadowmaps'', elle effectue un calcul des ombres au niveau géométrique, à savoir que le moteur 3D détermine une ombre en vraie 3D, dans l'espace. Il est intéressant de voir ces ombres volumétriques, pour plusieurs raisons. Premièrement, les implémentations utilisées dans les jeux vidéos utilisaient le fameux tampon de ''stencil'' abordé plus haut, ce qui fait qu'elles font un bon exemple d'utilisation de cette fonctionnalité. De plus, les anciens GPUs des années 2000 implémentaient des optimisations spécifiquement dédiées aux ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont très précises, précises au pixel près. Elles n'ont pas les limitations des ''shadowmaps'', dont la précision est limitée par la résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
ibtxawk1h6r3nf7j1akog2kl7uov0yy
768266
768265
2026-06-21T16:56:58Z
Mewtow
31375
/* Annexe : les ombres volumétriques */
768266
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique de calcul des ombres dans une scène. Il est intéressant de les étudier, pour plusieurs raisons. Premièrement, elles sont un bon exemple d'utilisation du tampon de ''stencil'' abordé plus haut. Deuxièmement, les anciens GPUs des années 2000 implémentaient des optimisations pour les ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont précises au pixel près, contrairement aux ''shadowmaps'' qui sont limitées par leur résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Ce cout en performance fait que les jeux modernes leur préférent les ''shadowmaps''.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Le ''depth pass'' procède comme suit. Pour chaque pixel, le moteur du jeu tire un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
dntajj0pce5czcz6ivk5qbgkrhy6ku6
768267
768266
2026-06-21T16:57:55Z
Mewtow
31375
/* L’implémentation de type depth pass */
768267
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique de calcul des ombres dans une scène. Il est intéressant de les étudier, pour plusieurs raisons. Premièrement, elles sont un bon exemple d'utilisation du tampon de ''stencil'' abordé plus haut. Deuxièmement, les anciens GPUs des années 2000 implémentaient des optimisations pour les ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont précises au pixel près, contrairement aux ''shadowmaps'' qui sont limitées par leur résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Ce cout en performance fait que les jeux modernes leur préférent les ''shadowmaps''.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Imaginons un rayon partant de la caméra, qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
n135f02k8491yg7o2mm7nj6omrrdwcq
768268
768267
2026-06-21T16:58:16Z
Mewtow
31375
/* L’implémentation de type depth pass */
768268
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique de calcul des ombres dans une scène. Il est intéressant de les étudier, pour plusieurs raisons. Premièrement, elles sont un bon exemple d'utilisation du tampon de ''stencil'' abordé plus haut. Deuxièmement, les anciens GPUs des années 2000 implémentaient des optimisations pour les ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont précises au pixel près, contrairement aux ''shadowmaps'' qui sont limitées par leur résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Ce cout en performance fait que les jeux modernes leur préférent les ''shadowmaps''.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Le tout donnera deux images finales : une image éclairée, une image ombrée. L'image éclairée est calculée en ne tenant pas compte des volumes d'ombre, on part du principe que les sources de lumière éclairent tout et que les objets sont transparents. Inversement, la scène ombrée est calculée avec les sources de lumière éteintes. Puis, les deux sont combinées de manière à appliquer les ombres.
Et c'est là que le tampon de ''stencil'' et les optimisations mentionnées plus haut interviennent. Un test utilisant le tampon de ''stencil'' détermine quels pixels de l'écran sont dans l'ombre, et lesquels ne le sont pas. Les pixels dans l'ombre utiliseront les pixels dans l'image ombrée, les pixels éclairés utiliseront l'image éclairée. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : pour chaque pixel à l'écran, le ''stencil test'' associera la valeur zéro s'il est éclairé, une valeur positive s'il est dans l'ombre.
===L’implémentation de type ''depth pass===
Imaginons que le moteur de jeu tire, pour chaque pixel, un rayon partant de la caméra et qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
r1wwp73e08brs49ev3c10dr6acjbx8h
768269
768268
2026-06-21T16:59:25Z
Mewtow
31375
/* Les ombres volumétriques : principe */
768269
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique de calcul des ombres dans une scène. Il est intéressant de les étudier, pour plusieurs raisons. Premièrement, elles sont un bon exemple d'utilisation du tampon de ''stencil'' abordé plus haut. Deuxièmement, les anciens GPUs des années 2000 implémentaient des optimisations pour les ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont précises au pixel près, contrairement aux ''shadowmaps'' qui sont limitées par leur résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Ce cout en performance fait que les jeux modernes leur préférent les ''shadowmaps''.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Les deux sont combinées de manière à appliquer les ombres. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : le tampon de ''stencil'' indique, pour chaque pixel, s'il est dans l'ombre ou non.
===L’implémentation de type ''depth pass===
Imaginons que le moteur de jeu tire, pour chaque pixel, un rayon partant de la caméra et qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
a29ksdw74h2m2jxf0u66kv0slhp71nx
768270
768269
2026-06-21T17:00:21Z
Mewtow
31375
/* Les ombres volumétriques : principe */
768270
wikitext
text/x-wiki
Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection.
Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc.
Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo.
==Les fonctions des ROP==
Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités.
===Le mélange ''alpha'' et le ''z-buffer''===
Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés).
Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''.
Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10.
Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée.
Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents.
===Le tampon de ''stencil''===
Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres.
Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci.
Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment.
===Les fonctions héritées des ''blitters'' 2D===
Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D.
Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels.
==L'architecture matérielle d'un ROP==
Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués.
Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats.
Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents.
[[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]]
Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge).
Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''.
===Le ''fast clear'' du ''framebuffer''===
Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer.
Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs.
Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans.
Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire.
===La z-compression===
La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation'').
Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre.
Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire.
[[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]]
Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant.
Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''.
===Le cache de profondeur===
Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent.
Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache.
Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis.
===Le ''z-fast pass''===
Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes.
L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude.
Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''.
Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation.
==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?==
Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes.
Par exemple, le ''z-test'' demande de faire plusieurs étapes :
* calculer l'adresse du pixel dans le tampon de profondeur ;
* lire le pixel dans le tampon de profondeur ;
* Faire la comparaison entre profondeurs ;
* Si le résultat de la comparaison est okay :
** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans.
Le mélange ''alpha'' demande lui de :
* calculer l'adresse du pixel dans le ''framebuffer'' ;
* lire le pixel dans le ''framebuffer'' ;
* faire des additions et multiplications pour le mélange ''alpha'' :
* écrire le nouveau pixel dans le ''framebuffer''.
Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela.
===Les GPU de type ''sort-last'' doivent "trier les pixels"===
Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps !
Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement.
[[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]]
Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs.
Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre.
Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''.
===Le traitement parallèle des fragments sur les GPU ''sort-last''===
Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders.
Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances.
Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité.
L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders.
Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite.
==Annexe : les ombres volumétriques==
Les '''ombres volumétriques''', ou ''Shadow Volumes'' en anglais, sont une technique de calcul des ombres dans une scène. Il est intéressant de les étudier, pour plusieurs raisons. Premièrement, elles sont un bon exemple d'utilisation du tampon de ''stencil'' abordé plus haut. Deuxièmement, les anciens GPUs des années 2000 implémentaient des optimisations pour les ombres volumétriques, qu'il est intéressant d'étudier pour leur intérêt historique.
Un des premiers jeux vidéo à avoir utilisé des ombres volumétriques était DOOM 3. La technique a été utilisée dans d'autres jeux, mais est tombée en désuétude. Il faut dire que ses avantages ne compensent pas ses inconvénients. Niveau avantages, les ombres créés sont précises au pixel près, contrairement aux ''shadowmaps'' qui sont limitées par leur résolution. Elles consomment peu de mémoire, vu qu'elles n'utilisent pas de textures pour les ombres. Enfin, un objet 3D va automatiquement projeter une ombre sur lui-même. Cependant, les ombres volumétriques demandent de faire beaucoup de calculs sur le processeur et a des performances très variables d'une scène 3D à l'autre. Ce cout en performance fait que les jeux modernes leur préférent les ''shadowmaps''.
===Les ombres volumétriques : principe===
Les ombres volumétriques font les calculs d'ombre pour chaque source de lumière et chaque objet présent dans une scène 3D. Du moins, chaque objet pouvant être éclairé par la source de lumière, le moteur du jeu vidéo fait la liste des objets concernés pour chaque source de lumière, et les calculs commencent. Pour chaque objet, le moteur détermine sa silhouette, vue depuis la source de lumière. Puis, pour chaque sommet de cette silhouette, il tire un trait partant de la source de lumière, passant par ce sommet, et de longueur infinie. L’ensemble des traits/plans délimite un '''volume d'ombre''' : tout pixel dans ce volume d'ombre sera dans l'ombre de cet objet, pour la source de lumière considérée.
Délimiter les volumes d'ombres était réalisé sur le CPU, du moins dans les jeux vidéo qui utilisaient cette technique. Il est possible de le faire sur le GPU, avec des ''geometry shaders'' ou des ''shaders'' plus élaborés, mais la technique a été abandonnée avant que cette possibilité soit utilisée.
[[File:Shadow volume illustration.png|centre|vignette|upright=2|Ombre volumétrique, source de lumière ponctuelle au centre.]]
Une implémentation naïve rend la scène deux fois : une fois complétement dans l'ombre, une fois complétement éclairée. Les deux sont combinées de manière à appliquer les ombres. La combinaison se fait pour chaque pixel : un pixel éclairé prendra le pixel dans l'image éclairée, un pixel dans l'ombre prendra le pixel dans l'image dans l'ombre. Pour déterminer si un pixel est dans l'ombre ou non, il existe plusieurs techniques, portant les noms de ''depth-fail'', ''depth pass'' et ''XOR test''. Mais toutes donnent le même résultat : le tampon de ''stencil'' indique, pour chaque pixel, s'il est dans l'ombre ou non.
===L’implémentation de type ''depth pass===
Imaginons que le moteur de jeu tire, pour chaque pixel, un rayon partant de la caméra et qui s'arrête sur le premier objet visible. Le rayon va potentiellement intersecter un ou plusieurs volumes d'ombre sur son trajet. Il peut soit rentrer dans un volume d'ombre, soit en sortir. L'idée est alors de compter les entrées et sorties des volumes d'ombre, en partant de la caméra. Pour cela, chaque octet de ''stencil'' est initialisé à zéro. L'entrée du rayon dans un volume d'ombre incrémente l'octet de ''stencil'', la sortie le décrémente. Le pixel est dans l'ombre si l'octet de ''stencil'' associé a une valeur positive, éclairé s'il est à zéro.
[[File:Depth pass shadow volume.png|centre|vignette|upright=2|Détermination de l'ombrage d'un pixel avec des ombres volumétriques.]]
La méthode de la '''''Depth pass''''' fait ce comptage sans tirer de rayon proprement dit. L'idée est qu'un volume d'ombre est considéré comme un volume géométrique transparent. Le volume d'ombre est délimité par plusieurs faces, chacune étant globalement trapézoïdale, qui est considérée comme un ''quad''. Il est donc possible d'utiliser l'élimination des surfaces cachées pour savoir si un volume d'ombre se trouve devant ou derrière un objet. L'idée est de rendre la scène une première fois, avec une ''pré-passe z''. Le tampon de profondeur obtenu avec cette pré-passe est utilisée par les passes suivantes, pour déterminer si les volumes d'ombres sont situés devant ou derrière l'objet à rendre.
Une implémentation naïve est la suivante. La scène est rendue une seconde fois, après la pré-passe z. Lors de cette seconde passe, les volumes d'ombre sont considérés comme des objets géométriques. Lorsqu'une face d'un volume d'ombre est rendue, le test de profondeur indique si cette face est située devant l'objet ou non. Si c'est le cas, le tampon de ''stencil'' est incrémenté. Un problème est qu'en faisant cela, les faces avant et arrières du volume d'ombre sont testées. Le tampon de ''stencil'' nous dit si le volume d'ombre est devant, mais on ne sait pas si une face testée correspond à une entrée ou une sortie d'un volume d'ombre.
Pour corriger ce problème, l'image est rendue en deux passes, après la pré-passe z. Une première passe utilise le ''back-face culling'', qui élimine les faces qui tournent le dos à la caméra. Pour les volumes d’ombre, de telles faces correspondent à des sorties de volume d'ombre. Cette passe incrémente le tampon de ''stencil''. La seconde utilise l'inverse, le ''front face culling'', pour éliminer les faces qui font face à la caméra. Elles correspondent à des entrées de volume d'ombre. Cette passe décrémente le tampon de ''stencil''.
L'implémentation obtenue est dite ''depth pass''. Elle a pour seul défaut de ne pas marcher quand la caméra est dans l'ombre, pour diverses raisons techniques. Pour comprendre pourquoi, imaginez qu'il n'y a qu'une seule ombre dans une scène 3D et que la caméra est dedans. Le ''stencil buffer'' ne verra qu'une face d'ombre "sortante", donc le tampon de ''stencil'' contiendra un -1 pour chaque pixel. Et vu que le ''stencil'' ne gère pas les valeurs non-signées, il y a un problème qu'il faut résoudre. La technique dite du ''depth fail'' n'a pas ce problème, mais nous n'en parlerons pas ici.
===Les optimisations matérielles des ombres volumétriques===
Les GPU des années 2000 ont implémenté de nombreuses optimisations pour accélérer les ombres volumétriques.
Une première optimisation est celle du '''tampon de ''stencil'' à deux faces''' (''two faceds stencil buffer''). L'idée est que le tampon de ''stencil'' contient deux octets de ''stencil'' par pixel. L'un est utilisé pour compter les faces de volume d'ombre qui font face à la caméra, l'autre pour celles qui tournent le dos à la caméra. Pas besoin de faire deux passes consécutives, avec soi le ''back-face culling'' ou le ''front-face culling'' activé.
Une autre optimisation modifie la manière dont le ''stencil buffer'' gère les débordements d'entier, à savoir ce qu'il se passe quand un octet de ''stencil'' dépasse sa valeur maximale de 255. En théorie, il sature, à savoir qu'incrémenter un octet de ''stencil'' à 255 le laisse à 255. Idem si on décrémente un octet de ''stencil'' à zéro : il reste à zéro. Mais pour les ombres volumétriques, il est préférable d'utiliser l'arithmétique classique, à savoir qu'incrémenter un octet à 255 le fait passer à 0, alors que décrémenter un octet à 0 le fait passer à 255. Le ''stencil buffer'' peut être configuré pour fonctionner dans l'un des deux modes : saturation ou débordements classiques. Il est aussi possible d'ajouter le support des entiers signés au ''stencil buffer''.
Une autre optimisation est le '''''depth clamp'''''. Elle permet de désactiver le clipping pour le ''near plane'' et le ''far plane''. En effet, l'algorithme de ''depth pass'' a besoin du ''view frustrum'', mais pas du ''near plane'' et du ''far plane''. Les calculs de clipping pour ces deux plans sont inutiles, et ne doivent idéalement pas être fait. Le ''depth clamp'' permet de configurer le rastériseur de manière à activer ou désactiver le clipping pour le ''near plane'' et le ''far plane''.
Une dernière optimisation, non-spécifique aux ombres volumétriques, est le '''''scissor test''''', qui permet de limiter le rendu pour une partie de l'écran. Elle accélère le traitement des ombres qui n'impactent qu'une partie de l'écran. Si le moteur du jeu a déterminé à l'avance qu'une source de lumière n'a d'effet que sur une petite partie de l'écran, seule celle-ci est rendue. Le '''''Depth Bounds Test''''' est l'équivalent, mais pour le tampon de profondeur. Il permet de ne rendre que les volumes d'ombres situés entre une profondeur minimale et une profondeur maximale.
<noinclude>
{{NavChapitre | book=Les cartes graphiques
| prev=Les unités de texture
| prevText=Les unités de texture
| next=Les écritures en VRAM hors ROPs
| nextText=Les écritures en VRAM hors ROPs
}}{{autocat}}
</noinclude>
g870gzjjfkhe94hib7khjn7lo72s7n9
Dictionnaire de philosophie/Croyance
0
83049
768279
767891
2026-06-22T03:28:57Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768279
wikitext
text/x-wiki
{{DicoPhilo|Croyance|lecture=oui}}
La '''croyance''' (du latin ''credere'', croire) désigne un état mental dans lequel un sujet tient une proposition pour vraie, indépendamment du degré de certitude ou de justification dont il dispose. Cette notion occupe une place centrale en épistémologie depuis l'Antiquité, car elle permet de distinguer différents types de rapports cognitifs au monde : la simple opinion (''doxa''), la croyance justifiée et la connaissance (''epistémè''). Contrairement à la connaissance, la croyance ne requiert pas nécessairement de preuve ou de garantie épistémique, même si les philosophes débattent depuis Platon de la nature exacte de cette distinction<ref>Platon, ''Théétète'', 201c-210b, trad. M. Narcy, Paris, Flammarion, 1995, p. 234-278</ref>.
La question philosophique fondamentale que soulève la notion de croyance est double : d'une part, quelle est la nature de l'acte de croire ? D'autre part, quelles conditions une croyance doit-elle remplir pour être considérée comme rationnelle ou justifiée ? Ces interrogations traversent toute l'histoire de la philosophie et donnent lieu à des réponses divergentes selon les traditions philosophiques.
== La distinction platonicienne : croyance et connaissance ==
=== La croyance comme opinion ===
Dans le ''Théétète'', Platon établit une distinction fondamentale entre l'opinion vraie (''alethès doxa'') et la connaissance (''epistémè'')<ref>Platon, ''Théétète'', 201c-d</ref>. L'opinion vraie se caractérise par le fait qu'elle atteint la vérité sans pour autant constituer une connaissance authentique. Socrate illustre ce point par l'exemple des avocats qui, par des arguments rhétoriques, persuadent un jury d'accepter une vérité sans lui transmettre pour autant la connaissance de cette vérité. La croyance vraie diffère ainsi de la connaissance en ce qu'elle ne comporte pas de ''logos'', c'est-à-dire de justification rationnelle ou d'explication<ref>Platon, ''Théétète'', 201d-202c</ref>.
Cette distinction platonicienne établit une hiérarchie épistémique : au sommet se trouve la connaissance des Formes intelligibles, accessible par la dialectique ; en dessous, l'opinion vraie qui se rapporte aux choses sensibles ; et tout en bas, l'opinion fausse. La croyance, dans ce cadre, est un état mental intermédiaire qui peut s'avérer véridique sans pour autant constituer une saisie authentique de la réalité.
=== Le problème de la fausse croyance ===
Platon soulève dans le ''Théétète'' un problème redoutable : comment est-il possible de croire faussement ? Si croire que X est Y suppose une relation à X et Y, et si cette relation est fausse (X n'est pas Y), alors il semblerait qu'il n'y ait rien à quoi se rapporte la croyance, et donc qu'elle ne soit pas réellement une croyance<ref>Platon, ''Théétète'', 187d-200d</ref>. La solution esquissée consiste à admettre que nous pouvons connaître suffisamment une chose X pour l'identifier comme sujet de discours, sans pour autant tout savoir à son propos, notamment si elle possède ou non la propriété Y.
== La conception aristotélicienne : croyance et assentiment ==
Pour Aristote, la croyance (''pistis'') se distingue de la simple appréhension d'un concept par l'intervention d'un jugement. Appréhender une proposition n'équivaut pas à y croire : il faut un acte supplémentaire d'assentiment (''kataphasis'') ou de rejet (''apophasis''). Cette distinction sera reprise et développée par les philosophes scolastiques médiévaux, puis par Descartes<ref>Aristote, ''De l'âme'', III, 3, 427b-428a, trad. R. Bodéüs, Paris, Flammarion, 1993, p. 212-215</ref>.
Aristote considère que la croyance est toujours propositionnelle : on ne croit pas simplement "cheval", mais "le cheval est blanc" ou "il y a un cheval". Cette structure propositionnelle implique une prise de position du sujet face à un contenu représentationnel. La croyance se distingue ainsi de la simple imagination qui peut représenter sans affirmer.
== La théorie cartésienne du jugement ==
=== Croyance, perception et volonté ===
Descartes opère une transformation décisive dans la compréhension de la croyance en distinguant radicalement deux facultés : l'entendement (''intellectus''), qui perçoit les idées, et la volonté (''voluntas''), qui donne son assentiment<ref>Descartes, René, ''Méditations métaphysiques'', IV, AT VII 56-57, trad. M. Beyssade et J.-M. Beyssade, Paris, Flammarion, 1979, p. 147-151</ref>. La croyance n'est pas un acte de l'entendement mais un acte de la volonté par lequel nous affirmons ou nions ce que l'entendement nous présente.
Cette théorie a des conséquences importantes pour la question de la responsabilité épistémique. Puisque la croyance est un acte volontaire, nous sommes responsables de nos erreurs lorsque nous donnons notre assentiment à des idées confuses ou obscures. L'erreur ne provient ni de l'entendement, qui perçoit ce qu'il perçoit, ni de la volonté en elle-même, qui est libre, mais du mauvais usage de la volonté qui consent à des perceptions inadéquates<ref>Descartes, ''Méditations'', IV, AT VII 58-62</ref>.
=== La clarté et distinction comme critère ===
Descartes établit que nous devons suspendre notre jugement (''suspensio judicii'') tant que nous ne percevons pas clairement et distinctement la vérité d'une proposition. Seules les idées claires et distinctes contraignent légitimement notre assentiment. Cette contrainte n'est pas une violence faite à la volonté mais au contraire l'expression de sa plus haute liberté : lorsque l'entendement perçoit clairement que quelque chose est vrai, la volonté ne peut que consentir, et ce consentement est parfaitement libre parce que parfaitement éclairé<ref>Descartes, ''Méditations'', IV, AT VII 58-59</ref><ref>Jayasekera, Marie de Marneffe, "Responsibility in Descartes's Theory of Judgment", ''Ergo'', vol. 3, n° 12, 2016, p. 319-347</ref>.
Cette conception introduit une norme épistémique stricte : nous avons le devoir intellectuel de ne croire que ce que nous percevons clairement et distinctement. La croyance rationnelle exige donc une discipline de la volonté et une vigilance constante contre la précipitation du jugement.
== L'empirisme britannique : croyance et expérience ==
=== Locke et la justification des croyances ===
John Locke développe une théorie évidentaliste de la croyance dans son ''Essai sur l'entendement humain'' (1689). Selon lui, la croyance (''belief'') doit être proportionnée à l'évidence disponible. Nous avons un devoir épistémique de ne croire que ce qui est supporté par des preuves suffisantes, que ces preuves proviennent de l'intuition, de la démonstration ou de l'expérience sensible<ref>Locke, John, ''Essai sur l'entendement humain'', Livre IV, chap. XV-XIX, trad. J.-M. Vienne, Paris, Vrin, 2001, p. 743-841</ref>.
Locke distingue trois degrés de connaissance : la connaissance intuitive (par exemple, la conscience de notre propre existence), la connaissance démonstrative (comme les mathématiques et l'existence de Dieu) et la connaissance sensible (l'existence des choses extérieures)<ref>Locke, ''Essai'', Livre IV, chap. II</ref>. La croyance intervient lorsque nous n'avons pas de connaissance certaine mais seulement une probabilité basée sur l'expérience et le témoignage.
Cette position évidentaliste aura une influence considérable sur la philosophie des religions, notamment dans le débat sur la rationalité de la croyance religieuse. Locke soutient qu'accepter une révélation divine exige d'abord d'établir rationnellement que Dieu existe et qu'il a effectivement révélé la proposition en question, typiquement par des miracles attestés<ref>Locke, ''Essai'', Livre IV, chap. XVIII-XIX</ref>.
=== Hume : croyance, vivacité et causalité ===
David Hume propose une théorie radicalement différente de la croyance dans son ''Traité de la nature humaine'' (1739-1740). Pour lui, la croyance n'est pas un acte de volonté mais une "manière particulière de concevoir une idée"<ref>Hume, David, ''Traité de la nature humaine'', Livre I, partie III, section VII, trad. P. Baranger et P. Saltel, Paris, Flammarion, 1995, p. 173-179</ref>.
La différence entre une simple idée et une croyance ne réside pas dans le contenu représentationnel, mais dans la vivacité (''vivacity'') ou la force (''force'') avec laquelle l'idée est conçue. Croire que p, c'est avoir une idée de p qui est plus vive, plus ferme, plus stable qu'une simple fiction de l'imagination<ref>Hume, ''Traité'', I, III, VII, §5</ref>. Cette vivacité provient du transfert de la vivacité d'une impression présente vers une idée associée par la relation de causalité.
Par exemple, lorsque je vois de la fumée (impression), l'habitude d'avoir constamment observé que la fumée est suivie du feu fait que mon idée du feu acquiert une vivacité qui la transforme en croyance. La croyance est ainsi le produit d'un mécanisme psychologique naturel plutôt que d'une délibération rationnelle<ref>Hume, ''Traité'', I, III, VIII</ref><ref>Hume, David, ''Enquête sur l'entendement humain'', section V, trad. A. Leroy, Paris, Flammarion, 1983, p. 91-115</ref>.
Dans l'Appendice du ''Traité'', Hume reconnaît que sa théorie initiale pose problème : des poèmes ou des fictions peuvent susciter des idées très vives sans pour autant constituer des croyances. Il révise alors sa théorie en distinguant deux types de vivacité : la vivacité phénoménologique (l'intensité des images mentales) et la vivacité doxastique (un sentiment sui generis qui caractérise la croyance)<ref>Hume, ''Traité'', Appendice, §7-10</ref>. La croyance se caractérise par une "force", une "solidité" ou une "fermeté" qui fait que les réalités pèsent davantage dans notre pensée et influencent davantage nos actions et nos passions que les simples fictions.
== Le kantisme et l'idéalisme allemand ==
=== Kant : opinion, croyance et savoir ===
Emmanuel Kant établit dans la ''Critique de la raison pure'' une distinction tripartite entre l'opinion (''Meinen''), la croyance ou foi (''Glauben'') et le savoir (''Wissen'')<ref>Kant, Emmanuel, ''Critique de la raison pure'', "Doctrine transcendantale de la méthode", chap. II, section III, trad. A. Tremesaygues et B. Pacaud, Paris, PUF, 1944, A820-831/B848-859</ref>. Ces trois attitudes se distinguent par leur rapport à la suffisance subjective et objective de la tenue-pour-vrai (''Fürwahrhalten'').
Le '''savoir''' requiert une suffisance tant subjective qu'objective : le sujet est convaincu et il y a des raisons objectives suffisantes. L'''opinion''' n'est suffisante ni subjectivement ni objectivement : le sujet reconnaît que sa conviction est incertaine et qu'elle ne repose pas sur des fondements suffisants. La '''croyance''' est subjectivement suffisante mais objectivement insuffisante : le sujet est fermement convaincu, mais reconnaît que cette conviction ne peut être fondée sur des preuves théoriques contraignantes.
Kant distingue en outre trois types de croyance : la croyance pragmatique (par exemple, croire qu'un médecin peut guérir), la croyance doctrinale (croire à l'existence d'autres habitants dans l'univers) et la croyance morale (croire en Dieu et en l'immortalité de l'âme). Seule cette dernière a, selon Kant, une nécessité rationnelle, non pas théorique mais pratique : nous devons postuler l'existence de Dieu et l'immortalité de l'âme comme conditions de possibilité de l'accomplissement du souverain bien<ref>Kant, ''Critique de la raison pure'', A828-829/B856-857</ref><ref>Kant, Emmanuel, ''Critique de la raison pratique'', "Dialectique", trad. F. Picavet, Paris, PUF, 1943, p. 124-148</ref>.
=== Hegel et la foi rationnelle ===
Dans sa ''Phénoménologie de l'esprit'', Hegel critique la conception kantienne d'une foi qui serait séparée du savoir. Pour Hegel, la foi (''Glaube'') n'est qu'un moment dans le développement de l'esprit qui doit être dépassé dans le savoir absolu<ref>Hegel, Georg Wilhelm Friedrich, ''Phénoménologie de l'esprit'', trad. J. Hyppolite, Paris, Aubier, 1941, tome II, p. 227-241</ref>. La véritable réconciliation de la foi et de la raison ne consiste pas à les maintenir séparées dans des domaines distincts, mais à comprendre que la foi authentique contient déjà implicitement le concept rationnel qu'elle devra expliciter.
La religion, pour Hegel, exprime sous forme représentative (''Vorstellung'') ce que la philosophie exprime sous forme conceptuelle (''Begriff''). La croyance religieuse n'est donc pas irrationnelle, mais elle représente une forme de rationalité encore immature qui doit s'élever au concept philosophique.
== Le pragmatisme : croyance et action ==
=== William James et la volonté de croire ===
William James, dans ''La Volonté de croire'' (1896), défend une position controversée selon laquelle, dans certaines circonstances, nous avons le droit, voire le devoir, de croire sans preuve suffisante<ref>James, William, ''La Volonté de croire'', trad. L. Moulin, Paris, Les Empêcheurs de penser en rond, 2005</ref>. Lorsqu'une option est vivante (les alternatives sont psychologiquement réelles), forcée (nous ne pouvons pas suspendre notre jugement) et momentanée (l'occasion de choisir ne se représentera pas), alors nous sommes en droit de laisser notre nature passionnelle décider, plutôt que d'attendre des preuves qui pourraient ne jamais venir.
James applique particulièrement cette thèse à la croyance religieuse. Si l'existence de Dieu ne peut être ni prouvée ni réfutée de manière concluante, et si cette croyance a des conséquences pratiques importantes pour notre vie, alors nous sommes en droit de croire ou de ne pas croire en fonction de nos besoins vitaux et de nos aspirations les plus profondes.
=== Peirce et la fixation de la croyance ===
Charles Sanders Peirce développe une conception pragmatiste de la croyance dans son article "La Fixation de la croyance" (1877)<ref>Peirce, Charles Sanders, "The Fixation of Belief", ''Popular Science Monthly'', vol. 12, 1877, p. 1-15</ref>. Pour Peirce, la croyance est essentiellement une disposition à l'action : croire que p, c'est être disposé à agir comme si p était vrai. Le doute, à l'inverse, est un état d'inconfort qui suspend l'action et stimule l'enquête.
L'enquête scientifique est, selon Peirce, la méthode la plus efficace pour fixer durablement nos croyances, car elle seule est capable de corriger ses propres erreurs en confrontant continuellement nos hypothèses à l'expérience. Contrairement aux méthodes de la ténacité, de l'autorité ou de la réflexion a priori, la méthode scientifique produit des croyances qui convergent vers la vérité à long terme.
== La phénoménologie : croyance et intentionnalité ==
=== Husserl et la thèse doxique ===
Edmund Husserl, dans ses ''Recherches logiques'' et ses ''Idées directrices pour une phénoménologie'', analyse la croyance (''Glaube'') comme une modalité de la thèse doxique. Tout acte de conscience comporte une composante doxique : nous ne nous contentons pas de représenter un objet, nous le positionnons comme existant, possible, probable, douteux, etc.<ref>Husserl, Edmund, ''Idées directrices pour une phénoménologie'', §§103-114, trad. P. Ricœur, Paris, Gallimard, 1950, p. 349-379</ref>.
La croyance naturelle (''natürlicher Glaube'') ou thèse générale de l'attitude naturelle consiste à poser le monde comme existant. Cette thèse peut être modalisée (croyance probable, doute) ou neutralisée (mise entre parenthèses, ''épochè''). La phénoménologie husserlienne met ainsi en évidence la structure intentionnelle de la croyance : croire, c'est toujours croire-à ou croire-que, c'est-à-dire se rapporter à un objet intentionnel sous un certain mode.
=== Sartre : croyance et mauvaise foi ===
Jean-Paul Sartre, dans ''L'Être et le Néant'', développe une critique phénoménologique de la croyance ordinaire. Pour Sartre, la croyance authentique est impossible car elle impliquerait une coïncidence parfaite avec soi-même que la structure de la conscience interdit<ref>Sartre, Jean-Paul, ''L'Être et le Néant'', Paris, Gallimard, 1943, p. 107-111</ref>. Toute croyance comporte une part de non-croyance : "Croire, c'est n'être pas tout à fait sûr ; croire, c'est savoir qu'on croit, donc c'est ne plus croire tout à fait."
Cette analyse conduit Sartre à sa célèbre théorie de la mauvaise foi, qui consiste précisément à se cacher à soi-même que l'on ne croit pas vraiment ce que l'on prétend croire. La mauvaise foi est une modalité fondamentale de l'existence humaine par laquelle la conscience tente de se figer en être-en-soi tout en préservant sa liberté comme être-pour-soi.
== Philosophie analytique contemporaine ==
=== La définition tripartite de la connaissance ===
Depuis Platon, une tradition philosophique définit la connaissance comme croyance vraie justifiée. Cette définition tripartite a été remise en question par Edmund Gettier dans un article de 1963 qui présente des contre-exemples célèbres<ref>Gettier, Edmund, "Is Justified True Belief Knowledge?", ''Analysis'', vol. 23, n° 6, 1963, p. 121-123</ref>. Gettier montre qu'on peut avoir une croyance vraie justifiée sans pour autant avoir de connaissance, lorsque la vérité de la croyance est due au hasard plutôt qu'à la justification.
Ce problème a engendré une vaste littérature en épistémologie analytique, avec diverses solutions proposées : ajouter une condition de non-défaisabilité, exiger un lien causal approprié entre la croyance et le fait, ou adopter une théorie fiabiliste de la justification. Ces débats montrent que la nature exacte de la relation entre croyance et connaissance reste un problème philosophique vivant.
=== Le fiabilisme ===
Le fiabilisme, développé notamment par Alvin Goldman, soutient que la justification d'une croyance dépend de sa genèse causale<ref>Goldman, Alvin, "What Is Justified Belief?", in George Pappas (dir.), ''Justification and Knowledge'', Dordrecht, Reidel, 1979, p. 1-23</ref>. Une croyance est justifiée si et seulement si elle est produite par un processus cognitivement fiable, c'est-à-dire un processus qui tend à produire un ratio élevé de croyances vraies par rapport aux croyances fausses.
Cette théorie est externaliste : un sujet peut avoir des croyances justifiées sans avoir accès aux facteurs qui les justifient. Cette position s'oppose aux théories internalistes qui exigent que le sujet ait un accès réflexif aux raisons de ses croyances. Le débat entre internalisme et externalisme structure une grande partie de l'épistémologie contemporaine.
=== Contextualisme et épistémologie des vertus ===
Le contextualisme épistémique soutient que les conditions pour attribuer une connaissance varient selon le contexte conversationnel. Dans un contexte ordinaire, nous pouvons dire que nous "savons" que nous avons des mains, mais dans un contexte philosophique où des scénarios sceptiques sont envisagés (comme l'hypothèse du cerveau dans une cuve), nous ne pouvons plus le dire<ref>DeRose, Keith, "Contextualism and Knowledge Attributions", ''Philosophy and Phenomenological Research'', vol. 52, n° 4, 1992, p. 913-929</ref>.
L'épistémologie des vertus, développée par Ernest Sosa, Linda Zagzebski et John Greco, propose de comprendre la connaissance non pas comme croyance vraie justifiée mais comme croyance vraie provenant de l'exercice de vertus intellectuelles<ref>Sosa, Ernest, ''A Virtue Epistemology: Apt Belief and Reflective Knowledge'', vol. I, Oxford, Clarendon Press, 2007</ref>. Cette approche met l'accent sur l'agent cognitif et ses dispositions plutôt que sur les propriétés abstraites des croyances.
== Croyance et rationalité ==
=== L'évidentalisme ===
L'évidentalisme, défendu notamment par Locke puis par W.K. Clifford au XIXe siècle, soutient que nous avons un devoir épistémique de proportionner nos croyances à l'évidence disponible. Clifford formule cette norme de manière particulièrement stricte : "Il est mauvais, toujours, partout, et pour quiconque, de croire quoi que ce soit sur la base d'une évidence insuffisante"<ref>Clifford, William Kingdon, "The Ethics of Belief", ''Contemporary Review'', vol. 29, 1877, p. 289-309</ref>.
Cette position implique que beaucoup de nos croyances ordinaires, notamment les croyances religieuses, sont irrationnelles si elles ne sont pas appuyées par des preuves suffisantes. L'évidentalisme établit ainsi un lien étroit entre rationalité épistémique et justification probatoire.
=== Bayésianisme et degrés de croyance ===
Le bayésianisme épistémique modélise la croyance rationnelle en termes de degrés de confiance (''credences'') qui obéissent aux axiomes du calcul des probabilités<ref>Ramsey, Frank P., "Truth and Probability" (1926), in D.H. Mellor (dir.), ''Philosophical Papers'', Cambridge, Cambridge University Press, 1990, p. 52-94</ref>. Une croyance rationnelle n'est pas un simple état binaire (croire ou ne pas croire) mais un degré de confiance allant de 0 (certitude de la fausseté) à 1 (certitude de la vérité).
La rationalité bayésienne exige que nos degrés de croyance soient cohérents (satisfaisant les axiomes de la probabilité) et que nous les mettions à jour selon la règle de Bayes lorsque nous recevons de nouvelles informations. Cette approche permet de modéliser de manière formelle le raisonnement inductif et l'apprentissage à partir de l'expérience.
== Croyance religieuse et foi ==
=== La distinction entre foi et croyance ===
Dans le contexte religieux, il est important de distinguer la foi (''fides'') de la simple croyance (''opinio''). Thomas d'Aquin définit la foi comme "l'acte de l'intelligence qui, sous l'impulsion de la volonté mue par Dieu au moyen de la grâce, donne son assentiment aux vérités divines"<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 2, a. 9, trad. A.-M. Roguet, Paris, Cerf, 1985, tome 2, p. 133</ref>. La foi n'est donc pas une simple opinion incertaine, mais un assentiment ferme fondé non pas sur l'évidence intrinsèque de son objet, mais sur l'autorité de Dieu qui révèle.
Contrairement à la connaissance qui repose sur l'évidence, et à l'opinion qui demeure hésitante, la foi est à la fois certaine (en raison de l'autorité divine) et obscure (car son objet dépasse la capacité naturelle de l'intelligence humaine)<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 1-7</ref>.
=== Le fidéisme et ses critiques ===
Le fidéisme désigne la position selon laquelle la foi religieuse est indépendante de la raison, voire en conflit avec elle. Cette position a été défendue sous diverses formes par Tertullien (''Credo quia absurdum''), Pascal avec son "pari", et Kierkegaard pour qui la foi exige un "saut" par-dessus l'absurdité rationnelle<ref>Kierkegaard, Søren, ''Crainte et tremblement'', trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, Paris, Payot, 2000</ref>.
Cette conception a été vivement critiquée tant par les théologiens rationalistes que par les philosophes des Lumières. Elle semble faire de la foi un acte arbitraire et immuniser les croyances religieuses contre toute critique rationnelle. Les thomistes objectent que si la foi était vraiment contraire à la raison, elle ne pourrait être ni vertueuse ni raisonnable.
=== La réforme réformée en épistémologie ===
Alvin Plantinga et Nicholas Wolterstorff ont développé ce qu'on appelle l'"épistémologie réformée", qui défend la rationalité de la croyance en Dieu sans argument<ref>Plantinga, Alvin et Wolterstorff, Nicholas (dir.), ''Faith and Rationality'', Notre Dame, University of Notre Dame Press, 1983</ref>. Selon cette approche, la croyance en Dieu peut être "proprement basique" (''properly basic''), c'est-à-dire justifiée sans être inférée d'autres croyances, tout comme nos croyances perceptuelles ou mémorielles.
Plantinga soutient que les êtres humains possèdent un ''sensus divinitatis'', une faculté naturelle qui, dans des circonstances appropriées, produit spontanément la croyance en Dieu. Si cette faculté fonctionne correctement, les croyances qu'elle produit constituent une connaissance authentique même en l'absence d'arguments<ref>Plantinga, Alvin, ''Warranted Christian Belief'', Oxford, Oxford University Press, 2000</ref>.
== Conclusion ==
La notion de croyance demeure au cœur des préoccupations philosophiques contemporaines, tant en épistémologie qu'en philosophie de l'esprit et en philosophie des religions. Les débats actuels prolongent et renouvellent les questions classiques : Quelle est la structure de la croyance ? En quoi diffère-t-elle de la connaissance ? Quelles normes doivent gouverner nos croyances ? Avons-un contrôle volontaire sur nos croyances ?
Ces questions ne sont pas seulement théoriques mais comportent des enjeux pratiques importants concernant la rationalité de nos engagements cognitifs, la responsabilité épistémique, et la possibilité d'un dialogue rationnel entre personnes ayant des systèmes de croyances différents. Elles montrent que la philosophie de la croyance reste un domaine vivant de la recherche philosophique, où se croisent l'héritage des grands penseurs du passé et les méthodes rigoureuses de la philosophie analytique contemporaine.
== Références ==
{{references|colonnes=2}}
== Bibliographie ==
* Engel, Pascal, ''La Dispute : une introduction à la philosophie analytique'', Paris, Minuit, 1997
* Pouivet, Roger, ''Qu'est-ce que croire ?'', Paris, Vrin, 2003
* Swinburne, Richard, ''Faith and Reason'', 2e éd., Oxford, Clarendon Press, 2005
* BonJour, Laurence, ''The Structure of Empirical Knowledge'', Cambridge, Harvard University Press, 1985
* Alston, William P., ''Epistemic Justification'', Ithaca, Cornell University Press, 1989
* Zagzebski, Linda, ''Virtues of the Mind'', Cambridge, Cambridge University Press, 1996
{{autocat}}
mpquimw1pmvjcwbu1qg3imkeppxvqxu
Dictionnaire de philosophie/Contingence
0
83050
768275
767895
2026-06-22T03:28:17Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768275
wikitext
text/x-wiki
{{DicoPhilo|Contingence|lecture=oui}}
La contingence (du latin ''contingere'', « arriver par hasard », « échoir ») désigne, en philosophie, le mode d'être de ce qui pourrait ne pas être ou être autrement. Elle s'oppose à la nécessité, qui caractérise ce qui ne peut pas ne pas être. Cette distinction fondamentale traverse toute l'histoire de la philosophie et structure les débats métaphysiques, logiques, théologiques et éthiques depuis l'Antiquité.
== Définitions et distinctions conceptuelles ==
=== Contingent, nécessaire, possible, impossible ===
Dans la tradition logique et métaphysique, la contingence s'inscrit dans le carré des modalités, qui articule quatre concepts fondamentaux<ref>Jules Vuillemin, ''Nécessité ou contingence. L'aporie de Diodore et les systèmes philosophiques'', Paris, Éditions de Minuit, 1984</ref><ref>Logique modale et théorie des modalités, ''Encyclopédie philosophique'', Paris, PUF, 2011</ref> :
* Le nécessaire : ce qui ne peut pas ne pas être (par exemple, les vérités mathématiques comme « 2+2=4 »)
* L{{'}}impossible : ce qui ne peut pas être (par exemple, un cercle carré)
* Le possible : ce qui peut être sans contradiction (par exemple, ma présence en ce lieu)
* Le contingent : ce qui peut être ou ne pas être, ce qui n'est ni nécessaire ni impossible
Le contingent et le nécessaire sont contradictoires : être contingent, c'est précisément ne pas être nécessaire. Toute chose est soit nécessaire, soit contingente<ref>Alain Badiou, ''Logique des mondes'', Paris, Seuil, 2006, p. 381-412</ref>. En revanche, le possible et le contingent sont subcontraires : ils peuvent être vrais ensemble. Quelque chose peut en effet être à la fois possible et contingent, mais pas faux ensemble.
=== Contingence et facticité ===
Dans la philosophie existentialiste, notamment chez Heidegger et Sartre, la contingence se rapproche de la notion de facticité (''Faktizität''). La facticité désigne le fait que l'existence humaine se découvre toujours déjà jetée dans le monde (''Geworfenheit''), sans l'avoir choisi<ref>Martin Heidegger, ''Sein und Zeit'' (''Être et Temps''), Tübingen, Max Niemeyer, 1927, § 29, p. 135-140</ref><ref>Jean-Paul Sartre, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943, p. 120-128</ref>. Comme l'écrit Sartre dans ''La Nausée'' : « L'essentiel est la contingence. Je veux dire que par définition, l'existence n'est pas la nécessité. Exister c'est être là, simplement »<ref>Jean-Paul Sartre, ''La Nausée'', Paris, Gallimard, 1938, p. 185</ref>. Cette contingence radicale de l'existence ne peut être dépassée par aucun « être nécessaire et cause de soi » : elle est « l'absolu, par conséquent la gratuité parfaite »<ref>Sartre, ''La Nausée'', op. cit., p. 188</ref>.
La facticité comprend plusieurs dimensions<ref>Vincent de Coorebyter, ''Sartre face à la phénoménologie. Autour de L'intentionnalité et de La transcendance de l'Ego'', Bruxelles, Ousia, 2000, p. 219-265</ref> :
* L'émergence contingente du pour-soi au sein de l'en-soi
* La déréliction ou situation de l'être humain qui se trouve toujours-déjà-là
* La finitude de l'existence marquée par la naissance et la mort que nous n'avons pas choisies
== La contingence dans la philosophie antique et médiévale ==
=== Aristote et la contingence des futurs ===
Aristote inaugure la réflexion systématique sur la contingence dans son traité ''De l'Interprétation'' (chapitre 9), où il aborde la question des futurs contingents<ref>Aristote, ''De l'Interprétation'', chapitre 9, 18a 28 - 19b 4</ref><ref>Jules Vuillemin, ''Nécessité ou contingence'', op. cit., p. 11-58</ref>. Le problème est le suivant : une proposition portant sur un événement futur (« Il y aura une bataille navale demain ») est-elle déjà vraie ou fausse aujourd'hui ? Si elle est déjà déterminée, tout arrive par nécessité et la contingence disparaît. Si elle n'est ni vraie ni fausse, le principe de non-contradiction semble menacé.
Aristote distingue plusieurs types de contingence liés à sa doctrine des quatre causes<ref>Émile Bréhier, ''Histoire de la Philosophie'', vol. 1, Paris, PUF, 1981, p. 289-312</ref> :
* Les événements qui arrivent par hasard (''apo tuchès''), sans cause propre déterminée
* Les actes libres procédant d'une cause indifférente (la volonté)
* Les événements naturels qui arrivent « le plus souvent » (''hôs epi to polu'') mais qui peuvent être empêchés par une cause faillible
Pour Aristote, la contingence est réelle : certains événements ne sont pas prédéterminés et peuvent effectivement se produire ou non. Cette position se situe entre le déterminisme absolu et l'indéterminisme pur<ref>Guy Picard, « Matière, contingence et indéterminisme chez saint Thomas », ''Laval théologique et philosophique'', vol. 22, n° 2, 1966, p. 197-233</ref>.
=== Avicenne : essence et existence ===
Le philosophe persan Avicenne (Ibn Sīnā, 980-1037) introduit une distinction majeure qui aura une influence considérable sur la scolastique médiévale : celle entre essence (''māhiyya'') et existence (''wujūd'')<ref>Amélie-Marie Goichon, ''La distinction de l'essence et de l'existence d'après Ibn Sīnā (Avicenne)'', Paris, Desclée de Brouwer, 1937</ref><ref>Avicenne, ''La Métaphysique du Shifā'', livres I à V, traduction Georges C. Anawati, Paris, Vrin, 1978, p. 97-112</ref>.
Pour Avicenne, l{{'}}essence d'une chose (ce qu'elle est) ne contient pas en elle-même son existence (le fait qu'elle soit). L'essence est en elle-même ni existante ni non-existante : elle est neutre ou indifférente à l'existence<ref>Goichon, ''La distinction de l'essence et de l'existence'', op. cit., p. 87-103</ref>. Par exemple, l'essence « humanité » peut être pensée sans que l'on conçoive nécessairement qu'elle existe actuellement. Cette neutralité de l'essence fonde la contingence des êtres : leur essence ne les rend pas nécessaires.
Avicenne distingue alors deux types d'êtres<ref>Avicenne, ''Métaphysique du Shifā'', op. cit., livre VIII, chapitre 1-3</ref><ref>Michael E. Marmura, « Avicenna on Primary Concepts in the Metaphysics of His al-Shifā' », dans ''Probing in Islamic Philosophy'', Binghamton, Global Academic Publishing, 2005, p. 141-167</ref> :
* L{{'}}Être nécessaire par soi (''wājib al-wujūd bi-dhātihi'') : Dieu, dont l'essence implique nécessairement l'existence
* L{{'}}être contingent ou possible par soi (''mumkin al-wujūd bi-dhātihi'') : toute créature, dont l'existence ne découle pas de son essence mais lui est conférée de l'extérieur par une cause efficiente
Cette distinction permet à Avicenne de formuler sa célèbre preuve de l'existence de Dieu à partir de la contingence du monde<ref>Avicenne, ''Métaphysique du Shifā'', livre VIII, chapitre 3-7</ref><ref>Robert Wisnovsky, ''Avicenna's Metaphysics in Context'', Ithaca, Cornell University Press, 2003, p. 213-257</ref> : puisque tout être contingent a besoin d'une cause pour exister, et qu'on ne peut remonter à l'infini dans la chaîne des causes, il doit exister un Être nécessaire par soi qui donne l'existence à tous les êtres contingents.
=== Thomas d'Aquin : contingence et participation ===
Thomas d'Aquin (1225-1274) reprend la distinction avicennienne entre essence et existence, mais l'inscrit dans une métaphysique de la participation et de la composition<ref>Étienne Gilson, ''L'Être et l'essence'', Paris, Vrin, 1948, p. 139-187</ref><ref>Cornelio Fabro, ''Participation et causalité selon S. Thomas d'Aquin'', Louvain/Paris, Publications universitaires de Louvain/Béatrice-Nauwelaerts, 1961</ref>. Pour Thomas, dans tout être créé, l{{'}}''esse'' (l'acte d'être) et l{{'}}''essentia'' (l'essence) sont réellement distincts<ref>Thomas d'Aquin, ''De ente et essentia'', chapitre 4-5</ref><ref>Thomas d'Aquin, ''Somme théologique'', Ia, question 3, article 4</ref>. Cette composition réelle fonde la contingence de la créature : son essence ne contient pas en elle-même la raison de son existence.
Thomas distingue également la contingence de droit et ce qu'on pourrait appeler une forme de nécessité hypothétique<ref>Picard, « Matière, contingence et indéterminisme », op. cit., p. 197-233</ref><ref>Thomas d'Aquin, ''Summa contra Gentiles'', livre III, chapitre 86</ref>. Les événements naturels sont contingents en ce sens que leur cause propre peut être empêchée (la fleur de noisetier peut ne pas produire de noisette si elle est détruite). Cependant, une fois toutes les causes réunies, l'effet suit nécessairement. La contingence ne signifie donc pas indétermination absolue, mais dépendance à l'égard de causes qui peuvent être empêchées<ref>Thomas d'Aquin, ''Commentaire sur le Perihermeneias d'Aristote'', livre I, leçon 13-15</ref>.
La matière première joue également un rôle dans la contingence des êtres naturels<ref>Thomas d'Aquin, ''De principiis naturae'', chapitre 1-2</ref><ref>Picard, « Matière, contingence et indéterminisme », op. cit., p. 207-215</ref>. Étant pure puissance, elle est le principe d'indétermination qui explique que les formes substantielles puissent se succéder dans la génération et la corruption. La contingence a ainsi « sa racine dans la matière »<ref>Thomas d'Aquin, ''Commentaire sur le Perihermeneias'', I, leçon 14, n. 8</ref>.
=== Duns Scot : univocité de l'être et contingence ===
Jean Duns Scot (vers 1266-1308) apporte une contribution majeure à la pensée de la contingence en liant celle-ci à sa doctrine de l{{'}}univocité de l'être<ref>Jean Duns Scot, ''Opus Oxoniense'' (''Ordinatio''), livre I, distinction 3, question 1-3</ref><ref>Olivier Boulnois, ''Être et représentation. Une généalogie de la métaphysique moderne à l'époque de Duns Scot (XIIIe-XIVe siècle)'', Paris, PUF, 1999, p. 267-325</ref>. Contre Thomas d'Aquin qui défend l{{'}}analogie de l'être (l'être se dit différemment de Dieu et des créatures), Scot affirme que l'être possède un sens univoque : il se dit de la même manière de Dieu et des créatures, bien que Dieu soit être infini et les créatures êtres finis<ref>Duns Scot, ''Ordinatio'', I, d. 3, q. 1-2, n. 26-55</ref>.
Cette univocité permet à Scot de penser la contingence de manière plus radicale. Pour lui, la contingence ne réside pas seulement dans le rapport de l'essence à l'existence, mais dans la volonté divine elle-même<ref>Duns Scot, ''Ordinatio'', I, d. 39-40</ref><ref>Ludger Honnefelder, ''Ens inquantum ens. Der Begriff des Seienden als solchen als Gegenstand der Metaphysik nach der Lehre des Johannes Duns Scotus'', Münster, Aschendorff, 1979, p. 312-358</ref>. Dieu ne crée pas par nécessité de nature, mais par un acte libre et contingent de sa volonté. Les lois de la nature elles-mêmes sont contingentes : « ''Non quaerenda ratio quorum non est ratio'' » (on ne doit pas chercher la raison de ce dont il n'y a pas de raison)<ref>Duns Scot, ''Lectura'', I, d. 39, q. 1-5, n. 49</ref>.
Scot développe également la notion d{{'}}eccéité (''haecceitas'') ou principe d'individuation<ref>Duns Scot, ''Ordinatio'', II, d. 3, q. 1-6</ref><ref>Peter King, « Duns Scotus on the Common Nature and the Individual Differentia », ''Philosophical Topics'', vol. 20, n° 2, 1992, p. 50-76</ref>. Ce qui fait qu'un être est cet individu singulier (la « Socratéité » de Socrate) ne peut être expliqué ni par la matière ni par la forme universelle, mais constitue un principe ontologique irréductible. Cette doctrine souligne le caractère contingent et singulier de toute existence individuelle.
== La contingence à l'époque moderne ==
=== Leibniz : contingence et liberté ===
Gottfried Wilhelm Leibniz (1646-1716) élabore une théorie sophistiquée de la contingence qui cherche à concilier la liberté humaine, la contingence du monde et la nécessité des vérités éternelles<ref>Émile Bréhier, ''Histoire de la philosophie'', vol. II, Paris, PUF, 1981, p. 246-262</ref><ref>Robert Sleigh, ''Leibniz and Arnauld: A Commentary on Their Correspondence'', New Haven, Yale University Press, 1990, p. 77-103</ref>. Sa distinction entre vérités de raison et vérités de fait structure sa pensée<ref>Leibniz, ''Essais de Théodicée sur la bonté de Dieu, la liberté de l'homme et l'origine du mal'', Amsterdam, Isaac Troyel, 1710, § 282-288</ref> :
* Les vérités de raison sont nécessaires : leur contraire implique contradiction (par exemple, les vérités mathématiques)
* Les vérités de fait sont contingentes : leur contraire est possible sans contradiction (par exemple, « César a franchi le Rubicon »)
Leibniz introduit la notion fondamentale de nécessité hypothétique ou morale<ref>Leibniz, ''Théodicée'', op. cit., § 36-37, § 230-237</ref><ref>André Robinet, ''Architectonique disjonctive, automates systémiques et idéalité transcendantale dans l'œuvre de G.W. Leibniz'', Paris, Vrin, 1986, p. 345-367</ref>. Selon le principe de raison suffisante, tout ce qui arrive a une raison qui fait qu'il arrive plutôt qu'autrement. Cependant, cette raison « incline sans nécessiter »<ref>Leibniz, ''Théodicée'', § 45</ref>. La volonté est déterminée par les raisons les plus fortes, mais cette détermination n'est pas une nécessité absolue ou métaphysique : le choix contraire reste métaphysiquement possible, bien qu'il soit moralement impossible (c'est-à-dire contraire à la perfection de l'agent rationnel).
Cette solution permet à Leibniz d'affirmer à la fois<ref>Leibniz, ''Discours de métaphysique'', § 13 et § 30</ref><ref>Yvon Belaval, ''Leibniz critique de Descartes'', Paris, Gallimard, 1960, p. 447-478</ref> :
* Que Dieu a créé librement le monde
* Que le monde actuel est le meilleur des mondes possibles
* Que les actions humaines sont libres bien que déterminées par des raisons
La contingence se situe ainsi dans l'écart entre la possibilité logique (ce qui n'implique pas contradiction) et l{{'}}actualité (ce qui existe effectivement). Parmi une infinité de mondes possibles, Dieu a librement choisi d'actualiser celui qui contient le maximum de perfection.
=== Kant : modalités et limites de la raison ===
Emmanuel Kant (1724-1804) inscrit la réflexion sur la contingence dans le cadre de sa philosophie critique. Dans la ''Critique de la raison pure'', les modalités (nécessaire, contingent, possible, impossible) ne sont plus seulement des déterminations de l'être, mais des catégories de l'entendement qui structurent notre expérience<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'' (''Critique de la raison pure''), Riga, Johann Friedrich Hartknoch, 1781/1787, B 106, A 80</ref><ref>Alexis Philonenko, ''L'œuvre de Kant'', vol. 1, Paris, Vrin, 1969, p. 127-145</ref>.
Kant distingue<ref>Kant, ''Critique de la raison pure'', B 3-4</ref><ref>Alain Renaut, ''Kant aujourd'hui'', Paris, Aubier, 1997, p. 234-256</ref> :
* Les jugements a priori : nécessaires et universels (par exemple, « tout effet a une cause »)
* Les jugements a posteriori ou empiriques : contingents, car leur contraire est possible
La contingence caractérise ainsi tout ce qui relève de l{{'}}expérience empirique<ref>Kant, ''Critique de la raison pure'', A 1-2/B 1-2</ref>. Les objets de l'expérience sont contingents parce que leur existence n'est pas déductible a priori des concepts purs de l'entendement. Seule l'expérience peut nous informer de ce qui existe effectivement.
Kant critique les preuves traditionnelles de l'existence de Dieu, notamment la preuve cosmologique qui prétend déduire l'existence d'un Être nécessaire de la contingence du monde<ref>Kant, ''Critique de la raison pure'', A 603-614/B 631-642</ref><ref>Luc Ferry, ''Kant. Une lecture des trois Critiques'', Paris, Grasset, 2006, p. 98-115</ref>. Pour Kant, une telle déduction illégitime applique les catégories de l'entendement (comme la causalité) au-delà des limites de l'expérience possible, dans le domaine du suprasensible.
Dans la ''Critique de la faculté de juger'', Kant rencontre la contingence sous un nouveau jour : celle du vivant<ref>Emmanuel Kant, ''Kritik der Urteilskraft'' (''Critique de la faculté de juger''), Berlin/Libau, Lagarde und Friederich, 1790, § 64-67</ref><ref>Catherine Malabou, ''Avant demain. Épigenèse et rationalité'', Paris, PUF, 2014, p. 37-89</ref>. L'organisme vivant manifeste une finalité qui ne peut être expliquée par les seules lois mécaniques de la nature. Cette contingence du vivant révèle les limites du déterminisme mécaniste et suggère une forme d{{'}}auto-organisation qui échappe à la causalité efficiente.
=== Spinoza : négation de la contingence ===
Baruch Spinoza (1632-1677) se distingue radicalement de la tradition en niant la contingence<ref>Baruch Spinoza, ''Ethica ordine geometrico demonstrata'' (''Éthique''), posthume 1677, partie I, proposition 29 et 33</ref><ref>Pierre Macherey, ''Introduction à l'Éthique de Spinoza. La première partie : la nature des choses'', Paris, PUF, 1998, p. 267-289</ref>. Pour Spinoza, tout ce qui existe existe nécessairement en vertu de la nature divine. Dieu, ou la Nature (''Deus sive Natura''), est la substance unique dont tout le reste découle comme des modes<ref>Spinoza, ''Éthique'', I, proposition 14-18</ref>.
Dans l'Éthique, Spinoza affirme : « De la souveraine puissance de Dieu, ou de sa nature infinie, une infinité de choses en une infinité de modes, c'est-à-dire tout, a nécessairement découlé ou en suit, toujours avec la même nécessité ; de même que de toute éternité et pour l'éternité il suit de la nature du triangle que ses trois angles égalent deux droits »<ref>Spinoza, ''Éthique'', I, proposition 16</ref><ref>Ferdinand Alquié, ''Le rationalisme de Spinoza'', Paris, PUF, 1981, p. 123-145</ref>. L'existence du monde est donc mathématiquement nécessaire.
La contingence n'est pour Spinoza qu'une illusion subjective née de notre ignorance des causes<ref>Spinoza, ''Éthique'', I, proposition 33, scolie 1</ref><ref>Alexandre Matheron, ''Individu et communauté chez Spinoza'', Paris, Éditions de Minuit, 1988, p. 34-56</ref>. Nous disons qu'une chose est contingente seulement parce que nous ne connaissons pas les causes qui la déterminent nécessairement. Si nous avions une connaissance adéquate de la chaîne causale, nous verrions que tout est nécessaire.
Cette négation de la contingence a des conséquences majeures :
* Il n'y a pas de libre arbitre au sens d'une volonté indéterminée<ref>Spinoza, ''Éthique'', II, proposition 48</ref>
* La liberté se confond avec la nécessité comprise : être libre, c'est agir selon sa seule nature, sans contrainte extérieure<ref>Spinoza, ''Éthique'', I, définition 7 ; IV, proposition 66-73</ref>
* Les lois de la nature sont éternelles et immuables<ref>Spinoza, ''Éthique'', I, appendice</ref>
== La contingence dans la philosophie contemporaine ==
=== L'existentialisme : facticité et contingence radicale ===
L'existentialisme du XXe siècle fait de la contingence une dimension constitutive de l'existence humaine. Martin Heidegger (1889-1976), dans ''Être et Temps'', décrit le ''Dasein'' (l'être-là humain) comme fondamentalement marqué par la facticité : il se trouve toujours-déjà-jeté dans le monde sans l'avoir choisi<ref>Heidegger, ''Sein und Zeit'', op. cit., § 29, p. 135-140</ref><ref>Emmanuel Levinas, ''En découvrant l'existence avec Husserl et Heidegger'', Paris, Vrin, 1949, p. 91-116</ref>.
Jean-Paul Sartre (1905-1980) radicalise cette dimension dans ''L'Être et le Néant'' et ''La Nausée''<ref>Sartre, ''L'Être et le Néant'', op. cit., p. 116-142</ref><ref>Sartre, ''La Nausée'', op. cit., p. 180-190</ref>. Pour Sartre, la contingence ne concerne pas seulement les circonstances de notre existence, mais l'existence elle-même : « L'existence précède l'essence »<ref>Jean-Paul Sartre, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946, p. 17-21</ref>. L'être humain n'a pas de nature prédéfinie : il est « condamné à être libre », c'est-à-dire à se définir par ses choix<ref>Sartre, ''L'existentialisme est un humanisme'', op. cit., p. 37-39</ref>.
Cette contingence radicale se manifeste dans plusieurs dimensions<ref>Francis Jeanson, ''Sartre par lui-même'', Paris, Seuil, 1955, p. 34-67</ref> :
* La contingence de la naissance : « Personne n'a demandé à naître »
* La contingence du monde : le sentiment de « trop » (''de trop'') qui saisit Roquentin devant la racine de marronnier<ref>Sartre, ''La Nausée'', op. cit., p. 181</ref>
* La contingence de la mort : « un fait contingent qui [...] m'échappe par principe »<ref>Sartre, ''L'Être et le Néant'', op. cit., p. 630-631</ref>
Simone de Beauvoir (1908-1986) approfondit cette réflexion en articulant contingence et situation<ref>Simone de Beauvoir, ''Le Deuxième Sexe'', Paris, Gallimard, 1949, tome I, p. 31-47</ref><ref>Michèle Le Dœuff, ''L'Étude et le Rouet. Des femmes, de la philosophie, etc.'', Paris, Seuil, 1989, p. 89-124</ref>. Contre Sartre qui affirmerait que toute situation peut être transcendée par la liberté, Beauvoir insiste sur le fait que les possibilités concrètes varient selon les situations. L'exemple de la femme enfermée dans un harem montre que la contingence des situations limite réellement la liberté.
=== Quentin Meillassoux : la contingence absolue ===
Le philosophe français Quentin Meillassoux (né en 1967) propose dans ''Après la finitude'' (2006) une réhabilitation spéculative de la contingence qu'il qualifie de contingence absolue<ref>Quentin Meillassoux, ''Après la finitude. Essai sur la nécessité de la contingence'', Paris, Seuil, 2006</ref><ref>Graham Harman, ''Quentin Meillassoux: Philosophy in the Making'', Edinburgh, Edinburgh University Press, 2011, p. 67-98</ref>. Contre le « corrélationnisme » qui affirme l'impossibilité d'accéder au réel indépendamment de notre rapport à lui, Meillassoux soutient que la seule nécessité absolue est la contingence elle-même : rien n'a de raison d'être ou de rester tel qu'il est.
Cette « factualité » radicale signifie qu'aucune loi de la nature n'est nécessaire : tout pourrait devenir autre sans raison. La contingence n'est pas une propriété des êtres, mais le principe absolu du réel<ref>Meillassoux, ''Après la finitude'', op. cit., p. 79-103</ref>.
== Enjeux philosophiques ==
=== Contingence et liberté ===
La contingence est intimement liée à la question de la liberté humaine<ref>Henri Bergson, ''Essai sur les données immédiates de la conscience'', Paris, PUF, 1889, chapitre III</ref><ref>Vladimir Jankélévitch, ''L'Alternative'', Paris, Alcan, 1938, p. 23-89</ref>. Si tout est nécessairement déterminé, quelle place reste-t-il pour la liberté ? Trois positions principales s'affrontent :
* Le déterminisme absolu (Spinoza) : tout est nécessaire, la liberté consiste dans la compréhension de cette nécessité<ref>Spinoza, ''Éthique'', op. cit., V, propositions 1-10</ref>
* Le libertarianisme : la liberté requiert une indétermination réelle, une contingence dans l'ordre causal<ref>Jean-Baptiste Guillon, « Le libertarianisme agent-causal aujourd'hui », ''Klēsis – Revue philosophique'', n° 29, 2014, p. 1-40</ref>
* Le compatibilisme (Leibniz, Hume) : la liberté est compatible avec le déterminisme si celui-ci n'est pas une nécessité absolue mais une détermination par des raisons<ref>David Hume, ''An Enquiry Concerning Human Understanding'', London, 1748, section VIII</ref><ref>Daniel Dennett, ''Elbow Room: The Varieties of Free Will Worth Wanting'', Cambridge (Mass.), MIT Press, 1984</ref>
La notion de contingence modale permet de penser une liberté qui n'est ni pur arbitraire ni nécessité absolue : nos choix sont déterminés par des raisons, mais le choix contraire reste métaphysiquement possible<ref>Thomas Pink, ''Free Will: A Very Short Introduction'', Oxford, Oxford University Press, 2004, p. 67-89</ref>.
=== Contingence et théologie ===
La contingence du monde a servi de fondement à plusieurs preuves de l'existence de Dieu<ref>Paul Clavier, ''Les avatars de la preuve cosmologique. Essai sur l'argument de la contingence'', Paris, Vrin, 2015</ref><ref>Richard Swinburne, ''The Existence of God'', Oxford, Clarendon Press, 1979, chapitre 7-8</ref> :
* La preuve cosmologique : tout être contingent a une cause ; il doit donc exister un Être nécessaire qui soit la cause première de tous les êtres contingents
* Chez Avicenne et Thomas d'Aquin, cette preuve s'appuie sur la distinction entre essence et existence<ref>Goichon, ''La distinction de l'essence et de l'existence'', op. cit., p. 145-178</ref><ref>Thomas d'Aquin, ''Somme théologique'', Ia, question 2, article 3 (« troisième voie »)</ref>
* Leibniz y ajoute le principe de raison suffisante : la série des êtres contingents doit avoir sa raison dans un Être nécessaire<ref>Leibniz, ''Théodicée'', op. cit., § 7-8</ref>
Inversement, la contingence pose le problème du mal<ref>Alvin Plantinga, ''God, Freedom, and Evil'', Grand Rapids, Eerdmans, 1974</ref><ref>Marilyn McCord Adams et Robert Merrihew Adams (éd.), ''The Problem of Evil'', Oxford, Oxford University Press, 1990</ref> : si Dieu est parfait et tout-puissant, pourquoi a-t-il créé un monde imparfait ? La contingence du monde permet de répondre que Dieu a choisi librement parmi les possibles, mais ce choix même soulève des questions sur la bonté divine.
=== Contingence et déterminisme scientifique ===
La science moderne, en particulier la physique newtonienne, semblait établir un déterminisme universel : connaissant l'état du monde à un instant donné et les lois de la nature, on pourrait en principe prédire tous les événements futurs. Ce déterminisme semble exclure toute contingence réelle<ref>Pierre-Simon de Laplace, ''Essai philosophique sur les probabilités'', Paris, Courcier, 1814, introduction</ref><ref>Ernst Cassirer, ''Determinismus und Indeterminismus in der modernen Physik'', Göteborg, Elanders, 1936</ref>.
Cependant, plusieurs développements scientifiques ont remis en question ce déterminisme<ref>Ian Hacking, ''The Taming of Chance'', Cambridge, Cambridge University Press, 1990</ref><ref>John Earman, ''A Primer on Determinism'', Dordrecht, Reidel, 1986</ref> :
* La mécanique quantique introduit une forme d'indétermination fondamentale au niveau microscopique<ref>Werner Heisenberg, ''Physik und Philosophie'', Stuttgart, Hirzel, 1959, chapitre 3</ref>
* La théorie du chaos montre que même dans des systèmes déterministes, de petites variations initiales peuvent produire des effets radicalement différents, rendant la prédiction impossible en pratique<ref>James Gleick, ''Chaos: Making a New Science'', New York, Viking, 1987</ref>
* La biologie révèle des formes d{{'}}auto-organisation et d{{'}}émergence qui ne se réduisent pas au déterminisme mécanique<ref>Ilya Prigogine et Isabelle Stengers, ''La Nouvelle Alliance. Métamorphose de la science'', Paris, Gallimard, 1979, p. 185-234</ref><ref>Malabou, ''Avant demain'', op. cit., p. 127-178</ref>
Ces découvertes scientifiques renouvellent la question philosophique de la contingence et de son statut ontologique.
==Références==
{{references|colonnes=2}}
== Bibliographie ==
=== Sources primaires ===
* Aristote, ''De l'Interprétation'', traduction et commentaire par J. Tricot, Paris, Vrin, 1969
* Avicenne (Ibn Sīnā), ''La Métaphysique du Shifā'', traduction G.C. Anawati, Paris, Vrin, 1978-1985
* Thomas d'Aquin, ''Somme théologique'', traduction A.-M. Roguet, Paris, Cerf, 1984-1986
* Jean Duns Scot, ''Traité du premier principe'', traduction R. Imbach, Paris, Vrin, 2001
* Gottfried Wilhelm Leibniz, ''Essais de Théodicée'', Paris, Garnier-Flammarion, 1969
* Emmanuel Kant, ''Critique de la raison pure'', traduction A. Tremesaygues et B. Pacaud, Paris, PUF, 1968
* Baruch Spinoza, ''Éthique'', traduction B. Pautrat, Paris, Seuil, 1999
* Jean-Paul Sartre, ''L'Être et le Néant'', Paris, Gallimard, 1943
* Jean-Paul Sartre, ''La Nausée'', Paris, Gallimard, 1938
=== Études ===
* Boulnois, Olivier, ''Être et représentation. Une généalogie de la métaphysique moderne à l'époque de Duns Scot'', Paris, PUF, 1999
* Clavier, Paul, ''Les avatars de la preuve cosmologique. Essai sur l'argument de la contingence'', Paris, Vrin, 2015
* Gilson, Étienne, ''L'Être et l'essence'', Paris, Vrin, 1948
* Goichon, Amélie-Marie, ''La distinction de l'essence et de l'existence d'après Ibn Sīnā'', Paris, Desclée de Brouwer, 1937
* Jankélévitch, Vladimir, ''La Mort'', Paris, Flammarion, 1977
* Knuuttila, Simo, ''Modalities in Medieval Philosophy'', London, Routledge, 1993
* Meillassoux, Quentin, ''Après la finitude. Essai sur la nécessité de la contingence'', Paris, Seuil, 2006
* Picard, Guy, « Matière, contingence et indéterminisme chez saint Thomas », ''Laval théologique et philosophique'', vol. 22, n° 2, 1966, p. 197-233
* Vuillemin, Jules, ''Nécessité ou contingence. L'aporie de Diodore et les systèmes philosophiques'', Paris, Éditions de Minuit, 1984
== Voir aussi ==
* {{Page|Nécessité}}
* {{Page|Liberté}}
* {{Page|Modalité}}
* {{Page|Déterminisme}}
* {{Page|Essence}}
* {{Page|Existence}}
* {{Page|Facticité}}
* {{Page|Hasard}}
* {{Page|Destin}}
* {{Page|Causalité}}
* {{Page|Possible}}
{{autocat}}
o57ck54yf4s8bh06u2nfb8fa6yyuib0
Dictionnaire de philosophie/Dasein
0
83059
768281
767707
2026-06-22T03:29:17Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768281
wikitext
text/x-wiki
{{DicoPhilo|''Dasein''|lecture=oui}}
'''Dasein''' est un terme allemand qui signifie littéralement « être-là » et qui occupe une place centrale dans la pensée de Martin Heidegger (1889-1976), notamment dans son ouvrage majeur ''Être et Temps'' (''Sein und Zeit'', 1927)<ref>Martin Heidegger, ''Sein und Zeit'', Tübingen, Max Niemeyer Verlag, 1927 ; traduction française par François Vezin, ''Être et Temps'', Paris, Gallimard, coll. « Bibliothèque de philosophie », 1986 ; traduction par Emmanuel Martineau, Paris, Authentica, 1985.</ref>. Ce concept représente une rupture fondamentale avec la tradition philosophique qui, depuis Descartes, conçoit l'homme comme sujet pensant (''cogito'') face à un monde d'objets. Heidegger refuse cette séparation et propose de penser l'existence humaine comme étant toujours déjà dans un monde, engagée dans des rapports pratiques et affectifs avec les choses et avec autrui.
== Origines et signification du terme ==
En allemand courant, le substantif ''Dasein'' désigne simplement l'existence ou la présence. Le verbe ''dasein'' signifie « être présent », « être là ». Heidegger s'approprie ce terme ordinaire pour en faire un concept philosophique technique qui vise à désigner le mode d'être spécifique de l'être humain<ref>Mark Wrathall, « Martin Heidegger », ''Stanford Encyclopedia of Philosophy'', 2025.</ref>. En choisissant ce mot plutôt que des termes traditionnels comme « homme » (''Mensch''), « sujet » ou « conscience », Heidegger entend déplacer la question philosophique : il ne s'agit plus d'étudier l'homme d'un point de vue anthropologique, psychologique ou biologique, mais d'interroger le mode d'être particulier de cet étant qui se distingue par sa capacité à comprendre l'être<ref>Heidegger, ''Être et Temps'', § 2, p. 12 (édition Gallimard, trad. Vezin).</ref>.
Le Dasein n'est donc pas un simple objet subsistant (''vorhanden'') parmi d'autres dans le monde. Il se caractérise par une relation particulière à son propre être : pour le Dasein, il y va de son être même dans son être<ref>Heidegger, ''Être et Temps'', § 4, p. 32 (édition Gallimard, trad. Vezin).</ref>. Autrement dit, l'existence humaine ne consiste pas simplement à « être » au sens où une pierre ou un arbre « sont », mais à avoir à être, à se rapporter constamment à sa propre existence comme à une question, comme à quelque chose qui importe et qui fait problème. Cette structure fondamentale distingue le Dasein de tous les autres étants.
== Le Dasein comme être-au-monde ==
La structure fondamentale du Dasein est ce que Heidegger nomme l'« être-au-monde » (''In-der-Welt-sein'')<ref>Heidegger, ''Être et Temps'', § 12, p. 65 (édition Gallimard, trad. Vezin).</ref>. Cette expression, délibérément reliée par des traits d'union, vise à souligner qu'il s'agit d'un phénomène unitaire et non d'une simple addition de trois éléments séparables. L'être-au-monde comprend trois moments structurels : le monde, l'être-à (l'« être-dans ») et le Dasein lui-même qui existe toujours « en étant-là ».
=== Le monde ===
Le « monde » dont parle Heidegger n'est pas d'abord l'ensemble des objets physiques qui nous entourent, ni l'univers considéré comme totalité des choses subsistantes. Le monde désigne plutôt le système de significations et de renvois dans lequel nous nous mouvons quotidiennement<ref>Heidegger, ''Être et Temps'', § 14-18.</ref>. Il s'agit du contexte pratique familier où les choses se présentent toujours déjà comme utilisables pour certaines fins : le marteau pour enfoncer des clous, la table pour écrire, la route pour se déplacer. Ces choses ne sont pas d'abord perçues comme des objets neutres dotés de propriétés physiques, mais comme des outils (''Zeug'') disponibles (''zuhanden'') pour nos préoccupations.
Cette disponibilité des choses renvoie toujours à un ensemble de relations : le marteau renvoie au clou, le clou à la planche, la planche à la maison à construire, la maison à celui qui l'habitera, etc. C'est ce réseau de renvois que Heidegger nomme la « significativité » (''Bedeutsamkeit'') du monde<ref>Heidegger, ''Être et Temps'', § 18, p. 118 (édition Gallimard, trad. Vezin).</ref>. Le monde n'est donc pas un contenant vide où viendraient se loger des sujets et des objets, mais une structure de sens articulée par les préoccupations pratiques du Dasein.
=== L'être-à ou l'être-dans ===
L'« être-dans » (''In-Sein'') ne désigne pas une relation spatiale comme celle d'un objet contenu dans un autre (l'eau dans le verre, les livres dans la bibliothèque). Il s'agit plutôt d'une manière d'être familier avec le monde, d'y habiter au sens fort du terme<ref>Heidegger, ''Être et Temps'', § 12.</ref>. Être-dans le monde, c'est être chez soi, séjourner auprès des choses et des autres dans une familiarité qui nous permet de nous y orienter sans effort. Cette familiarité repose sur trois structures existentiales fondamentales qui constituent l'« ouverture » (''Erschlossenheit'') du Dasein :
'''La disposition affective''' (''Befindlichkeit''), souvent traduite par « affection » ou « tonalité affective », désigne le fait que le Dasein se trouve toujours dans une certaine humeur ou tonalité émotionnelle<ref>Heidegger, ''Être et Temps'', § 29.</ref>. Avant toute réflexion théorique, nous sommes affectés par notre situation : inquiets, joyeux, ennuyés, angoissés, etc. Ces dispositions ne sont pas de simples états psychologiques subjectifs, mais des manières fondamentales par lesquelles le monde nous est ouvert, nous affecte et nous importe. L'humeur révèle que nous sommes toujours « jetés » (''geworfen'') dans une situation que nous n'avons pas choisie, mais que nous avons à assumer.
'''Le comprendre''' (''Verstehen'') ne désigne pas une capacité intellectuelle ou cognitive, mais une dimension existentiale plus originaire : le pouvoir-être du Dasein, sa capacité à se projeter vers des possibilités<ref>Heidegger, ''Être et Temps'', § 31.</ref>. Comprendre, c'est saisir les possibilités d'action qui s'offrent dans une situation donnée. Cette compréhension s'exprime d'abord dans le savoir-faire pratique, dans la capacité à manier les outils, à s'orienter dans les lieux familiers, à répondre adéquatement aux sollicitations du monde. Le comprendre est toujours « projeté » (''entworfen'') vers l'avenir, vers ce que le Dasein peut être.
'''Le discours''' (''Rede'') constitue la troisième structure de l'ouverture. Il ne s'agit pas d'abord du langage parlé, mais de l'articulation même de la compréhension en significations distinctes<ref>Heidegger, ''Être et Temps'', § 34.</ref>. Le discours rend possible l'explicitation de ce qui est compris, il structure notre rapport au monde en différenciant et en organisant les phénomènes. C'est sur cette base que se fonde le langage proprement dit, qui n'est pas un instrument ultérieurement ajouté à une pensée muette, mais l'expression de la structure articulée de notre être-au-monde.
== Authenticité et inauthenticité ==
Le Dasein existe toujours selon deux modes possibles : l'authenticité (''Eigentlichkeit'') et l'inauthenticité (''Uneigentlichkeit'')<ref>Heidegger, ''Être et Temps'', § 9.</ref>. Ces termes n'ont pas de connotation morale chez Heidegger : il ne s'agit pas de juger l'existence authentique comme « bonne » et l'existence inauthentique comme « mauvaise ». Il s'agit de décrire deux manières structurellement différentes d'exister.
=== La quotidienneté et le « On » ===
Dans la vie quotidienne moyenne, le Dasein existe le plus souvent sur le mode de l'inauthenticité. Cette inauthenticité se caractérise par le fait que le Dasein se comprend lui-même et agit selon les normes, les habitudes et les attentes du « On » (''das Man'')<ref>Heidegger, ''Être et Temps'', § 27.</ref>. Le « On » désigne l'impersonnalité de l'existence sociale commune : « on » fait comme tout le monde, « on » pense ce que tout le monde pense, « on » adopte les opinions moyennes sans les interroger. Dans ce mode d'être, le Dasein se disperse dans les occupations quotidiennes, se perd dans la foule anonyme et fuit la responsabilité de son existence propre.
Heidegger décrit trois phénomènes caractéristiques de cette existence quotidienne : le bavardage (''Gerede''), la curiosité (''Neugier'') et l'équivoque (''Zweideutigkeit'')<ref>Heidegger, ''Être et Temps'', § 35-37.</ref>. Le bavardage répète sans cesse des opinions toutes faites sans s'interroger sur leur sens véritable. La curiosité saute d'un objet d'intérêt à un autre sans jamais s'arrêter pour comprendre en profondeur. L'équivoque maintient tout dans une ambiguïté où l'on ne sait jamais vraiment ce qui est authentiquement compris et ce qui est simplement répété. Ces phénomènes contribuent à ce que Heidegger nomme la « déchéance » (''Verfallen'') : non pas une chute morale, mais une tendance structurelle du Dasein à se perdre dans le monde des préoccupations quotidiennes et à fuir devant son être propre.
=== L'être-avec-autrui ===
L'existence du Dasein n'est jamais solitaire mais toujours sociale. L'« être-avec » (''Mitsein'') est une structure existentiale constitutive de l'être-au-monde<ref>Heidegger, ''Être et Temps'', § 26.</ref>. Le monde que nous habitons est toujours déjà un monde partagé avec d'autres. Les choses que nous rencontrons renvoient constamment aux autres : ce livre a été écrit par quelqu'un, cette route est empruntée par d'autres usagers, cet outil a été fabriqué pour être utilisé par n'importe qui. Les autres ne sont pas d'abord des objets que je percevrai ensuite comme des sujets conscients ; ils sont originairement co-présents avec moi dans le monde comme d'autres Dasein.
Cependant, dans la quotidienneté dominée par le « On », cette coexistence tend à prendre la forme d'une indifférenciation où chacun se conforme aux normes sociales moyennes. L'être-avec authentique suppose au contraire une « sollicitude » (''Fürsorge'') qui respecte et favorise la liberté d'autrui, qui aide l'autre non en le remplaçant dans ses tâches mais en le rendant transparent à lui-même et libre pour son pouvoir-être propre.
=== L'angoisse et l'appel de la conscience ===
Le passage de l'inauthenticité à l'authenticité n'est pas un choix rationnel délibéré, mais s'opère à travers certaines expériences existentielles fondamentales. L'angoisse (''Angst'') joue ici un rôle décisif<ref>Heidegger, ''Être et Temps'', § 40.</ref>. À la différence de la peur, qui porte toujours sur un objet déterminé qui nous menace, l'angoisse n'a pas d'objet précis. Dans l'angoisse, c'est le monde entier qui perd sa familiarité et sa signification : les préoccupations quotidiennes s'effondrent, les buts que nous poursuivions apparaissent soudain comme insignifiants, le réseau des renvois qui structure le monde se dissout. L'angoisse révèle ainsi la contingence radicale de notre existence : nous sommes jetés dans un monde sans raison ultime, et notre être est suspendu au-dessus du néant.
Cette expérience, loin d'être purement négative, a une fonction libératrice : elle arrache le Dasein à sa dispersion dans le « On » et le confronte à son pouvoir-être le plus propre. L'angoisse individualise le Dasein en révélant qu'il ne peut déléguer à personne la responsabilité de son existence. Elle ouvre ainsi la possibilité d'une existence authentique.
Cette possibilité est également rendue accessible par ce que Heidegger nomme l'« appel de la conscience » (''Ruf des Gewissens'')<ref>Heidegger, ''Être et Temps'', § 54-60.</ref>. Cet appel n'est pas la voix d'une instance morale extérieure ni le résultat d'une réflexion consciente : c'est le Dasein lui-même qui s'appelle à sortir de sa dispersion quotidienne pour assumer son être propre. L'appel est silencieux, il ne formule aucun contenu déterminé, mais il enjoint au Dasein de se « résoudre » (''Entschlossenheit'') à être soi-même, c'est-à-dire à prendre en charge sa propre existence et à se projeter authentiquement vers ses possibilités propres.
== L'être-pour-la-mort ==
La structure la plus fondamentale du Dasein, celle qui rend possible l'authenticité, est l'« être-pour-la-mort » (''Sein zum Tode'')<ref>Heidegger, ''Être et Temps'', § 46-53.</ref>. Dès sa naissance, le Dasein est assez vieux pour mourir : la mort n'est pas un événement qui surviendrait à la fin de la vie, mais une possibilité constante qui détermine l'existence dans son ensemble. Heidegger distingue la mort comme fin biologique (le « décès », ''Ableben'') de la mort comme structure existentiale.
Dans la quotidienneté, le Dasein fuit devant sa propre mort. Il la conçoit comme un événement qui arrive aux autres, un fait statistique général (« on meurt »), mais jamais comme sa mort propre. Cette fuite prend diverses formes : on se rassure en pensant que la mort viendra « plus tard », on se plonge dans les occupations pour ne pas y penser, on transforme la mort en problème technique à résoudre par la médecine. Mais toutes ces attitudes manquent le phénomène essentiel : la mort comme possibilité la plus propre du Dasein, celle qui ne peut être déléguée à personne d'autre et qui individualise absolument.
L'être-pour-la-mort authentique consiste à « devancer » (''vorlaufen'') la mort, c'est-à-dire à se projeter activement vers cette possibilité extrême<ref>Heidegger, ''Être et Temps'', § 53.</ref>. Devancer la mort ne signifie ni penser constamment à la mort, ni souhaiter mourir, ni préparer son suicide. Il s'agit plutôt de comprendre existentiellement que toute existence est finie, que nos possibilités ne sont pas illimitées, et qu'à chaque instant nous pouvons cesser d'être. Cette compréhension libère le Dasein de l'illusion d'un temps infini : sachant que ses possibilités sont limitées, il peut choisir authentiquement celles qui lui importent vraiment, sans se disperser dans l'indéfini des occupations quotidiennes. La mort, comprise comme la « possibilité de l'impossibilité absolue du Dasein », révèle ainsi la finitude constitutive de l'existence humaine.
== Temporalité et souci ==
L'analyse du Dasein aboutit à la mise au jour de sa structure fondamentale : le souci (''Sorge'')<ref>Heidegger, ''Être et Temps'>, § 41.</ref>. Le souci n'est pas une préoccupation particulière parmi d'autres, mais la structure ontologique qui unifie tous les moments de l'être-au-monde. Le Dasein existe comme souci en tant qu'il est toujours « en-avant-de-soi » (projeté vers ses possibilités futures), « déjà-dans » (jeté dans un monde qu'il n'a pas choisi) et « auprès-de » (préoccupé par les choses intramondaines). Cette structure ternaire révèle que le Dasein est fondamentalement temporel.
La temporalité (''Zeitlichkeit'') constitue le sens ontologique du souci<ref>Heidegger, ''Être et Temps'', § 65.</ref>. Elle ne désigne pas le temps objectif mesurable par les horloges, ni la succession linéaire des instants, mais la structure « ekstatique » de l'existence humaine. Le Dasein existe en se « tenant hors de soi » dans trois « ekstases » temporelles : l'avenir (''Zukunft''), l'avoir-été (''Gewesenheit'') et le présent (''Gegenwart''). Ces trois ekstases ne sont pas trois moments séparés qui se succéderaient, mais trois dimensions co-originaires de la temporalité.
L'avenir n'est pas ce qui viendra plus tard, mais la dimension selon laquelle le Dasein se projette vers ses possibilités. L'avoir-été n'est pas le passé révolu, mais la facticité assumée, le fait que le Dasein se trouve toujours déjà jeté dans une situation héritée qu'il doit reprendre. Le présent n'est pas l'instant ponctuel, mais le moment de la préoccupation active par laquelle le Dasein se rend présent aux choses qui l'entourent. Dans l'existence authentique, ces trois ekstases se rassemblent dans une temporalité unifiée où le Dasein assume son passé en vue de son avenir propre et agit résolument dans le présent. Dans l'existence inauthentique au contraire, la temporalité se disperse : on fuit le passé, on attend passivement l'avenir et on se perd dans le présent immédiat.
== Critique et portée du concept ==
Le concept heideggérien de Dasein a exercé une influence considérable sur la philosophie du XXe siècle, notamment sur l'existentialisme français (Jean-Paul Sartre, Simone de Beauvoir, Maurice Merleau-Ponty, Albert Camus), l'herméneutique (Hans-Georg Gadamer, Paul Ricœur), la phénoménologie française (Emmanuel Levinas, Michel Henry, Jean-Luc Marion) et de nombreux autres courants philosophiques. Il a également inspiré des travaux en psychologie (Ludwig Binswanger, Medard Boss), en psychiatrie existentielle, en théologie (Rudolf Bultmann, Karl Rahner) et en sciences humaines.
Cependant, le concept de Dasein a aussi fait l'objet de critiques importantes. Sartre, tout en s'inspirant largement de Heidegger, lui reproche de ne pas suffisamment thématiser la liberté et de maintenir une ambiguïté sur le statut du néant<ref>Jean-Paul Sartre, ''L'Être et le Néant'', Paris, Gallimard, 1943.</ref>. Levinas critique la priorité accordée par Heidegger à l'être et à l'ontologie, au détriment de l'éthique et de la relation à autrui<ref>Emmanuel Levinas, ''Totalité et Infini'', La Haye, Martinus Nijhoff, 1961.</ref>. Des philosophes féministes ont souligné que l'analytique existentiale de Heidegger prétend à l'universalité mais semble présupposer une expérience masculine et ignorer les déterminations concrètes de l'existence comme le genre, la race ou la classe sociale.
L'engagement de Heidegger dans le parti nazi à partir de 1933 et son antisémitisme, désormais bien documentés notamment par les ''Cahiers noirs'', posent la question du lien entre sa philosophie et ses positions politiques. Si certains pensent que la philosophie du Dasein peut être séparée des errements politiques de son auteur, d'autres estiment que certaines structures conceptuelles de sa pensée (notamment l'historicisme, le primat de l'authenticité, le rejet de l'humanisme universaliste) ont pu favoriser son adhésion au nazisme.
Sur le plan strictement philosophique, on a également reproché à Heidegger de négliger la dimension corporelle du Dasein, de privilégier excessivement l'angoisse comme tonalité révélatrice au détriment d'autres dispositions affectives, et de ne pas suffisamment articuler l'ontologie fondamentale avec les sciences empiriques. La question de savoir si Heidegger est un idéaliste (pour qui l'être dépend de notre compréhension) ou un réaliste (pour qui l'être est indépendant de nous) demeure controversée parmi les interprètes.
Malgré ces critiques, le concept de Dasein reste un apport majeur à la philosophie contemporaine. Il a permis de dépasser le dualisme cartésien sujet-objet, de réhabiliter les dimensions pratiques et affectives de l'existence contre le primat de la théorie, de penser la finitude humaine autrement que comme une simple limitation négative, et de montrer que la compréhension de l'être passe nécessairement par une analyse de l'existence humaine concrète. Le Dasein heideggérien continue ainsi d'inspirer les recherches philosophiques sur la conscience, la temporalité, l'intersubjectivité et les structures fondamentales de l'existence humaine.
== Références ==
{{references}}
== Bibliographie ==
=== Œuvres de Heidegger ===
* Martin Heidegger, ''Sein und Zeit'', Tübingen, Max Niemeyer Verlag, 1927 (GA 2).
* Martin Heidegger, ''Être et Temps'', trad. Emmanuel Martineau, Paris, Authentica, 1985.
* Martin Heidegger, ''Être et Temps'', trad. François Vezin, Paris, Gallimard, coll. « Bibliothèque de philosophie », 1986.
* Martin Heidegger, ''Being and Time'', trad. John Macquarrie et Edward Robinson, Oxford, Blackwell, 1962.
* Martin Heidegger, ''Being and Time'', trad. Joan Stambaugh, révisée par Dennis J. Schmidt, Albany, SUNY Press, 2010.
* Martin Heidegger, ''Les Problèmes fondamentaux de la phénoménologie'', trad. Jean-François Courtine, Paris, Gallimard, 1985 (GA 24).
* Martin Heidegger, ''Prolégomènes à l'histoire du concept de temps'', trad. Alain Boutot, Paris, Gallimard, 2006 (GA 20).
=== Études critiques ===
* Henry E. Allison, « Kant and Existentialism », in Jon Stewart (éd.), ''The Palgrave Handbook of German Idealism and Existentialism'', Londres, Palgrave Macmillan, 2020, p. 51-75.
* William D. Blattner, ''Heidegger's Temporal Idealism'', Cambridge, Cambridge University Press, 1999.
* William D. Blattner, « Heidegger's Existentialism » in Jon Stewart (éd.), ''The Palgrave Handbook of German Idealism and Existentialism'', Londres, Palgrave Macmillan, 2020, p. 363-383.
* Taylor Carman, ''Heidegger's Analytic: Interpretation, Discourse, and Authenticity in Being and Time'', Cambridge, Cambridge University Press, 2003.
* David R. Cerbone, « Heidegger and Dasein's 'Bodily Nature' », ''International Journal of Philosophical Studies'', vol. 8, n° 1, 2000, p. 11-30.
* Hubert L. Dreyfus, ''Being-in-the-World: A Commentary on Heidegger's Being and Time, Division I'', Cambridge, MIT Press, 1991.
* Hans-Georg Gadamer, ''Les Chemins de Heidegger'', trad. Jean Grondin, Paris, Vrin, 2002.
* Markus Gabriel, « Heidegger and German Idealism », in Jon Stewart (éd.), ''The Palgrave Handbook of German Idealism and Existentialism'', Londres, Palgrave Macmillan, 2020, p. 399-412.
* Françoise Dastur, ''Heidegger et la question du temps'', Paris, PUF, coll. « Philosophies », 2011.
* Steven Crowell, « Heidegger », in ''Stanford Encyclopedia of Philosophy'', 2005, révisé en 2023.
* John Haugeland, ''Dasein Disclosed: John Haugeland's Heidegger'', éd. Joseph Rouse, Cambridge, Harvard University Press, 2013.
* Emmanuel Levinas, ''En découvrant l'existence avec Husserl et Heidegger'', Paris, Vrin, 1949.
* Stephen Mulhall, ''Heidegger's Being and Time'', 2e éd., Londres, Routledge, 2013.
* Jean-Paul Sartre, ''L'Être et le Néant. Essai d'ontologie phénoménologique'', Paris, Gallimard, 1943.
* Thomas Sheehan, ''Making Sense of Heidegger: A Paradigm Shift'', Londres, Rowman & Littlefield, 2015.
* Iain Thomson, « Heidegger and the Politics of the University », ''Journal of the History of Philosophy'', vol. 41, n° 4, 2003, p. 515-542.
* Mark Wrathall, ''Heidegger and Unconcealment: Truth, Language, and History'', Cambridge, Cambridge University Press, 2011.
* Nate Zuckerman, « Heidegger and the Essence of Dasein », ''The Southern Journal of Philosophy'', vol. 53, n° 4, 2015, p. 528-547.
=== Autres ressources ===
* Guillaume Badoual, « Être-avec », ''Encyclopædia Universalis'' [en ligne], consulté le 3 novembre 2025.
* « Dasein », ''Philosophie Magazine'' [en ligne], consulté le 3 novembre 2025.
* Jacques Derrida, « Les fins de l'homme », in ''Marges de la philosophie'', Paris, Minuit, 1972.
* Charles Guignon (éd.), ''The Cambridge Companion to Heidegger'', 2e éd., Cambridge, Cambridge University Press, 2006.
* Cristian Ciocan et Georges Hansel (éds.), ''Heidegger et les Grecs'', Bucarest, Zeta Books, 2006.
== Voir aussi ==
=== Voir aussi ===
{{MotPhilo|Être et Temps}}, {{MotPhilo|Existentialisme}}, {{MotPhilo|Phénoménologie}}, {{MotPhilo|Temporalité}}, {{MotPhilo|Authenticité}}, {{MotPhilo|Angoisse}}, {{MotPhilo|Mort}}, {{MotPhilo|Être-au-monde}}, {{MotPhilo|Ontologie}}, {{MotPhilo|Herméneutique}}
=== Liens externes ===
* [https://plato.stanford.edu/entries/heidegger/ Martin Heidegger] sur la ''Stanford Encyclopedia of Philosophy''
* [https://www.iep.utm.edu/heidegge/ Martin Heidegger] sur l'''Internet Encyclopedia of Philosophy''
* [https://heidegger-circle.org/ Heidegger Circle] (ressources académiques en anglais)
{{AutoCat}}
r4x5jj3exuwyypc2b2ekdiufs2h56jc
Dictionnaire de philosophie/Décadence
0
83061
768282
767009
2026-06-22T03:29:27Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768282
wikitext
text/x-wiki
{{DicoPhilo|Décadence|lecture=oui}}
La notion de décadence occupe une place singulière dans l'histoire de la philosophie. Elle se situe à la croisière des chemins entre philosophie de l'histoire, anthropologie, morale et critique sociale. Loin d'être un simple concept descriptif, la décadence désigne un processus de dégradation, de chute progressive qui mène d'un état supérieur, souvent idéalisé, vers un état inférieur marqué par la corruption des valeurs, l'affaiblissement des forces vitales ou la dissolution des structures sociales. Le terme provient du latin ''cadere'' (tomber), préfixé par ''de-'' qui marque l'intensité, et désigne étymologiquement l'état de ce qui commence à choir, à s'écrouler<ref>Dictionnaire de philosophie, sous la direction de Jacqueline Russ, entrée « Déclin, Décadence ».</ref>. Mais cette notion va bien au-delà d'une simple métaphore architecturale.
== Décadence et philosophie de l'histoire ==
=== Les origines antiques du concept ===
Bien que le substantif « décadence » soit d'usage tardif (latin médiéval ''decadentia''), l'idée d'une dégradation historique parcourt la pensée antique. Les Grecs avaient conscience de la fragilité des civilisations. Platon, dans la ''République'', décrit le passage progressif de la constitution idéale vers des formes politiques dégénérées : timocratie, oligarchie, démocratie et tyrannie. Chaque régime porte en lui les germes de sa propre corruption. Cette vision cyclique de l'histoire politique pose déjà la question centrale : comment les sociétés passent-elles de l'ordre à la corruption, de la vertu à la décadence<ref>Platon, ''République'', livres VIII et IX.</ref> ?
Les historiens romains, en particulier Salluste et Tite-Live, ont médité sur la décadence de Rome. Salluste, dans ''La Conjuration de Catilina'' et ''La Guerre de Jugurtha'', attribue la décadence romaine à la corruption des mœurs, à l'abandon des vertus ancestrales au profit du luxe, de l'ambition et de la cupidité<ref>Salluste, ''La Conjuration de Catilina'', chapitres X-XIII.</ref>. Cette thématique traverse l'historiographie romaine : la décadence apparaît comme le prix à payer pour la grandeur, la prospérité contenant en elle-même les principes de destruction. L'historien britannique Edward Gibbon reprendra magistralement ce thème dans son œuvre monumentale ''Histoire de la décadence et de la chute de l'Empire romain'' (1776-1789), où il explique que « le déclin de Rome était la conséquence naturelle et inévitable d'une grandeur immodérée. Sa prospérité mûrissait les principes de décadence »<ref>Edward Gibbon, ''Histoire de la décadence et de la chute de l'Empire romain'', chapitre LXXI.</ref>.
=== Montesquieu et la grandeur des Romains ===
Charles-Louis de Secondat, baron de Montesquieu, consacre en 1734 un ouvrage capital à cette question : ''Considérations sur les causes de la grandeur des Romains et de leur décadence''. Rompant avec l'approche moraliste, Montesquieu cherche à identifier les mécanismes structurels, les causes matérielles et politiques qui expliquent l'ascension puis le déclin de Rome. Il met en évidence le rôle des institutions, de l'organisation militaire, de l'expansion territoriale et des transformations économiques. La décadence n'est pas le fruit du hasard ou d'une dégénérescence morale abstraite, mais résulte de processus sociaux et politiques identifiables<ref>Montesquieu, ''Considérations sur les causes de la grandeur des Romains et de leur décadence'' (1734).</ref>. Cette approche inaugure une réflexion plus rigoureuse sur les dynamiques historiques.
=== Rousseau : progrès technique et décadence morale ===
Jean-Jacques Rousseau représente un tournant dans la pensée de la décadence. Dans le ''Discours sur les sciences et les arts'' (1750) et le ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), il renverse le paradigme des Lumières. Alors que ses contemporains célèbrent le progrès de la civilisation, Rousseau diagnostique une décadence morale concomitante au développement des sciences, des arts et des techniques. L'homme de l'état de nature, libre, autonome et bon, se trouve progressivement corrompu par la socialisation, la propriété privée, l'accumulation des richesses et la dépendance à l'égard d'autrui<ref>Jean-Jacques Rousseau, ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), seconde partie.</ref>.
Cette dialectique régressive constitue l'originalité de la pensée rousseauiste. Friedrich Engels dira plus tard que Rousseau fut le seul dialecticien du XVIIIe siècle, précisément parce qu'il pense le progrès de la civilisation comme négation perpétuelle de l'état de nature<ref>Friedrich Engels, ''Anti-Dühring'' (1878), première partie, chapitre XIII.</ref>. Le développement technique et culturel n'apporte pas le bonheur promis, mais engendre l'aliénation, l'inégalité et la servitude. Rousseau écrit : « Mécontent de ton état présent, par des raisons qui annoncent à ta postérité malheureuse de plus grands mécontentements encore, peut-être voudrois-tu pouvoir rétrograder »<ref>Rousseau, ''Discours sur l'inégalité'', préface.</ref>. La civilisation se paie au prix de la liberté et de l'authenticité.
Cependant, Rousseau ne prône pas le retour à l'état de nature, qu'il sait être à jamais perdu. Son projet, développé dans le ''Contrat social'' (1762), consiste à penser les conditions d'une organisation politique qui permette de concilier liberté et obligation sociale, de surmonter la décadence par l'instauration d'une volonté générale exprimant le bien commun<ref>Jean-Jacques Rousseau, ''Du contrat social'' (1762), livre I, chapitre VI.</ref>.
== Décadence et critique de la modernité ==
=== Spengler et le déclin de l'Occident ===
Au XXe siècle, la notion de décadence connaît un renouveau spectaculaire avec Oswald Spengler et son œuvre controversée ''Le Déclin de l'Occident'' (''Der Untergang des Abendlandes'', 1918-1922). Spengler élabore une morphologie de l'histoire universelle qui conçoit les civilisations comme des organismes vivants traversant des cycles de naissance, croissance, maturité et mort. Chaque culture possède une âme propre, un style unitaire qui s'exprime dans tous ses domaines : art, religion, politique, science, mathématiques<ref>Oswald Spengler, ''Le Déclin de l'Occident'', tome I, « Introduction », traduction M. Tazerout, Gallimard, 1948.</ref>.
La civilisation représente, chez Spengler, le dernier stade du développement d'une culture, celui du dépérissement. Ses caractéristiques sont la décadence dans l'expression artistique (éclectisme, académisme), le vide intellectuel, le scepticisme généralisé, l'urbanisation massive, la domination de la technique et de l'argent. L'Occident, parvenu au stade de la civilisation, est voué à un déclin imminent. Spengler écrit : « Une culture naît au moment où une grande âme se réveille, se détache de l'état psychique primaire d'éternelle enfance humaine. Elle meurt quand l'âme a réalisé la somme entière de ses possibilités, sous la forme de peuples, de langues, d'arts, d'États, de sciences, et qu'elle retourne ainsi à l'état psychique primaire »<ref>Spengler, ''Le Déclin de l'Occident'', tome I, chapitre II.</ref>.
Cette vision organiciste, teintée de pessimisme culturel, a exercé une influence considérable sur la pensée conservatrice et a préparé, malgré les réserves de Spengler lui-même à l'égard du nazisme, le terrain idéologique du national-socialisme. La notion de décadence devient ici un instrument de critique de la démocratie, du parlementarisme, de la modernité technique et urbaine.
=== Nietzsche : décadence et nihilisme ===
Friedrich Nietzsche occupe une position centrale dans la généalogie philosophique de la décadence. Sa préoccupation constante fut le diagnostic et la compréhension de la décadence comme maladie mortelle des temps modernes, qu'il nomme également « nihilisme ». Dans la préface du ''Cas Wagner'' (1888), il écrit : « Ma plus grande préoccupation a été, en vérité, le problème de la décadence »<ref>Friedrich Nietzsche, ''Le Cas Wagner'', préface (1888), traduction Henri Albert, Mercure de France, 1899.</ref>.
Nietzsche distingue deux formes de nihilisme. Le nihilisme passif désigne la crise qui affecte la civilisation occidentale et qui se traduit par la perte des instincts de vie, par la domination des valeurs morales et religieuses considérées comme supérieures à la vie elle-même. Ce nihilisme traduit la domination des faibles, de ceux qui, incapables d'affirmer la vie dans sa plénitude, cherchent refuge dans des arrière-mondes illusoires. Le nihilisme actif, au contraire, brise les éléments décadents et voit triompher la volonté de puissance des forts<ref>Nietzsche, ''La Volonté de puissance'', fragments posthumes (1887-1888).</ref>.
La décadence, chez Nietzsche, n'est pas simplement un déclin moral au sens traditionnel. Elle désigne un déclin de la force vitale, une manifestation d'une ligne de vie descendante. Nietzsche écrit : « La décadence c'est quand on commence à faire des choix qui ne sont pas favorables à soi-même »<ref>Nietzsche, ''L'Antéchrist'', § 6 (1888), traduction Éric Blondel, Garnier-Flammarion, 1994.</ref>. Les symptômes de la décadence incluent la haine du corps (comme dans le platonisme et le christianisme), l'ascétisme alimenté par la volonté de néant, la préférence pour ce qui manifeste une faible puissance vitale (morale des esclaves, goût démocratique, art déprimant).
Nietzsche analyse particulièrement la décadence dans l'art de son temps. Richard Wagner, d'abord admiré, devient pour Nietzsche l'incarnation même de la décadence artistique. Le style wagnérien se caractérise par la désagrégation de l'unité organique : « Le tout n'est plus un tout. [...] Le mot devient souverain et saute hors de la phrase, la phrase empiète et efface le sens de la page, la page prend vie aux dépens du tout – le tout n'est plus un tout »<ref>Nietzsche, ''Le Cas Wagner'', § 7.</ref>. Cette désintégration formelle reflète la décadence physiologique et spirituelle de Wagner lui-même.
Le platonisme et le christianisme constituent, aux yeux de Nietzsche, les matrices philosophiques et religieuses de la décadence occidentale. Platon, en inventant « l'Esprit pur et le Bien en soi », a opéré « le renversement même de la vérité, et la négation de la PERSPECTIVE – la condition fondamentale – de la vie »<ref>Nietzsche, ''Par-delà bien et mal'', préface (1886).</ref>. En dévalorisant le monde sensible au profit d'un monde intelligible fictif, en condamnant le corps, les passions, les instincts, le platonisme inaugure une longue tradition de négation de la vie que le christianisme radicalisera.
Baudelaire représente pour Nietzsche un cas exemplaire de décadence littéraire. Le poète français incarne la décadence fin-de-siècle : raffinement maladif, morbidité, fascination pour l'artificiel, névrose. Pourtant, Nietzsche reconnaît chez Baudelaire une lucidité exceptionnelle sur sa propre condition de décadent. Contrairement à Wagner, Baudelaire ne se voile pas la face. Cette conscience tragique fait de lui un témoin précieux de la modernité décadente<ref>Dorian Astor, « Baudelaire, Nietzsche et l'idée de décadence », in ''Le Parrhèsiaste'', 2018.</ref>.
== Décadence et matérialisme historique ==
=== La critique marxiste de l'idéologie bourgeoise ===
La tradition marxiste développe une approche matérialiste de la décadence qui rompt avec les explications moralisantes ou biologisantes. Pour Marx et Engels, les phénomènes de décadence culturelle et idéologique doivent être compris à partir des contradictions internes du mode de production capitaliste et des rapports sociaux qui le caractérisent.
Le matérialisme historique repose sur l'idée que ce sont les conditions matérielles d'existence, les rapports de production, qui déterminent en dernière instance les formes de conscience sociale. Comme l'écrivent Marx et Engels dans ''L'Idéologie allemande'' (1845-1846) : « Ce n'est pas la conscience des hommes qui détermine leur être ; c'est inversement leur être social qui détermine leur conscience »<ref>Karl Marx, ''Contribution à la critique de l'économie politique'', préface (1859).</ref>. Les idées dominantes d'une époque sont les idées de la classe dominante.
Dans cette perspective, la décadence idéologique de la bourgeoisie commence lorsque cette classe, devenue dominante après avoir renversé l'ordre féodal, perd son caractère progressiste et révolutionnaire. Tant que la bourgeoisie luttait contre la féodalité, elle portait des valeurs universelles : liberté, égalité, raison, progrès. Mais une fois au pouvoir, confrontée à l'émergence du prolétariat comme force sociale antagoniste, la bourgeoisie abandonne ses anciens idéaux et développe une idéologie conservatrice, apologétique du capitalisme<ref>Friedrich Engels, ''Anti-Dühring'' (1878), troisième partie.</ref>.
=== Lukács et la théorie de la décadence idéologique ===
György Lukács, philosophe marxiste hongrois, développe dans plusieurs textes une théorie systématique de la décadence idéologique bourgeoise. Dans l'article « Le problème de la décadence idéologique » (1938), repris dans ''Les problèmes du réalisme'', Lukács analyse les conditions historiques et sociales qui engendrent la dégradation de la pensée bourgeoise après 1848<ref>György Lukács, « Le problème de la décadence idéologique », in ''Les problèmes du réalisme'', L'Arche, 1975.</ref>.
Après les révolutions de 1848 et la répression sanglante du prolétariat parisien, la bourgeoisie prend conscience que le prolétariat représente une menace existentielle pour son pouvoir. Dès lors, elle ne peut plus maintenir l'illusion d'une émancipation universelle. Sa pensée entre en décadence : abandon du rationalisme des Lumières, rejet de la dialectique hégélienne, développement de l'irrationalisme (Schopenhauer, Nietzsche), spécialisation étroite des sciences sociales au détriment d'une compréhension globale de la totalité sociale.
Lukács montre que la décadence idéologique se manifeste par plusieurs tendances : le fétichisme de la marchandise (où les rapports sociaux apparaissent comme des rapports entre choses), la réification de la conscience (où les individus perdent la compréhension de leur rôle historique), le positivisme scientiste (qui refuse toute théorisation globale au profit d'une accumulation de faits empiriques), l'irrationalisme philosophique (qui glorifie l'instinct, l'inconscient, la volonté contre la raison)<ref>Georg Lukács, ''Histoire et conscience de classe'' (1923), chapitre « La réification et la conscience du prolétariat », Éditions de Minuit, 1960.</ref>.
Dans son grand ouvrage ''La destruction de la raison'' (''Die Zerstörung der Vernunft'', 1954), Lukács retrace l'itinéraire qui mène de l'irrationalisme philosophique allemand du XIXe siècle au fascisme. Il analyse comment la pensée de Schopenhauer, Nietzsche, Kierkegaard, Dilthey, puis Heidegger, prépare le terrain idéologique du national-socialisme en rejetant la raison, la dialectique, le progrès historique<ref>György Lukács, ''La destruction de la raison'', tome I, « L'irrationalisme allemand de Schelling à Hitler », L'Arche, 1958-1959.</ref>.
Lukács n'ignore pas la puissance et la profondeur de la pensée de Nietzsche. Mais il considère que le philosophe allemand, en dépit de son génie, demeure prisonnier de la décadence bourgeoise. Son diagnostic de la décadence est juste, mais sa thérapeutique (la volonté de puissance, le surhomme, le renversement des valeurs) reste idéaliste et individualiste. Nietzsche ne comprend pas que la décadence est un phénomène social enraciné dans les contradictions du capitalisme, et que seule l'action collective du prolétariat peut ouvrir une issue<ref>Lukács, « Nietzsche et le fascisme », in ''La destruction de la raison'', tome II.</ref>.
=== La décadence du capitalisme ===
Pour le marxisme, la décadence n'est pas seulement un phénomène idéologique ou culturel, mais caractérise le capitalisme lui-même parvenu à son stade impérialiste. Lénine, dans ''L'impérialisme, stade suprême du capitalisme'' (1916), analyse comment le capitalisme, après une phase progressive d'accumulation et d'expansion, entre dans une phase de décomposition marquée par la concentration monopoliste, le parasitisme financier, les guerres impérialistes pour le partage du monde<ref>Vladimir Lénine, ''L'impérialisme, stade suprême du capitalisme'' (1916), chapitre X, « La place de l'impérialisme dans l'histoire ».</ref>.
La théorie de la décadence du capitalisme devient centrale dans la tradition marxiste révolutionnaire. Elle permet de comprendre les catastrophes du XXe siècle (guerres mondiales, fascismes, crises économiques récurrentes) non comme des accidents, mais comme des manifestations de l'épuisement historique du mode de production capitaliste. Le capitalisme, incapable de développer davantage les forces productives sans engendrer destruction et barbarie, est devenu un obstacle au progrès de l'humanité<ref>« La théorie de la décadence au cœur du matérialisme historique », ''Revue internationale'', n° 118, 2004.</ref>.
Cette conception matérialiste de la décadence se distingue radicalement des théories organicistes (Spengler) ou vitalistes (Nietzsche). Elle situe la décadence non dans une fatigue biologique de la civilisation, ni dans une maladie de la volonté, mais dans les contradictions objectives du mode de production, dans l'antagonisme entre le développement des forces productives et les rapports de production capitalistes devenus archaïques<ref>Karl Marx, ''Contribution à la critique de l'économie politique'', préface : « À un certain degré de leur développement, les forces productives matérielles de la société entrent en contradiction avec les rapports de production existants ».</ref>.
== Conclusion : la décadence comme catégorie critique ==
La notion de décadence traverse toute l'histoire de la philosophie occidentale, depuis l'Antiquité jusqu'à nos jours. Elle témoigne d'une inquiétude permanente face au devenir historique, d'une interrogation sur les conditions de la grandeur et de la chute des civilisations. Concept aux frontières de l'histoire, de la morale, de l'esthétique et de la philosophie politique, la décadence a connu des usages multiples et parfois contradictoires.
Pour les Anciens, elle désignait la corruption des mœurs et la dégénérescence des institutions républicaines. Pour Rousseau, elle caractérisait le prix moral et existentiel du progrès technique. Pour Nietzsche, elle nommait le nihilisme occidental, la négation de la vie au profit d'arrière-mondes illusoires. Pour Spengler, elle décrivait l'automne biologique des cultures. Pour les marxistes, elle révélait les contradictions insurmontables du capitalisme parvenu à son terme historique.
Il faut se garder d'une conception purement négative de la décadence. Comme le montre l'exemple de Baudelaire, la conscience de la décadence peut être source de lucidité, d'innovation artistique, de critique sociale. Le mouvement décadent de la fin du XIXe siècle, loin de se limiter à une complaisance morbide, a souvent exprimé une révolte contre la médiocrité bourgeoise, contre l'utilitarisme et le conformisme de la société industrielle<ref>Mario Praz, ''La Chair, la mort et le diable dans la littérature du XIXe siècle. Le romantisme noir'', Denoël, 1977.</ref>.
D'un point de vue critique et marxiste, la notion de décadence demeure pertinente à condition d'être débarrassée de ses connotations biologisantes, élitistes ou réactionnaires. Elle permet de penser la crise structurelle d'un mode de production, l'épuisement historique d'une formation sociale, la dégradation idéologique d'une classe dominante qui a perdu sa légitimité. La décadence du capitalisme contemporain se manifeste dans la destruction écologique, dans les guerres sans fin, dans la montée des irrationalités politiques, dans la réification généralisée de l'existence.
Mais reconnaître la décadence d'un ordre social ne conduit pas au fatalisme. Au contraire, elle ouvre la possibilité d'un dépassement, d'une transformation émancipatrice. Comme l'écrivait Walter Benjamin : « Il n'y a rien qui ait autant corrompu les travailleurs allemands que l'idée qu'ils nagent dans le sens du courant »<ref>Walter Benjamin, « Sur le concept d'histoire » (1940), thèse XI.</ref>. Contre l'idéologie du progrès linéaire et nécessaire, contre le fatalisme décliniste, il s'agit de penser la décadence comme situation ouverte, comme espace de lutte où se joue l'avenir de l'humanité.
== Voir aussi ==
* [[Progrès]]
* [[Histoire]]
* [[Nihilisme]]
* [[Matérialisme historique]]
* [[Civilisation]]
== Références ==
{{references}}
== Bibliographie ==
* '''Rousseau, Jean-Jacques''', ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), Garnier-Flammarion, 2008.
* '''Montesquieu, Charles-Louis de Secondat''', ''Considérations sur les causes de la grandeur des Romains et de leur décadence'' (1734), Garnier-Flammarion, 1968.
* '''Nietzsche, Friedrich''', ''Le Cas Wagner'' (1888), in ''Œuvres philosophiques complètes'', tome VIII, Gallimard, 1974.
* '''Nietzsche, Friedrich''', ''L'Antéchrist'' (1888), traduction Éric Blondel, Garnier-Flammarion, 1994.
* '''Spengler, Oswald''', ''Le Déclin de l'Occident. Esquisse d'une morphologie de l'histoire universelle'' (1918-1922), traduction M. Tazerout, Gallimard, collection « Tel », 2 volumes, 2021.
* '''Lukács, György''', ''Histoire et conscience de classe. Essais de dialectique marxiste'' (1923), Éditions de Minuit, 1960.
* '''Lukács, György''', ''La destruction de la raison'' (1954), 2 volumes, L'Arche, 1958-1959.
* '''Lukács, György''', ''Les problèmes du réalisme'' (recueil d'articles), L'Arche, 1975.
* '''Marx, Karl''', ''Contribution à la critique de l'économie politique'' (1859), Éditions sociales, 1957.
* '''Lénine, Vladimir''', ''L'impérialisme, stade suprême du capitalisme'' (1916), Éditions sociales, 1971.
* '''Gibbon, Edward''', ''Histoire de la décadence et de la chute de l'Empire romain'' (1776-1789), Robert Laffont, collection « Bouquins », 1983.
* '''Benjamin, Walter''', « Sur le concept d'histoire » (1940), in ''Œuvres III'', Gallimard, 2000.
{{AutoCat}}
[[Catégorie:Philosophie de l'histoire]]
[[Catégorie:Philosophie politique]]
hfwv43igdj1x74xccm7x25ufncsamr5
Dictionnaire de philosophie/Démocratie
0
83062
768286
767285
2026-06-22T03:30:07Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768286
wikitext
text/x-wiki
{{DicoPhilo|Démocratie|lecture=oui}}
La '''démocratie''' (du grec ancien ''dêmos'', peuple, et ''kratos'', pouvoir) désigne, au sens le plus général, un mode d'organisation politique dans lequel le pouvoir est censé émaner du peuple et être exercé en son nom. Loin de constituer un concept univoque, la démocratie a donné lieu, depuis son émergence dans la Grèce antique, à des réalisations institutionnelles diverses, à des théorisations concurrentes et à des critiques parfois radicales. Elle oscille ainsi entre une définition descriptive (forme de régime) et une définition normative (exigence de liberté et d'égalité), tension qui traverse toute son histoire.
=== Les origines athéniennes et leur héritage ambigu ===
La démocratie athénienne naît au cours du VIe siècle avant notre ère, dans le contexte de crises sociales et politiques profondes, à la suite des réformes de Solon puis de Clisthène<ref>Moses I. Finley, ''Démocratie antique et démocratie moderne'', Paris, Payot, 1976, p. 38-42.</ref>. En 594, Solon abolit l'esclavage pour dettes, réorganise le corps civique sur la base censitaire et crée notamment l'Héliée, tribunal populaire où les citoyens peuvent contester les décisions des magistrats<ref>Claude Mossé, ''Histoire d'une démocratie : Athènes. Des origines à la conquête macédonienne'', Paris, Seuil, 1971, p. 25.</ref>. Clisthène, en 507, consolide ces transformations en instituant l’isonomie, c’est-à-dire l’égalité de tous les citoyens devant la loi, et en réorganisant la cité en tribus territoriales afin de briser les clientèles aristocratiques<ref>Pierre Lévêque et Pierre Vidal-Naquet, ''Clisthène l'Athénien'', Paris, Les Belles Lettres, 1964, p. 89.</ref>.
Cette démocratie repose sur trois grandes institutions : l’Assemblée du peuple (''ekklêsia''), où les citoyens votent les lois et les grandes décisions politiques ; le Conseil des Cinq-Cents (''boulè''), chargé de préparer les travaux de l’Assemblée ; et les tribunaux populaires (dont l’Héliée), qui exercent une fonction judiciaire et, de fait, politique. Le tirage au sort joue un rôle central dans la désignation de la plupart des magistrats, car il est censé prévenir la confiscation du pouvoir par une élite professionnelle et rappeler que, dans une démocratie, tout citoyen est réputé apte à gouverner<ref>Bernard Manin, ''Principes du gouvernement représentatif'', Paris, Calmann-Lévy, 1995, p. 28-31.</ref>. Aristote résume cette idée en affirmant que « le tirage au sort est considéré comme démocratique et l’élection comme oligarchique »<ref>Aristote, ''Politique'', livre IV, chapitre 9, 1294b, trad. J. Tricot, Paris, Vrin, 1962.</ref>.
Cependant, cette démocratie, souvent présentée comme le berceau du gouvernement populaire, demeure étroitement limitée. Seule une minorité de la population – les hommes libres nés de parents athéniens – a accès au statut de citoyen ; les femmes, les métèques (étrangers résidents) et les esclaves en sont exclus. On estime habituellement qu’environ 10 % de la population participent effectivement à la vie politique<ref>Josiah Ober, ''Mass and Elite in Democratic Athens'', Princeton, Princeton University Press, 1989, p. 4.</ref>. Par ailleurs, l’essor de la puissance athénienne s’appuie sur la mise en dépendance d’autres cités au sein de la ligue de Délos, ce qui donne à cette démocratie une dimension impériale et de classe : l’autonomie et la participation politiques des citoyens athéniens reposent en partie sur le travail des esclaves et sur les tributs prélevés sur les cités dominées<ref>Moses I. Finley, ''L'économie antique'', Paris, Éditions de Minuit, 1975, p. 102-106.</ref>. L’héritage athénien est ainsi double : il inaugure l’idée d’un pouvoir exercé directement par les citoyens, tout en manifestant les limites sociales, juridiques et impériales d’une démocratie qui ne bénéficie qu’à un groupe restreint.
=== La critique platonicienne : un regard aristocratique sur le ''dêmos'' ===
Platon développe dans ''La République'' une critique radicale de la démocratie athénienne. Pour lui, il s’agit d’un régime désordonné où règnent l’ignorance, l’instabilité et la domination des passions<ref>Platon, ''La République'', livre VIII, 557a-564a, trad. R. Baccou, Paris, GF-Flammarion, 1966.</ref>. La démocratie est décrite comme le moment où chacun prétend faire ce qu’il veut, où toutes les opinions se valent, où la cité devient une sorte de « marché » des modes de vie. Selon Platon, cette confusion des valeurs, jointe à la flatterie des démagogues, prépare presque inévitablement l’avènement de la tyrannie : un chef charismatique, issu souvent du peuple, se fait le porte-parole des frustrations populaires, élimine ses rivaux et concentre progressivement tous les pouvoirs.
Platon oppose à ce « gouvernement des opinions » la figure des philosophes-rois, seuls à même, selon lui, de connaître le Bien en soi et, par conséquent, de gouverner véritablement dans l’intérêt de la cité. Le procès et la condamnation de Socrate en 399 avant notre ère – décision d’un tribunal populaire – apparaissent comme l’emblème de l’injustice démocratique : le peuple, manipulé par les orateurs, condamne celui que Platon présente comme le plus juste des hommes<ref>I. F. Stone, ''Le procès de Socrate'', Paris, Odile Jacob, 1990, p. 198.</ref>. La critique platonicienne inaugure ainsi une longue tradition de méfiance aristocratique à l’égard du gouvernement populaire, qui mettra l’accent sur l’incompétence supposée du ''dêmos'' et sur la nécessité d’un gouvernement des meilleurs.
=== La défense aristotélicienne d’un gouvernement constitutionnel ===
Aristote adopte une position plus nuancée et moins radicalement hostile à la démocratie. Dans la ''Politique'', il propose une typologie des régimes politiques en distinguant les formes « droites », qui visent l’intérêt commun (monarchie, aristocratie, ''politeia''), et leurs déviations (tyrannie, oligarchie, ''dêmokratia'' entendue comme gouvernement des pauvres dans leur propre intérêt)<ref>Aristote, ''Politique'', livre III, chapitre 7, 1279a-b, trad. J. Tricot, Paris, Vrin, 1962.</ref>.
Aristote défend néanmoins une idée originale, parfois qualifiée de « sagesse cumulative ». Même si chaque citoyen, pris isolément, est limité dans ses jugements, la collectivité, par l’agrégation de ses points de vue et de ses expériences, peut parvenir à des décisions plus pertinentes que celles d’un petit nombre d’experts<ref>Aristote, ''Politique'', livre III, chapitre 11, 1281a-b.</ref>. Ce plaidoyer pour la participation populaire ne repose pas sur une idéalisation du peuple, mais sur la reconnaissance d’une forme d’intelligence collective. Dans la ''politeia'', régime mixte qui combine des éléments démocratiques et oligarchiques, le grand nombre participe à la délibération et au jugement (par exemple dans les tribunaux), tandis que certaines magistratures exigeant des compétences particulières peuvent être confiées à des citoyens plus qualifiés<ref>Francis Wolff, ''Aristote et la politique'', Paris, PUF, 1991, p. 67-71.</ref>. Aristote esquisse ainsi une défense d’un gouvernement constitutionnel modéré, associant le peuple à la chose publique sans pour autant lui confier la totalité du pouvoir.
=== La longue éclipse médiévale et la renaissance moderne ===
Après la chute de l’Empire romain, la démocratie disparaît comme forme de gouvernement reconnue pendant plus d’un millénaire dans l’espace européen. Le Moyen Âge occidental connaît des monarchies héréditaires, des pouvoirs seigneuriaux, des théocraties, ainsi que quelques républiques urbaines oligarchiques, mais aucun régime démocratique au sens d’un pouvoir exercé par l’ensemble des citoyens. Le terme même de « démocratie » conserve une connotation largement négative, évoquant le tumulte, la sédition et le gouvernement de la « populace »<ref>John Dunn, ''Democracy: A History'', New York, Atlantic Monthly Press, 2005, p. 31-33.</ref>.
C’est au XVIIIe siècle, dans le contexte des Lumières et des révolutions américaine et française, que la démocratie réapparaît, mais sous des formes profondément transformées. Les penseurs et les acteurs politiques de cette époque se réclament d’abord du « gouvernement représentatif » ou de la « république » plutôt que de la démocratie, terme encore suspect. Montesquieu, dans ''De l’esprit des lois'' (1748), théorise la séparation des pouvoirs – législatif, exécutif et judiciaire – comme protection contre le despotisme<ref>Montesquieu, ''De l'esprit des lois'', livre XI, chapitre 6, Paris, GF-Flammarion, 1979, p. 293-294.</ref>. Il ne fonde pas ce dispositif sur la souveraineté du peuple, mais sur un équilibre subtil entre les différents corps constitués (noblesse, monarchie, magistratures), propre à contenir l’arbitraire.
Les nouvelles institutions issues des révolutions atlantiques introduisent néanmoins, de fait, le principe de la souveraineté populaire, tout en le modérant par des mécanismes de représentation, de filtrage et de limitation des pouvoirs. C’est cette tension entre souveraineté populaire et gouvernement représentatif qui marquera durablement l’histoire de la démocratie moderne.
=== Rousseau et la volonté générale : une démocratie introuvable ===
Jean-Jacques Rousseau élabore, dans ''Du Contrat social'' (1762), une théorie de la souveraineté populaire qui exercera une influence décisive sur les conceptions modernes de la démocratie. Le contrat social repose sur l’idée que « chacun de nous met en commun sa personne et toute sa puissance sous la suprême direction de la volonté générale ; et nous recevons en corps chaque membre comme partie indivisible du tout »<ref>Jean-Jacques Rousseau, ''Du Contrat social'', livre I, chapitre 6, Paris, GF-Flammarion, 1966, p. 56.</ref>.
La volonté générale ne se confond ni avec la somme des volontés particulières, ni avec l’opinion d’une majorité contingente. Elle exprime l’intérêt commun, tel qu’il apparaît lorsque les citoyens délibèrent en mettant de côté leurs intérêts privés pour ne considérer que le bien public<ref>Jean-Jacques Rousseau, ''Du Contrat social'', livre II, chapitre 3, p. 67.</ref>. Pour Rousseau, la souveraineté, ainsi entendue, est inaliénable et indivisible : elle ne peut être déléguée à des représentants sans être dénaturée. Cette exigence conduit Rousseau à reconnaître le caractère presque irréalisable d’une démocratie au sens strict : « S’il y avait un peuple de dieux, il se gouvernerait démocratiquement. Un gouvernement si parfait ne convient pas à des hommes »<ref>Jean-Jacques Rousseau, ''Du Contrat social'', livre III, chapitre 4, p. 92.</ref>.
Rousseau dénonce en outre la confusion entre liberté politique et simple participation électorale. À propos de l’Angleterre, il écrit que le peuple « se croit libre ; il se trompe fort ; il ne l’est que durant l’élection des membres du parlement : sitôt qu’ils sont élus, il est esclave, il n’est rien »<ref>Jean-Jacques Rousseau, ''Du Contrat social'', livre III, chapitre 15, p. 122.</ref>. La critique rousseauiste anticipe ainsi les analyses ultérieures sur l’aliénation politique dans les démocraties représentatives : un peuple qui se contente de déléguer périodiquement le pouvoir sans participer réellement à la délibération et au contrôle des gouvernants n’exerce qu’une souveraineté très limitée.
=== Tocqueville et l’égalisation des conditions ===
Alexis de Tocqueville, dans ''De la démocratie en Amérique'' (1835-1840), propose une analyse sociologique originale de la démocratie moderne. Pour lui, la démocratie ne désigne pas d’abord un type de régime politique, mais un « état social » caractérisé par l’« égalité des conditions »<ref>Alexis de Tocqueville, ''De la démocratie en Amérique'', tome I, Introduction, Paris, GF-Flammarion, 1981, p. 37.</ref>. Cet état social résulte d’un long processus historique d’érosion des privilèges héréditaires et de mobilité sociale accrue, que Tocqueville considère comme irréversible.
L’égalité des conditions comporte plusieurs dimensions : l’égalité juridique (tous les citoyens sont soumis aux mêmes lois), l’ouverture des positions sociales en fonction du mérite, et l’égalité de considération, par laquelle chaque individu se perçoit comme l’égal de tout autre<ref>Pierre Manent, ''Tocqueville et la nature de la démocratie'', Paris, Julliard, 1982, p. 58-60.</ref>. Cette dynamique égalitaire nourrit ce que Tocqueville nomme la « passion de l’égalité », susceptible de soutenir la liberté mais aussi de lui nuire. En effet, le désir d’égalité peut conduire à accepter un pouvoir central fort, dès lors qu’il promet une protection uniforme pour tous.
Tocqueville met ainsi en lumière la possibilité d’un « despotisme doux » ou d’une « tyrannie de la majorité ». L’égalisation des conditions risque de produire des individus isolés, repliés sur leur sphère privée, peu enclins à participer activement à la vie publique. Dans une telle situation, la majorité peut imposer ses opinions comme une norme écrasante, tandis qu’un pouvoir administratif centralisé, paternaliste, organise la vie des citoyens au nom de leur bien-être<ref>Alexis de Tocqueville, ''De la démocratie en Amérique'', tome I, deuxième partie, chapitre 7, p. 290-300.</ref>. Tocqueville invite dès lors à concevoir des institutions – associations libres, autonomie communale, liberté de la presse – capables de préserver la liberté au cœur même de la société démocratique.
=== Marx et la critique de la démocratie bourgeoise ===
Karl Marx déplace la réflexion sur la démocratie en l’inscrivant dans une analyse des rapports de production et de classe. Dans sa ''Critique de la philosophie du droit de Hegel'' (1843), il distingue l’« émancipation politique », obtenue par les révolutions bourgeoises, de l’« émancipation humaine », qui suppose la suppression des rapports d’exploitation<ref>Karl Marx, ''Critique de la philosophie du droit de Hegel'', Introduction, dans ''Œuvres III, Philosophie'', Paris, Gallimard, Bibliothèque de la Pléiade, 1982, p. 382-397.</ref>.
La démocratie libérale, fondée sur l’égalité juridique et les droits formels, masque selon lui les inégalités réelles liées à la propriété privée des moyens de production. L’État moderne institue une séparation entre la sphère politique, où les individus sont reconnus comme citoyens égaux, et la sphère économique, où ils restent insérés dans des rapports d’exploitation. Cette dissociation produit une forme d’aliénation : les individus se vivent comme libres dans l’espace politique, alors même qu’ils demeurent dominés dans la production<ref>Miguel Abensour, ''La démocratie contre l'État. Marx et le moment machiavélien'', Paris, Le Félin, 2004, p. 89-92.</ref>.
Dans ''Les Luttes de classes en France'' (1850) et dans ''La Guerre civile en France'' (1871), Marx analyse la Commune de Paris comme une expérience de « démocratie prolétarienne ». Par l’élection de délégués révocables, la fusion des fonctions législatives et exécutives, le contrôle permanent des mandataires par les mandants, la Commune incarne selon lui « la forme politique enfin trouvée sous laquelle l’émancipation économique du travail peut se réaliser »<ref>Karl Marx, ''La Guerre civile en France'', Paris, Éditions sociales, 1968, p. 46-48 et p. 62.</ref>. L’expression « dictature du prolétariat » désigne alors non une dictature au sens moderne, mais une phase de transition où la classe laborieuse, majoritaire, exerce le pouvoir pour abolir les conditions de sa propre domination.
=== Les démocraties libérales au XXe siècle : représentation et limites ===
Les démocraties contemporaines se présentent principalement sous la forme de démocraties représentatives, dans lesquelles les citoyens élisent périodiquement leurs gouvernants. Bernard Manin a montré que « les démocraties contemporaines sont issues d'une forme de gouvernement que ses fondateurs opposaient à la démocratie »<ref>Bernard Manin, ''Principes du gouvernement représentatif'', op. cit., p. 11.</ref>. Les révolutionnaires américains et français ont en effet délibérément privilégié l’élection au détriment du tirage au sort, précisément parce qu’elle permet de sélectionner une élite jugée plus apte à gouverner.
L’élection tend ainsi à produire une « aristocratie élective ». Elle favorise les individus disposant de ressources économiques, culturelles et relationnelles suffisantes pour mener campagne et occuper durablement la scène politique. La professionnalisation de la politique, analysée notamment par Max Weber, renforce cette tendance : les élus deviennent des « professionnels » du pouvoir, séparés des citoyens ordinaires<ref>Max Weber, ''Le savant et le politique'', Paris, Plon, 1959, p. 100-110.</ref>. La démocratie représentative oscille dès lors entre deux pôles : d’un côté, la légitimation par le suffrage universel ; de l’autre, l’autonomie des représentants, qui disposent d’une large marge de manœuvre une fois élus et échappent largement au contrôle effectif de leurs électeurs.
Le XXe siècle voit certes l’extension progressive du suffrage universel (notamment aux femmes, dans la plupart des pays occidentaux entre 1918 et 1945) et l’édification de l’État-providence, qui élargit les droits sociaux (assurance maladie, retraite, protection contre le chômage). Mais ces conquêtes se heurtent à une limite structurelle : les décisions économiques majeures (investissements, délocalisations, orientation technologique) demeurent largement entre les mains du capital privé et des grandes entreprises, échappant au contrôle direct des citoyens et même, souvent, des Parlements<ref>Charles Lindblom, ''Politique et marchés'', Paris, Economica, 1977, p. 203-207.</ref>. La démocratie politique coexiste ainsi avec une organisation économique fondamentalement hiérarchique.
=== Habermas et la démocratie délibérative ===
Jürgen Habermas propose, dans ''Droit et démocratie'' (1992), une théorie de la démocratie dite « délibérative », qui met l’accent sur la formation discursive de la volonté politique. Il conçoit l’espace public comme une sphère intermédiaire entre l’État et la société civile, dans laquelle se déploient débats, controverses et prises de position sur les questions d’intérêt commun<ref>Jürgen Habermas, ''Droit et démocratie. Entre faits et normes'', Paris, Gallimard, 1997, p. 332.</ref>. La légitimité des normes juridiques dépend, selon lui, de la qualité des procédures de délibération : seules les décisions issues d’un processus argumentatif ouvert, inclusif et orienté vers la recherche d’un accord peuvent prétendre à la validité.
Habermas distingue le « pouvoir communicationnel », qui se forme dans l’espace public à travers les échanges argumentés, du « pouvoir administratif », exercé par l’appareil d’État. Une démocratie bien ordonnée suppose que le pouvoir administratif reste perméable et soumis au pouvoir communicationnel, c’est-à-dire au flux des opinions et des volontés formées dans l’espace public<ref>Jürgen Habermas, ''L'espace public et démocratie délibérative : un tournant'', Paris, Gallimard, 2023, p. 56-58.</ref>. Cette approche met au centre la dimension discursive de la démocratie et l’importance des droits fondamentaux (liberté d’expression, de presse, d’association) comme conditions de possibilité de la délibération.
Cette théorie a suscité de nombreuses critiques. Des auteurs comme Nancy Fraser ont souligné qu’Habermas tend à idéaliser l’espace public, en sous-estimant les rapports de domination qui le traversent : inégalités d’accès à la parole, asymétries de compétences, hiérarchies de crédibilité entre locuteurs<ref>Nancy Fraser, « Repenser l'espace public », dans ''Hermès'', n° 31, 2001, p. 107-142.</ref>. D’autres lui reprochent de négliger les dimensions agonistiques de la politique, où les conflits irréductibles d’intérêts et de valeurs ne peuvent être résolus par la seule argumentation rationnelle.
=== Arendt et la démocratie face au totalitarisme ===
Hannah Arendt, dans ''Les Origines du totalitarisme'' (1951), analyse la naissance des régimes totalitaires au sein de sociétés marquées par la démoralisation de la vie politique et l’atomisation des individus. La démocratie de masse, lorsque les citoyens se replient sur leur vie privée et se désintéressent des affaires communes, peut paradoxalement ouvrir la voie à des mouvements totalitaires qui exploitent l’isolement et le ressentiment<ref>Hannah Arendt, ''Les Origines du totalitarisme'', tome III, ''Le système totalitaire'', Paris, Seuil, 1972, p. 179-185.</ref>.
Pour Arendt, la démocratie authentique suppose au contraire l’existence d’un espace public où les citoyens apparaissent les uns aux autres par leurs paroles et leurs actes. Elle distingue ainsi le domaine politique, lieu de l’action et de la liberté, du simple domaine social, centré sur la satisfaction des besoins et la gestion de la vie. Les conseils révolutionnaires (soviets originaires, conseils ouvriers hongrois de 1956, formes d’auto-organisation dans les résistances) incarnent pour elle des moments privilégiés de politique démocratique, où des individus ordinaires prennent directement en charge les affaires communes<ref>Hannah Arendt, ''La crise de la culture'', Paris, Gallimard, 1972, p. 261-265.</ref>. La réflexion arendtienne rappelle ainsi que la démocratie ne se réduit pas à un ensemble d’institutions, mais requiert une pratique vivante de l’action commune.
=== Rancière et la « haine de la démocratie » ===
Jacques Rancière développe, dans ''La Mésentente'' (1995) et ''La Haine de la démocratie'' (2005), une conception radicale de la démocratie. Celle-ci ne désigne ni une forme de gouvernement stabilisée, ni un type déterminé de société, mais un principe subversif : l’idée que n’importe qui est capable de gouverner<ref>Jacques Rancière, ''La Haine de la démocratie'', Paris, La Fabrique, 2005, p. 55.</ref>. La démocratie repose sur l’absence de tout titre naturel à gouverner : ni la naissance, ni la richesse, ni la compétence supposée ne peuvent fonder légitimement l’autorité politique.
Cette égalité politique fondamentale suscite, selon Rancière, la « haine de la démocratie » des élites intellectuelles, politiques et économiques, qui dénoncent tour à tour l’« excès de démocratie », l’« individualisme démocratique » ou les « populismes » afin de justifier la concentration du pouvoir entre les mains d’une oligarchie<ref>Jacques Rancière, ''La Haine de la démocratie'', op. cit., p. 13-15.</ref>. Rancière distingue la « police », c’est-à-dire l’ordre social qui répartit les places, les fonctions et la parole, de la « politique », qui survient lorsqu’une part de ceux qui ne comptaient pas fait irruption dans l’espace public pour revendiquer son égalité. La démocratie n’est, dans cette perspective, jamais donnée une fois pour toutes : elle est l’événement toujours possible par lequel les « sans-part » contestent l’ordre établi.
=== L’expérience indienne : la plus grande démocratie du monde ===
L’Inde offre un exemple particulièrement instructif de démocratie postcoloniale. Dès son indépendance, le 15 août 1947, le pays adopte un système parlementaire fondé sur le suffrage universel, ce qui contraste avec de nombreuses expériences postcoloniales marquées par l’autoritarisme<ref>Christophe Jaffrelot, ''La démocratie en Inde. Religion, caste et politique'', Paris, Fayard, 1998, p. 15-18.</ref>. La Constitution, promulguée le 26 janvier 1950 et rédigée sous la direction de Bhimrao Ambedkar, consacre les principes de démocratie, de laïcité et d’égalité citoyenne<ref>Granville Austin, ''The Indian Constitution: Cornerstone of a Nation'', Oxford, Oxford University Press, 1966, p. 50.</ref>. Texte particulièrement détaillé, elle affirme l’abolition de l’intouchabilité (article 17) et interdit toute discrimination fondée sur la religion, la caste, le sexe ou le lieu de naissance (article 15)<ref>B. R. Ambedkar, ''Writings and Speeches'', vol. 13, Bombay, Government of Maharashtra, 1994, p. 57-60.</ref>.
Cette démocratie politique se déploie pourtant sur un terrain social structuré par le système des castes. Les ''panchayats'', conseils de village qui assurent traditionnellement la gestion locale, constituaient des formes anciennes d’auto-gouvernement, mais fonctionnaient en réalité comme des institutions oligarchiques dominées par les hautes castes<ref>John Harriss, « Local Government Reform and Democratisation in India », ''Oxford Development Studies'', vol. 28, 2000, p. 235-238.</ref>. Gandhi a idéalisé ces ''panchayats'' dans sa vision du ''gram swaraj'' (autogouvernement villageois), concevant le village autonome comme cellule de base de la démocratie indienne<ref>M. K. Gandhi, ''Hind Swaraj'', 1909, rééd. Cambridge University Press, 1997, p. 67-71.</ref>. Mais sa position reste ambivalente à l’égard des castes, qu’il souhaite réformer plutôt qu’abolir radicalement<ref>Louis Dumont, ''Homo hierarchicus. Le système des castes et ses implications'', Paris, Gallimard, 1966, p. 243-246.</ref>.
Nehru, Premier ministre de 1947 à 1964, défend quant à lui un projet de modernisation et d’industrialisation, inspiré du socialisme et de la planification, tout en maintenant les libertés politiques<ref>Jawaharlal Nehru, ''The Discovery of India'', 1946, rééd. Penguin Books, 2004, p. 512-515.</ref>. La démocratie indienne combine ainsi une égalité politique formelle (suffrage universel immédiat) avec la persistance de hiérarchies sociales rigides. Le système de « discrimination positive » (''reservation''), qui accorde des quotas parlementaires, administratifs et universitaires aux castes répertoriées et aux tribus, vise à corriger ces inégalités structurelles, mais tend aussi à transformer les castes en identités politiques mobilisées par les partis<ref>Christophe Jaffrelot, ''Inde : la démocratie par la caste. Histoire d'une mutation socio-politique 1885-2005'', Paris, Fayard, 2005, p. 321-325.</ref>.
Ambedkar, lui-même issu d’une caste intouchable (les Mahars), formule de manière incisive la contradiction qui en résulte : « Comment pouvons-nous faire vivre ensemble égalité politique et inégalité sociale ? »<ref>B. R. Ambedkar, ''Annihilation of Caste'', 1936, rééd. Verso, 2014, p. 265.</ref>. À ses yeux, la démocratie requiert non seulement des institutions représentatives, mais aussi la destruction des structures sociales hiérarchiques qui minent l’égalité. Son analyse éclaire les difficultés communes à de nombreuses démocraties postcoloniales : les institutions empruntées à l’Occident se greffent sur des sociétés profondément stratifiées, ce qui limite leur potentiel émancipateur.
Depuis les années 1990, l’Inde connaît ce que certains auteurs ont qualifié de « révolution silencieuse » : les basses castes et les groupes longtemps dominés s’organisent politiquement, créent leurs propres partis et accèdent aux postes de pouvoir dans plusieurs États fédérés<ref>Christophe Jaffrelot, « La démocratisation paradoxale du système politique indien », ''Critique internationale'', n° 17, 2002, p. 125-140.</ref>. Cette évolution montre que la démocratie électorale peut devenir un instrument de transformation pour les opprimés, à condition qu’ils s’en saisissent activement. L’expérience indienne souligne aussi que la démocratie est moins un état stable qu’un processus conflictuel dans lequel s’affrontent des projets antagonistes de société.
=== Les expérimentations contemporaines : tirage au sort et démocratie participative ===
Face à la crise de confiance envers les institutions représentatives et à la montée de l’abstention, de nouvelles pratiques démocratiques émergent depuis les années 1990. Le tirage au sort, longtemps oublié dans les traditions occidentales modernes, connaît un regain d’intérêt à travers les jurys citoyens, les conférences de consensus, les assemblées tirées au sort et les conventions citoyennes<ref>Yves Sintomer, ''Le pouvoir au peuple. Jurys citoyens, tirage au sort et démocratie participative'', Paris, La Découverte, 2007, p. 28-35.</ref>. Ces dispositifs, parfois appelés « mini-publics », visent à associer des citoyens ordinaires, sélectionnés de manière aléatoire, à la délibération sur des questions complexe (climat, bioéthique, aménagement du territoire).
Le tirage au sort présente plusieurs avantages théoriques. Il assure une égalité formelle de chance d’être appelé à participer, permet une représentation plus fidèle de la diversité sociologique (âge, sexe, catégories sociales, territoires) et limite la formation d’une classe politique professionnelle<ref>Oliver Dowlen, ''The Political Potential of Sortition'', Exeter, Imprint Academic, 2008, p. 79-82.</ref>. Ces assemblées tirées au sort peuvent, lorsqu’elles sont bien conçues, favoriser une délibération moins stratégique et moins soumise aux intérêts partisans.
Cependant, dans la plupart des expériences actuelles, ces dispositifs demeurent consultatifs. L’ordre du jour, le cadrage des questions, la sélection des experts et l’usage effectif des recommandations restent largement contrôlés par les gouvernements et les institutions existantes<ref>Loïc Blondiaux, ''Le nouvel esprit de la démocratie'', Paris, Seuil, 2008, p. 96-99.</ref>. Le renouveau du tirage au sort pose ainsi une question plus large : s’agit-il d’un complément marginal destiné à améliorer l’acceptabilité des décisions, ou bien d’un levier potentiel pour reconfigurer en profondeur la distribution du pouvoir politique ?
=== Perspectives critiques : vers une démocratisation de la démocratie ===
Une réflexion critique sur la démocratie ne peut se borner à constater l’écart entre les institutions existantes et leurs idéaux proclamés ; elle doit interroger les conditions structurelles qui limitent l’exercice effectif du pouvoir populaire. Les démocraties libérales contemporaines combinent le suffrage universel avec le maintien de structures économiques profondément inégalitaires et de rapports de domination qui échappent à la délibération publique.
Dans la tradition socialiste et marxiste, l’approfondissement de la démocratie passe par l’extension du principe démocratique à la sphère économique : socialisation des principaux moyens de production, gestion collective des entreprises, contrôle des grandes orientations d’investissement, formes d’autogestion ouvrière<ref>Michael Lebowitz, ''The Socialist Alternative: Real Human Development'', New York, Monthly Review Press, 2010, p. 145-148.</ref>. L’idée directrice est que l’on ne peut parler de démocratie réelle tant que le lieu décisif du pouvoir – le contrôle de l’économie – reste concentré entre les mains d’une minorité.
D’autres propositions visent à transformer les procédures politiques elles-mêmes : usage plus systématique du tirage au sort pour certaines fonctions, mandats courts et strictement non renouvelables, révocabilité effective des élus, multiplication d’instances de démocratie directe (assemblées de quartier, conseils d’usine, référendums d’initiative citoyenne). Le développement de contre-pouvoirs populaires – syndicats, mouvements sociaux, collectifs territorialisés – apparaît également comme une condition essentielle pour que les gouvernés puissent contrôler en permanence les gouvernants.
Ces pistes supposent de remettre en question la séparation rigide entre représentants et représentés, entre « experts » et profanes, entre ceux qui décident et ceux qui subissent. Elles rejoignent l’intuition formulée par Marx selon laquelle « l’émancipation des travailleurs sera l’œuvre des travailleurs eux-mêmes »<ref>Karl Marx, ''Statuts de l'Association internationale des travailleurs'', 1864, dans ''Œuvres I, Économie'', Paris, Gallimard, Bibliothèque de la Pléiade, 1963, p. 458.</ref>. Dans cette perspective, la démocratie ne peut s’accomplir pleinement dans une société structurée par des classes antagonistes et par l’exploitation : elle implique une transformation en profondeur des rapports sociaux.
=== Conclusion ===
L’histoire de la démocratie témoigne d’une tension constante entre un idéal d’égalité politique et de participation des citoyens, et des pratiques institutionnelles qui tendent à restreindre, filtrer ou confisquer le pouvoir populaire. De la cité athénienne aux démocraties représentatives contemporaines, en passant par les expériences révolutionnaires, les critiques de la « démocratie bourgeoise » ou les formes nouvelles de démocratie participative, ce qui se joue est moins l’existence ou non d’institutions formellement démocratiques que la réalité du pouvoir exercé par ceux qui sont censés être le ''dêmos''.
Dans une perspective exigeante, la démocratie ne se réduit pas à des procédures électorales périodiques ni à la proclamation abstraite de l’égalité des droits. Elle implique la participation active des citoyens à la délibération, au contrôle et, autant que possible, à la décision sur les affaires communes ; elle suppose aussi un travail continu de réduction des inégalités sociales, économiques et symboliques qui vident de leur substance l’égalité politique. La « démocratisation de la démocratie » désignerait alors moins l’extension d’un modèle institutionnel donné que la poursuite, toujours inachevée, d’un processus d’émancipation, où les dominés contestent leur subordination et cherchent à instituer des formes de vie réellement communes.
== Références ==
{{references|colonnes=2}}
== Bibliographie ==
* Abensour, Miguel, ''La démocratie contre l'État. Marx et le moment machiavélien'', Paris, Le Félin, 2004
* Arendt, Hannah, ''Les Origines du totalitarisme'', Paris, Seuil, 1972 (3 tomes)
* Aristote, ''Politique'', traduction J. Tricot, Paris, Vrin, 1962
* Blondiaux, Loïc, ''Le nouvel esprit de la démocratie'', Paris, Seuil, 2008
* Finley, Moses I., ''Démocratie antique et démocratie moderne'', Paris, Payot, 1976
* Habermas, Jürgen, ''Droit et démocratie. Entre faits et normes'', Paris, Gallimard, 1997
* Manin, Bernard, ''Principes du gouvernement représentatif'', Paris, Calmann-Lévy, 1995
* Marx, Karl, ''La Guerre civile en France'', Paris, Éditions sociales, 1968
* Mossé, Claude, ''Histoire d'une démocratie : Athènes'', Paris, Seuil, 1971
* Platon, ''La République'', traduction R. Baccou, Paris, GF-Flammarion, 1966
* Rancière, Jacques, ''La Haine de la démocratie'', Paris, La Fabrique, 2005
* Rousseau, Jean-Jacques, ''Du Contrat social'', Paris, GF-Flammarion, 1966
* Sintomer, Yves, ''Le pouvoir au peuple'', Paris, La Découverte, 2007
* Tocqueville, Alexis de, ''De la démocratie en Amérique'', Paris, GF-Flammarion, 1981 (2 tomes)
* Wolff, Francis, ''Aristote et la politique'', Paris, PUF, 1991
== Voir aussi ==
* [[Égalité]]
* [[Liberté]]
* [[République]]
* [[Souveraineté]]
* [[Représentation politique]]
* [[Citoyenneté]]
* [[Classe sociale]]
* [[État]]
* [[Capitalisme]]
{{Autocat}}
g7kybhuhzs1xv8bqpmgzl1oiyy6eu3v
Dictionnaire de philosophie/Culture
0
83063
768280
767892
2026-06-22T03:29:07Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768280
wikitext
text/x-wiki
{{DicoPhilo|Culture|lecture=oui}}
La '''culture''' désigne l'ensemble des productions matérielles et symboliques par lesquelles l'humanité se différencie de la nature, se crée un monde propre et développe ses capacités. Ce concept, central en philosophie depuis l'Antiquité, trouve ses racines étymologiques dans le latin ''cultura'' (« cultiver la terre »), terme que Cicéron transpose à la sphère spirituelle en parlant de ''cultura animi'' (« culture de l'âme »)<ref>Cicéron, ''Tusculanes'', II, 13</ref>. La philosophie de la culture interroge fondamentalement le processus par lequel l'être humain s'arrache à la simple naturalité pour édifier un univers de significations, d'institutions et de pratiques qui constituent son monde propre.
==L'opposition classique nature/culture==
===Les fondements philosophiques de la distinction===
L'opposition entre nature et culture structure la pensée occidentale depuis ses origines. Aristote distingue déjà ce qui existe ''par nature'' (''physei'') de ce qui procède de l'''art'' ou de la ''technique'' (''technê''). Cette distinction s'approfondit avec la modernité. Le dualisme cartésien, en séparant la ''res extensa'' de la ''res cogitans'', établit une coupure ontologique entre le corps et l'esprit qui fonde l'opposition moderne entre nature et culture<ref>Descartes, ''Méditations métaphysiques'', Méditation VI, 1641</ref>. Comme le souligne Sari Lemable, « la scission cartésienne entre corps et esprit était formatrice pour l'idée d'un sujet conscient, autonome, indépendant, rationnel, objectif et universel »<ref>S. Lemable, « De l'anthropocène au Chthulucène », 2020, p. 156</ref>.
La tradition des Lumières consacre cette opposition en faisant de la culture l'instrument de perfectionnement de l'humanité. Rousseau théorise cette tension dans son ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' (1755), où il oppose l'homme naturel, caractérisé par la pitié et l'amour de soi, à l'homme civil, produit de la société et de la culture. Kant prolonge cette réflexion en définissant la culture comme « la production de l'aptitude d'un être raisonnable à des fins quelconques en général (donc celles de sa liberté) »<ref>Kant, ''Critique de la faculté de juger'', § 83, 1790</ref>. Dans cette perspective hégélienne, la culture devient le moment de la formation (''Bildung'') par laquelle l'esprit se réalise progressivement dans l'histoire.
===La critique structuraliste : Lévi-Strauss et l'universalité de la prohibition de l'inceste===
Claude Lévi-Strauss apporte une contribution décisive à la problématisation de cette opposition dans ''Les structures élémentaires de la parenté'' (1949). Il cherche à identifier le critère permettant de distinguer la nature de la culture : « Partout où la règle se manifeste, nous savons avec certitude être à l'étage de la culture. Symétriquement, il est aisé de reconnaître dans l'universel le critère de la nature »<ref>C. Lévi-Strauss, ''Les structures élémentaires de la parenté'', PUF, 1949, p. 9-10</ref>. Or la prohibition de l'inceste constitue un phénomène paradoxal : elle est universelle (donc apparemment naturelle) tout en étant normative (donc culturelle). Lévi-Strauss en conclut que la prohibition de l'inceste marque le passage de la nature à la culture, constituant « le processus et le moment où s'accomplit le passage de la nature à la culture »<ref>C. Lévi-Strauss, ''Les structures élémentaires de la parenté'', PUF, 1949, p. 29</ref>.
Cette approche structurale s'inscrit dans une démarche plus large visant à identifier les structures universelles de l'esprit humain sous la diversité des manifestations culturelles. Comme le souligne Marshall Sahlins, « la grande ambition de Lévi-Strauss fut de découvrir les lois universelles de l'esprit humain sous la diversité des cultures connues de l'ethnologie »<ref>M. Sahlins, « L'anthropologie de Lévi-Strauss », 2018</ref>. L'anthropologie structurale postule que « les formes de l'ordre culturel reflètent les lois sous-jacentes, générales, de l'esprit humain », approche qui culmine dans l'étude des mythologies amérindiennes des ''Mythologiques'' (1964-1971).
===La remise en question contemporaine de l'opposition===
La philosophie contemporaine, particulièrement face aux défis écologiques, remet profondément en question la pertinence de cette dichotomie. Philippe Descola, dans ''Par-delà nature et culture'' (2005), démontre que l'opposition entre nature et culture n'est pas un universel anthropologique mais une construction occidentale récente. Il propose une typologie de quatre ontologies – l'animisme, le totémisme, l'analogisme et le naturalisme – montrant que seul le naturalisme occidental établit une séparation radicale entre nature et culture<ref>P. Descola, ''Par-delà nature et culture'', Gallimard, 2005</ref>.
Bruno Latour prolonge cette critique en développant le concept d'« hybrides » qui transcendent la distinction moderne entre nature et culture. Dans ''Nous n'avons jamais été modernes'' (1991), il montre que les objets technoscientifiques contemporains – qu'il nomme « quasi-objets » – ne peuvent être compris ni comme purement naturels ni comme purement culturels. Ils nécessitent une « écologie politique » reconnaissant l'entrelacement fondamental du naturel et du culturel<ref>B. Latour, ''Nous n'avons jamais été modernes'', La Découverte, 1991, p. 15-21</ref>.
==Le matérialisme historique : la culture comme production sociale==
===Marx et la conception matérialiste de la culture===
Karl Marx opère une transformation profonde de la conception philosophique de la culture en l'inscrivant dans les rapports de production matériels. Dans ''L'idéologie allemande'' (1845-1846), il énonce le principe fondamental du matérialisme historique : « Ce n'est pas la conscience qui détermine la vie, c'est la vie qui détermine la conscience »<ref>K. Marx et F. Engels, ''L'idéologie allemande'', Éditions sociales, 1976 [1845-1846], p. 44</ref>. La culture n'est pas une sphère autonome de l'esprit mais une « superstructure » déterminée en dernière instance par l'« infrastructure » économique, c'est-à-dire par les forces productives et les rapports de production.
Cette perspective matérialiste implique que les productions culturelles – art, religion, philosophie, droit – expriment les intérêts de la classe dominante et contribuent à la reproduction des rapports sociaux de domination. Dans la célèbre formule du ''18 Brumaire de Louis Bonaparte'' (1852), Marx affirme : « Les hommes font leur propre histoire, mais ils ne la font pas arbitrairement, dans les conditions choisies par eux, mais dans des conditions directement données et héritées du passé »<ref>K. Marx, ''Le 18 Brumaire de Louis Bonaparte'', Éditions sociales, 1969 [1852], p. 15</ref>.
Le matérialisme marxiste conserve néanmoins une place centrale pour la praxis, cette activité pratique par laquelle l'humanité transforme le monde et se transforme elle-même. La onzième thèse sur Feuerbach l'exprime de manière lapidaire : « Les philosophes n'ont fait qu'interpréter diversement le monde, ce qui importe, c'est de le transformer »<ref>K. Marx, ''Thèses sur Feuerbach'', thèse XI, 1845</ref>. Cette dimension praxéologique du marxisme sera particulièrement développée par Antonio Gramsci et l'École de Francfort.
===Gramsci et l'hégémonie culturelle===
Antonio Gramsci approfondit la réflexion marxiste sur la culture en élaborant le concept d'« hégémonie culturelle ». Dans les ''Quaderni del carcere'' (1929-1935), il théorise la domination non plus seulement comme coercition politique et économique, mais comme direction intellectuelle et morale. L'hégémonie désigne « le moment de direction politique et du niveau des idées qui crée, politiquement, un bloc historique de nature sociale »<ref>A. Gramsci, ''Quaderni del carcere'', Einaudi, 1975, Q. 10, § 12</ref>.
Pour Gramsci, la « philosophie de la praxis » – terme qu'il utilise dans ses Cahiers pour désigner le marxisme – doit devenir une « culture de masse » capable de rivaliser avec l'hégémonie bourgeoise. Il écrit : « la philosophie de la praxis [...] tend [...] à maintenir les simples dans leur philosophie primitive du sens commun, mais au contraire à les conduire à une conception supérieure de la vie »<ref>A. Gramsci, ''Quaderni del carcere'', Einaudi, 1975, Q. 11, § 12</ref>. Cette transformation culturelle nécessite l'intervention des « intellectuels organiques », liés à leur classe d'origine et capables de produire une nouvelle vision du monde.
L'apport gramscien se distingue du marxisme orthodoxe par sa reconnaissance de l'autonomie relative de la sphère culturelle. Comme le souligne la recherche contemporaine, « la détermination fondamentale de la philosophie de la praxis est [...] d'être une conception de masse, une culture de masse et de [une] masse qui opère unitairement »<ref>G. Vacca, « La filosofia della praxis di Antonio Gramsci », 2014, p. 3</ref>. L'hégémonie culturelle devient ainsi l'enjeu central de la lutte politique, nécessitant une réforme intellectuelle et morale de la société.
===L'École de Francfort et la critique de l'industrie culturelle===
Theodor W. Adorno et Max Horkheimer, dans ''La dialectique de la Raison'' (''Dialektik der Aufklärung'', 1947), développent une critique radicale de la culture sous le capitalisme avancé à travers le concept d'« industrie culturelle » (''Kulturindustrie''). Ce terme, forgé pour remplacer l'expression « culture de masse » jugée ambiguë, désigne le processus de rationalisation et de marchandisation de la production culturelle<ref>T.W. Adorno et M. Horkheimer, ''La Dialectique de la Raison'', Gallimard, 1974 [1947], p. 129-176</ref>.
L'industrie culturelle soumet les œuvres d'art aux impératifs de productivité et de rentabilité du capitalisme. « Le terrain sur lequel la technique acquiert son pouvoir sur la société est le pouvoir de ceux qui la dominent économiquement », écrivent Adorno et Horkheimer. « De nos jours, la rationalité technique est la rationalité de la domination même. Elle est le caractère coercitif de la société aliénée »<ref>T.W. Adorno et M. Horkheimer, ''La Dialectique de la Raison'', Gallimard, 1974 [1947], p. 130</ref>. Cette standardisation produit une pseudo-individualité où les différences ne sont que superficielles, masquant une homogénéisation profonde.
La critique adornienne s'étend particulièrement à la musique populaire et au jazz, analysés comme manifestations d'une régression culturelle. Dans ''Philosophie de la nouvelle musique'' (1949) et ses nombreux essais sur la musique, Adorno oppose l'art authentique, caractérisé par son autonomie et sa négativité critique, aux productions standardisées de l'industrie culturelle qui fonctionnent comme instruments d'adaptation sociale et de reproduction idéologique. Cette position, souvent jugée élitiste, témoigne néanmoins d'une inquiétude profonde face à la transformation de la culture en marchandise et à la neutralisation de son potentiel émancipateur.
==Les philosophies de la culture comme système symbolique==
===Cassirer et la philosophie des formes symboliques===
Ernst Cassirer élabore dans sa ''Philosophie des formes symboliques'' (''Philosophie der symbolischen Formen'', 1923-1929) une théorie systématique de la culture comme ensemble de productions symboliques. Inscrite dans la tradition néokantienne, sa philosophie étend la critique de la raison pure en une critique de la culture : « À côté de la pure fonction de connaissance, il s'agit d'appréhender les fonctions de la pensée linguistique, de la pensée mythico-religieuse et de l'intuition artistique de sorte qu'apparaisse clairement comment à l'intérieur de chacune d'elles une certaine configuration – configuration non pas tant du monde que configuration en monde – se réalise comme connexion objective de sens ou comme ensemble objectif de l'intuition »<ref>E. Cassirer, ''La philosophie des formes symboliques I. Le Langage'', Minuit, 1972 [1923], p. 20</ref>.
Pour Cassirer, une « forme symbolique » désigne « cette énergie de l'esprit par laquelle un contenu de signification intelligible est accolé à un signe sensible concret et intrinsèquement adapté à ce signe »<ref>E. Cassirer, « Le concept de forme symbolique dans l'édification des sciences de l'esprit », dans ''Trois Essais sur le symbolique'', Cerf, 1997, p. 13</ref>. La culture humaine se déploie à travers différentes formes symboliques – le mythe, le langage, l'art, la religion, la science – qui constituent autant de modalités par lesquelles l'esprit organise l'expérience et construit un monde de significations.
Le concept de « prégnance symbolique » (''symbolische Prägnanz'') est central dans cette philosophie. Il désigne « la façon dont un contenu de perception, en tant que vécu sensible, renferme en même temps un certain « sens » non intuitif qu'il amène à une représentation immédiate et concrète »<ref>E. Cassirer, ''La philosophie des formes symboliques III. La phénoménologie de la connaissance'', Minuit, 1972 [1929], p. 229</ref>. Cette notion permet de penser l'unité indissoluble du sensible et de l'intelligible dans toute expérience culturelle, dépassant ainsi l'alternative entre empirisme et idéalisme.
La philosophie cassirerienne de la culture a une portée éthique et politique. Face à la montée du nazisme, Cassirer analyse dans ''Le mythe de l'État'' (1946) la résurgence des formes mythiques de pensée dans la vie politique moderne. Il montre comment les régimes totalitaires exploitent la puissance émotionnelle du mythe pour détruire les formes rationnelles de la culture. Cette analyse fait de la philosophie de la culture un instrument critique pour comprendre et combattre les pathologies politiques de la modernité.
===Hegel et la culture comme auto-déploiement de l'Esprit===
La philosophie hégélienne accorde à la culture (''Bildung'') une place centrale dans le processus par lequel l'Esprit (''Geist'') se réalise et parvient à la connaissance de soi. Dans la ''Phénoménologie de l'Esprit'' (1807), Hegel décrit la culture comme le mouvement par lequel la conscience individuelle s'arrache à l'immédiateté naturelle pour s'élever à l'universel. « La culture est l'aliénation de la substance naturelle », écrit-il, processus douloureux mais nécessaire par lequel l'esprit subjectif accède à l'objectivité<ref>Hegel, ''Phénoménologie de l'Esprit'', Aubier, 1991 [1807], t. II, p. 11-73</ref>.
Dans les ''Principes de la philosophie du droit'' (1821), Hegel théorise l'« esprit objectif » comme la sphère où l'esprit se donne une réalité extérieure à travers les institutions sociales et politiques. La culture désigne alors l'ensemble des médiations – famille, société civile, État – par lesquelles l'individu s'approprie la substance éthique de son peuple. Comme l'explique Michael Rosen, « pour Hegel, l'esprit consiste en un processus et une structure de réflexion, d'autodifférenciation et de prise de conscience d'un tout articulé, dans les individus autonomes »<ref>M. Rosen, « Liberté, Esprit et Histoire », p. 3</ref>.
Cette conception hégélienne influence profondément la pensée allemande du XIXe siècle. Le concept de ''Bildung'' devient central dans l'idéalisme allemand et le néohumanisme, désignant à la fois la formation individuelle et l'autocréation historique de l'humanité. La culture n'est pas une accumulation de connaissances mais un processus de transformation de soi par appropriation de l'universel. Cette perspective téléologique, selon laquelle la culture constitue le développement progressif de la liberté humaine, sera reprise et transformée par Marx dans sa conception matérialiste de l'histoire.
==Anthropologie philosophique et culture==
===Gehlen et l'homme comme être de culture par nécessité===
Arnold Gehlen développe dans ''L'Homme. Sa nature et sa position dans le monde'' (''Der Mensch'', 1940) une anthropologie philosophique qui fait de la culture non un ajout facultatif à la nature humaine mais sa condition de possibilité même. L'homme est défini comme un « être déficient » (''Mängelwesen''), caractérisé par son inachèvement biologique et son absence d'adaptation spécialisée à un milieu particulier<ref>A. Gehlen, ''L'Homme. Sa nature et sa position dans le monde'', Gallimard, 2021 [1940], p. 45-67</ref>.
Cette déficience constitutive oblige l'être humain à compenser par l'action et la technique ses handicaps biologiques. « L'action et les transformations prévues du monde, dont la quintessence porte le nom de "culture", font partie de l'"essence" de l'être humain », écrit Gehlen<ref>A. Gehlen, ''Essais d'anthropologie philosophique'', Éditions de la MSH, 2010, p. 15</ref>. La culture n'est donc pas une dimension secondaire qui viendrait s'ajouter à une nature humaine préétablie, mais la modalité même de l'existence humaine. L'homme n'a pas de nature au sens où les animaux en ont une ; sa « nature » consiste précisément à créer une « seconde nature » culturelle.
Cette anthropologie conduit Gehlen à élaborer une théorie des institutions comme structures stabilisatrices nécessaires face à la plasticité et à l'indétermination de la nature humaine. Les institutions culturelles – langage, famille, État, religion – permettent à l'homme de décharger sa conscience de la surcharge de stimuli et de possibilités qui résulterait de son ouverture biologique au monde. Cette théorie conservatrice des institutions sera vivement critiquée par l'École de Francfort, notamment par Adorno et Habermas, qui y voient une légitimation du conformisme social.
===L'humanisme et la culture chez Arendt===
Hannah Arendt développe dans ''La crise de la culture'' (1961) une réflexion sur le statut de la culture dans les sociétés modernes et totalitaires. Elle distingue la culture authentique, liée à la durabilité du monde commun et à la transmission intergénérationnelle, de l'industrie culturelle qui transforme les œuvres en objets de consommation éphémère. « La société de masse ne veut pas la culture mais le loisir (entertainment) », écrit-elle, soulignant la menace que fait peser sur la culture la logique de consommation<ref>H. Arendt, ''La crise de la culture'', Gallimard, 1972 [1961], p. 265</ref>.
Dans sa préface à ''La crise de la culture'', Arendt diagnostique « la brèche entre le passé et le futur », cette perte de la tradition qui caractérise la modernité. La rupture de la tradition ne signifie pas simplement l'oubli du passé mais la perte de l'autorité que celui-ci exerçait sur le présent. « Longtemps, pour ce faire, on put recourir à la tradition. Or nous vivons, à l'âge moderne, l'usure de la tradition, la crise de la culture »<ref>H. Arendt, ''La crise de la culture'', Gallimard, 1972 [1961], p. 11</ref>. Cette analyse s'inscrit dans une réflexion plus large sur la condition humaine et la nécessité de préserver un monde commun contre les tendances destructrices du totalitarisme et de la société de consommation.
La conception arendtienne de la culture est intimement liée à sa théorie de l'action politique. La culture constitue le monde commun, cet espace intermédiaire et durable entre les hommes, distinct de la sphère privée du travail et de la nécessité. Les œuvres culturelles ont pour fonction de stabiliser et d'humaniser le monde, de lui conférer une permanence qui transcende la mortalité individuelle. Cette vision humaniste de la culture comme édification d'un monde commun fonde une critique de la modernité qui ne renonce ni à la tradition ni à la possibilité d'un nouveau commencement.
==La sociologie critique de la culture==
===Bourdieu : capital culturel et reproduction sociale===
Pierre Bourdieu élabore une théorie sociologique de la culture qui met en évidence son rôle dans la reproduction des inégalités sociales. Dans ''La Reproduction'' (1970) et ''La Distinction'' (1979), il forge le concept de « capital culturel » pour désigner l'ensemble des ressources culturelles – connaissances, compétences, diplômes, pratiques – dont dispose un individu et qui lui confèrent un avantage dans la compétition sociale<ref>P. Bourdieu et J.-C. Passeron, ''La Reproduction'', Minuit, 1970, p. 38-45</ref>.
Le capital culturel existe sous trois formes : une forme « incorporée » (l'habitus culturel, les dispositions acquises), une forme « objectivée » (les biens culturels possédés) et une forme « institutionnalisée » (les diplômes et titres scolaires)<ref>P. Bourdieu, « Les trois états du capital culturel », ''Actes de la recherche en sciences sociales'', n°30, 1979, p. 3-6</ref>. Cette triple articulation permet de comprendre comment la culture fonctionne comme un capital, c'est-à-dire comme une ressource accumulable, transmissible et convertible en d'autres formes de capital (économique, social).
La théorie bourdieusienne démontre que l'école, loin de compenser les inégalités sociales, contribue à les reproduire en valorisant le capital culturel hérité des classes dominantes. Les enfants des milieux favorisés bénéficient d'un « capital culturel hérité » qui leur permet de réussir scolairement et d'accéder à des positions sociales élevées, perpétuant ainsi les hiérarchies sociales. Cette analyse dénaturalise les « dons » et les « talents » en montrant leur caractère socialement construit et inégalement distribué.
Le concept d'« habitus », central dans la sociologie bourdieusienne, désigne le système de dispositions durables et transposables qui structure les pratiques et les représentations des individus. L'habitus culturel se forme à travers la socialisation familiale et scolaire, incorporant les schèmes de perception et d'appréciation propres à chaque classe sociale. Cette « violence symbolique » exercée par la culture légitime est d'autant plus efficace qu'elle est méconnue comme telle par les dominés eux-mêmes.
===Raymond Williams et le matérialisme culturel===
Raymond Williams développe dans ''Culture and Society'' (1958) et ''Marxism and Literature'' (1977) un « matérialisme culturel » qui refuse le réductionnisme économique du marxisme orthodoxe tout en maintenant une perspective matérialiste. Contre l'opposition base/superstructure, Williams affirme que « la production culturelle est elle-même une forme de production matérielle »<ref>R. Williams, ''Marxism and Literature'', Oxford University Press, 1977, p. 93-97</ref>.
Le concept de « structure de sentiments » (''structure of feeling'') permet à Williams de saisir la dimension vécue et émergente de la culture, cette « expérience en solution » qui précède sa cristallisation en formes culturelles stabilisées. La culture n'est pas un ensemble de productions achevées mais un processus vivant, une « pratique signifiante » en constant devenir<ref>R. Williams, ''Culture and Materialism'', Verso, 2009 [1980], p. 47-51</ref>.
Williams distingue trois niveaux dans l'analyse culturelle : la culture « résiduelle » (héritée du passé), la culture « dominante » (qui exprime les intérêts du pouvoir établi) et la culture « émergente » (porteuse de nouvelles significations et valeurs). Cette typologie dynamique permet de penser la culture non comme un bloc homogène mais comme un champ de tensions et de luttes entre différentes formations culturelles. Le matérialisme culturel de Williams a profondément influencé les Cultural Studies britanniques, offrant une alternative au structuralisme français et au fonctionnalisme américain.
==La culture à l'épreuve de la mondialisation==
===Le débat sur le multiculturalisme===
La fin du XXe siècle voit émerger un débat philosophique intense sur le multiculturalisme, particulièrement dans les sociétés libérales confrontées à la diversité culturelle accrue. Charles Taylor, dans « La politique de reconnaissance » (1992), défend l'idée que la reconnaissance publique des différences culturelles est une exigence de justice et de respect égal. Il critique le libéralisme procédural aveugle aux différences et plaide pour un « libéralisme 2 » capable d'accueillir les demandes de reconnaissance des minorités culturelles<ref>C. Taylor, ''Multiculturalisme. Différence et démocratie'', Aubier, 1994 [1992], p. 57-84</ref>.
Will Kymlicka développe une théorie libérale du multiculturalisme qui justifie l'octroi de droits collectifs aux minorités culturelles dans certaines conditions. Dans ''Multicultural Citizenship'' (1995), il distingue les « minorités nationales » (peuples autochtones, nations incorporées) des « groupes ethniques » (issus de l'immigration) et propose des politiques différenciées adaptées à chaque situation<ref>W. Kymlicka, ''Multicultural Citizenship'', Oxford University Press, 1995, p. 10-33</ref>.
Ces positions multiculturalistes sont critiquées de plusieurs côtés. Les républicains français, attachés au modèle universaliste, dénoncent la « communautarisation » de la société et la fragmentation du lien social. Des féministes comme Susan Moller Okin soulignent les tensions entre multiculturalisme et égalité des sexes, certaines pratiques culturelles minoritaires étant oppressives pour les femmes. Les marxistes reprochent au multiculturalisme de masquer les inégalités économiques derrière les différences culturelles.
===Mondialisation et uniformisation culturelle===
La mondialisation contemporaine pose de manière aiguë la question de l'uniformisation culturelle. L'hégémonie du modèle occidental, portée par l'industrie culturelle américaine et la diffusion mondiale des standards de consommation, menace la diversité culturelle. Cette « occidentalisation » du monde s'accompagne d'un impérialisme culturel qui détruit les cultures traditionnelles et impose les valeurs du capitalisme libéral.
L'UNESCO a tenté de répondre à ce défi en adoptant en 2005 la Convention sur la protection et la promotion de la diversité des expressions culturelles. Ce texte reconnaît « la nature spécifique des biens et services culturels en tant que porteurs d'identité, de valeurs et de sens » et affirme « le droit souverain des États de conserver, d'adopter et de mettre en œuvre les politiques et mesures qu'ils jugent appropriées pour la protection et la promotion de la diversité des expressions culturelles »<ref>UNESCO, ''Convention sur la protection et la promotion de la diversité des expressions culturelles'', 2005, art. 2</ref>.
Néanmoins, cette défense institutionnelle de la diversité culturelle se heurte aux forces économiques de la mondialisation. Les industries culturelles transnationales, la circulation mondiale des images et des sons via internet, l'hégémonie de l'anglais comme langue de communication internationale créent un espace culturel globalisé qui tend à l'homogénéisation. Face à ce processus, certains théorisent l'émergence d'une « culture monde » hybride qui brasse et recombine les éléments culturels de différentes provenances, tandis que d'autres dénoncent la perte irréparable des cultures locales et le triomphe d'un « soft power » occidental.
==Conclusion==
La philosophie de la culture traverse toute l'histoire de la pensée occidentale, questionnant inlassablement le rapport de l'humanité à la nature, à la technique, aux institutions et aux productions symboliques. De l'opposition classique nature/culture, héritée de la modernité cartésienne, aux remises en question contemporaines portées par l'anthropologie structurale et la philosophie post-moderne, le concept de culture n'a cessé d'être problématisé et reconfiguré.
Le matérialisme historique marxiste, en inscrivant la culture dans les rapports de production matériels, a révélé sa dimension politique et son rôle dans la reproduction ou la transformation des rapports sociaux. Les philosophies du symbole, de Cassirer à Ricœur, ont montré que la culture constitue le médium même par lequel l'humanité donne sens à son expérience et construit un monde habitable. L'anthropologie philosophique, de Gehlen à Arendt, a établi que la culture n'est pas un ornement superflu mais la condition d'existence de l'être humain, cet « être déficient » qui ne peut survivre qu'en créant une seconde nature artificielle.
La sociologie critique, de Bourdieu à l'École de Francfort, a dévoilé les mécanismes par lesquels la culture fonctionne comme instrument de domination symbolique et de reproduction des inégalités sociales, tout en maintenant la possibilité d'une culture émancipatrice. Enfin, les débats contemporains sur le multiculturalisme et la mondialisation culturelle interrogent la possibilité de préserver la diversité culturelle à l'ère de l'uniformisation capitaliste et de l'hégémonie occidentale.
Ces différentes approches, loin de s'exclure mutuellement, s'enrichissent et se complètent, témoignant de la complexité irréductible du phénomène culturel. À l'heure de la crise écologique globale, de la numérisation accélérée de toutes les sphères de l'existence et de l'intensification des migrations, la réflexion philosophique sur la culture demeure plus que jamais nécessaire pour penser les conditions d'une coexistence humaine qui respecte à la fois la diversité culturelle et la commune humanité de tous les peuples.
==Références==
{{references|colonnes=2}}
==Bibliographie sélective==
* '''Adorno, Theodor W. et Horkheimer, Max''', ''Dialectique de la Raison. Fragments philosophiques'', Paris, Gallimard, 1974 [1947].
* '''Arendt, Hannah''', ''La crise de la culture'', Paris, Gallimard, coll. « Folio Essais », 1972 [1961].
* '''Bourdieu, Pierre''', ''La Distinction. Critique sociale du jugement'', Paris, Minuit, 1979.
* '''Bourdieu, Pierre et Passeron, Jean-Claude''', ''La Reproduction. Éléments pour une théorie du système d'enseignement'', Paris, Minuit, 1970.
* '''Cassirer, Ernst''', ''La philosophie des formes symboliques'', 3 volumes, Paris, Minuit, 1972 [1923-1929].
* '''Descola, Philippe''', ''Par-delà nature et culture'', Paris, Gallimard, 2005.
* '''Gehlen, Arnold''', ''L'Homme. Sa nature et sa position dans le monde'', Paris, Gallimard, 2021 [1940].
* '''Gramsci, Antonio''', ''Quaderni del carcere'', Turin, Einaudi, 1975 [1929-1935].
* '''Hegel, G.W.F.''', ''Phénoménologie de l'Esprit'', 2 volumes, Paris, Aubier, 1991 [1807].
* '''Kant, Immanuel''', ''Critique de la faculté de juger'', Paris, Vrin, 1993 [1790].
* '''Kymlicka, Will''', ''Multicultural Citizenship. A Liberal Theory of Minority Rights'', Oxford, Oxford University Press, 1995.
* '''Latour, Bruno''', ''Nous n'avons jamais été modernes. Essai d'anthropologie symétrique'', Paris, La Découverte, 1991.
* '''Lévi-Strauss, Claude''', ''Les structures élémentaires de la parenté'', Paris, PUF, 1949.
* '''Marx, Karl''', ''L'idéologie allemande'', Paris, Éditions sociales, 1976 [1845-1846].
* '''Taylor, Charles''', ''Multiculturalisme. Différence et démocratie'', Paris, Aubier, 1994 [1992].
* '''Williams, Raymond''', ''Culture et matérialisme'', Paris, Les Prairies Ordinaires, 2009 [1980].
==Voir aussi==
* [[Civilisation]]
* [[Nature humaine]]
* [[Anthropologie philosophique]]
* [[Matérialisme historique]]
* [[Formes symboliques]]
* [[Capital culturel]]
* [[Multiculturalisme]]
* [[Industrie culturelle]]
{{Autocat}}
piuk8e2s5arlpv7ztr0mwzcdsec2d9q
Dictionnaire de philosophie/Courage
0
83112
768277
767893
2026-06-22T03:28:38Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768277
wikitext
text/x-wiki
{{DicoPhilo|Courage|lecture=oui}}
Le '''courage''' constitue l'une des vertus fondamentales de la philosophie morale, traversant les traditions occidentales et non-occidentales. Concept polysémique, il désigne généralement la disposition à affronter la peur, le danger ou l'adversité de manière appropriée, guidé par la raison plutôt que par l'impulsion.
== Définitions et approches conceptuelles ==
Dans la tradition philosophique, le courage se présente moins comme l'absence de peur que comme sa maîtrise rationnelle. Il ne s'agit pas d'une témérité aveugle, mais d'une vertu qui trouve le juste milieu entre la lâcheté et l'audace excessive<ref>Aristote, ''Éthique à Nicomaque'', livre III, chapitres 6-9, trad. J. Tricot, Paris, Vrin, 1990, p. 131-152</ref>. Le courage implique trois dimensions essentielles : la confrontation à un danger réel, la conscience du risque encouru, et une motivation conforme au bien ou au noble.
La philosophie antique distingue différentes formes de courage. Le courage physique face aux dangers corporels, le courage moral dans la défense de principes justes, et le courage intellectuel dans la recherche de la vérité malgré l'opposition<ref>Platon, ''Lachès'', 192c, in ''Œuvres complètes'', tome I, trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950, p. 298</ref>. Cette typologie montre que le courage ne se limite pas au champ de bataille, mais s'étend à tous les domaines de l'existence humaine.
== La pensée grecque : Platon et Aristote ==
=== Platon et le dialogue du ''Lachès'' ===
Le ''Lachès'' de Platon constitue la première investigation systématique du courage dans la philosophie occidentale<ref>Emlyn-Jones, Chris, « Dramatic structure and cultural context in Plato's Laches », ''Classical Quarterly'', vol. 49, n° 1, 1999, p. 123-138</ref>. Le dialogue met en scène Socrate interrogeant deux généraux athéniens, Lachès et Nicias, sur la nature du courage. Lachès propose initialement une définition simple : le courage consiste à « tenir son poste face au danger »<ref>Platon, ''Lachès'', 190e, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903</ref>. Socrate démontre l'insuffisance de cette définition en montrant qu'elle exclut d'autres formes de courage, comme la retraite stratégique des cavaliers scythes.
Une seconde tentative définit le courage comme « une endurance de l'âme »<ref>Platon, ''Lachès'', 192c, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903</ref>. Mais Socrate objecte que l'endurance insensée ne saurait être vertueuse. Nicias propose alors que le courage est « la science de ce qui est à craindre et à espérer »<ref>Platon, ''Lachès'', 194e-195a, trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950, p. 304-305</ref>. Cette définition intellectualiste rapproche le courage de la sagesse, suggérant que seule la connaissance du bien et du mal permet d'affronter correctement les dangers. Le dialogue se termine en aporie, sans définition satisfaisante, illustrant la complexité du concept.
Dans la ''République'', Platon attribue le courage à la classe des gardiens de la cité, le situant ainsi dans une anthropologie et une politique plus vastes<ref>Platon, ''République'', livre IV, 429a-430c, trad. G. Leroux, Paris, GF-Flammarion, 2002, p. 271-273</ref>. Le courage devient la vertu propre du ''thumos'', la partie irascible de l'âme, intermédiaire entre la raison et les désirs. Il consiste à préserver les opinions justes sur ce qui est véritablement à craindre, opinions enseignées par l'éducation et maintenues malgré les plaisirs, les peines et les craintes.
=== Aristote et la doctrine du juste milieu ===
Pour Aristote, le courage (''andreia'') occupe une place centrale parmi les vertus morales. Dans l'''Éthique à Nicomaque'', il le définit comme une disposition médiane concernant les sentiments de peur et de confiance<ref>Aristote, ''Éthique à Nicomaque'', III, 6-9, 1115a6-1117b22, éd. I. Bywater, Oxford, Clarendon Press, ''Oxford Classical Texts'', 1894</ref>. L'homme courageux craint ce qu'il faut craindre, pour le motif approprié, de la manière et au moment convenables.
Aristote distingue le véritable courage de cinq formes apparentées mais imparfaites. Le courage civique, motivé par l'honneur et la crainte du déshonneur plutôt que par le noble lui-même<ref>Aristote, ''Éthique à Nicomaque'', 1116a15-35, trad. R. Bodéüs, Paris, GF-Flammarion, 2004, p. 179-181</ref>. Le courage de l'expérience, propre aux soldats professionnels qui connaissent les dangers mais peuvent fuir face à une menace supérieure. Le courage passionnel, né de la colère ou d'autres émotions mais dépourvu de choix délibéré. Le courage de l'ignorance, caractérisé par une confiance excessive due à la méconnaissance du danger. Enfin, le courage sanguin, fondé sur un tempérament optimiste plutôt que sur un jugement rationnel<ref>Aristote, ''Éthique à Nicomaque'', 1116b3-1117a28, éd. I. Bywater, Oxford, Clarendon Press, 1894</ref>.
Le véritable courage aristotélicien possède trois caractéristiques essentielles. Il s'exerce principalement face à la mort au combat, considérée comme le danger suprême et le plus noble. Il vise le beau (''to kalon'') comme fin, non la récompense ou l'évitement de la honte. Il procède d'une disposition stable acquise par l'habitude et non d'une réaction ponctuelle<ref>Aristote, ''Éthique à Nicomaque'', 1115b11-13, trad. J. Tricot, Paris, Vrin, 1990, p. 136</ref>. Cette dernière dimension souligne que le courage n'est pas inné mais cultivé par l'éducation et la répétition d'actes appropriés.
Aristote insiste sur la dimension affective du courage. L'homme courageux ne supprime pas la peur, mais l'éprouve de façon mesurée et appropriée<ref>Broadie, Sarah et Christopher Rowe, ''Aristotle: Nicomachean Ethics: Translation, Introduction, Commentary'', Oxford, Oxford University Press, 2002, p. 315-340</ref>. Il prend plaisir, ou du moins ne souffre pas excessivement, à agir courageusement. Cette conception témoigne d'une psychologie morale sophistiquée où vertu et émotion ne s'opposent pas mais s'harmonisent.
== Le stoïcisme et le courage comme force d'âme ==
La philosophie stoïcienne, développée par Zénon, Chrysippe, puis par Sénèque, Épictète et Marc Aurèle, place le courage au rang des quatre vertus cardinales, avec la sagesse, la justice et la tempérance. Le courage stoïcien (''andreia'' ou ''fortitudo'') dépasse la simple bravoure militaire pour devenir une force d'âme universelle<ref>Sénèque, ''De constantia sapientis'', V, 4, in ''Dialogues'', tome IV, trad. R. Waltz, Paris, Les Belles Lettres, Collection des Universités de France, 1927, p. 56-57</ref>.
Pour les Stoïciens, le courage consiste essentiellement à maintenir son jugement et ses principes face aux circonstances adverses, qu'il s'agisse de dangers physiques, de souffrances ou d'injustices. Sénèque écrit que le sage ne peut rien perdre puisqu'il possède tout en lui-même de façon sûre, content de la vertu qui n'a nul besoin de la fortune<ref>Sénèque, ''De constantia sapientis'', V, 4, Paris, Les Belles Lettres, 1927, p. 56-57</ref>. Le courage devient ainsi inséparable de l'acceptation rationnelle du destin (''amor fati''), comprise non comme résignation passive mais comme affirmation joyeuse de ce qui est nécessaire.
Marc Aurèle, dans ses ''Pensées pour moi-même'', développe l'idée du courage comme acceptation de notre condition mortelle et de l'ordre cosmique<ref>Marc Aurèle, ''Pensées'', VII, 33, trad. P. Hadot, Paris, Les Belles Lettres, 1998, p. 124</ref>. Le courage stoïcien implique donc une double dimension : résistance active face à ce qui dépend de nous, acceptation sereine de ce qui ne dépend pas de nous.
La conception stoïcienne influence profondément la notion de courage moral, distinct du courage physique. Il s'agit de maintenir ses convictions morales malgré les pressions sociales, les menaces ou les tentations. Cette forme de courage requiert une vigilance constante et une discipline de l'esprit, ce que les Stoïciens nomment ''prohairesis'' – la capacité de choix moral fondée sur la raison<ref>Épictète, ''Manuel'', I, 1, trad. É. Bréhier, in ''Les Stoïciens'', Paris, Gallimard, Bibliothèque de la Pléiade, 1962, p. 1109</ref>.
== Perspectives médiévales : Thomas d'Aquin ==
La pensée chrétienne médiévale intègre le courage dans un cadre théologique tout en préservant l'héritage aristotélicien. Thomas d'Aquin, dans la ''Somme théologique'', définit le courage (''fortitudo'') comme une vertu morale qui affermit l'âme face aux dangers mortels<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 123-140, trad. française sous la dir. d'A.-M. Roguet, Paris, Cerf, 1985, vol. 3, p. 221-370</ref>.
Pour Thomas, le courage possède deux actes principaux : attaquer (''aggredere'') et endurer (''sustinere''). L'endurance constitue l'acte principal car elle exige plus de force d'âme face à un danger présent et inévitable<ref>Thomas d'Aquin, ''Summa Theologiae'', IIa-IIae, q. 123, a. 6, Latin text available in: ''Sancti Thomae Aquinatis Opera Omnia'', Leonine Commission, Rome, 1888-1906</ref>. Le courage perfectionne ainsi l'appétit irascible, cette puissance de l'âme qui nous porte à surmonter les obstacles au bien difficile.
Thomas distingue également le courage comme vertu générale, qui soutient toutes les autres vertus dans leurs difficultés, et le courage comme vertu spéciale, concernant les dangers de mort. Il identifie plusieurs vertus annexes ou parties potentielles de la fortitude : la magnificence (qui affronte les grandes dépenses), la magnanimité (qui vise les grandes choses), la patience (qui supporte les maux présents), et la persévérance (qui maintient l'effort dans le temps)<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 128-138, Paris, Cerf, 1985, vol. 3, p. 287-350</ref>.
La synthèse thomiste enrichit la conception aristotélicienne en l'inscrivant dans une vision chrétienne de l'existence. Le martyre devient la forme suprême du courage, l'acceptation de la mort pour témoigner de la vérité divine<ref>DeYoung, Rebecca, « Power Made Perfect in Weakness: Aquinas's Transformation of the Virtue of Courage », dans Astell, Ann W. et Bonnie Honecker (dir.), ''Heroic Virtue, Komplementaritaet und Transgression'', Paderborn, Wilhelm Fink Verlag, 2010, p. 133-148</ref>. Cette dimension religieuse élargit considérablement le champ du courage au-delà du contexte militaire pour englober toute situation où l'intégrité morale et spirituelle est en jeu.
== Modernité : Kant et l'éthique du devoir ==
Immanuel Kant, tout en ne faisant pas du courage une catégorie centrale de son éthique, lui reconnaît une place importante. Dans la ''Critique de la raison pratique'' et la ''Métaphysique des mœurs'', Kant distingue les vertus naturelles, comme le courage, des véritables vertus morales fondées sur le devoir<ref>Kant, Immanuel, ''Fondements de la métaphysique des mœurs'', trad. V. Delbos, rév. A. Philonenko, Paris, Vrin, 1980, Ak IV, 393-394, p. 87-91</ref>.
Pour Kant, le courage possède une valeur morale seulement lorsqu'il est motivé par le devoir et non par l'inclination, l'intérêt ou la recherche de l'honneur. Un acte courageux n'a de véritable valeur morale que s'il procède du respect pour la loi morale universelle<ref>Kant, Immanuel, ''Critique de la raison pratique'', trad. F. Picavet, Paris, PUF, Quadrige, 1943, Ak V, 81-86, p. 88-92</ref>. Cependant, Kant reconnaît que le courage, comme d'autres qualités naturelles, peut faciliter l'accomplissement du devoir.
Cette conception kantienne du courage soulève une tension importante dans l'éthique déontologique. Si seule l'intention compte pour la moralité, le courage en tant que disposition de caractère semble secondaire. Pourtant, l'expérience morale montre que le courage est souvent nécessaire pour agir selon le devoir, particulièrement lorsque celui-ci exige d'affronter des dangers ou de résister aux pressions sociales.
== Existentialisme : courage et authenticité ==
Les philosophes existentialistes du XXe siècle, notamment Jean-Paul Sartre et Albert Camus, redéfinissent le courage dans le contexte de l'absurde et de la liberté humaine. Pour Sartre, le courage consiste à assumer pleinement sa liberté et sa responsabilité face à un monde dépourvu de sens transcendant<ref>Sartre, Jean-Paul, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946, rééd. Gallimard, Folio, 1996, p. 37-42</ref>.
Cette conception du courage existentialiste se manifeste dans ce que Sartre nomme « l'authenticité » – le refus de la mauvaise foi et l'acceptation angoissante de notre condition d'êtres libres. Le courage devient alors la capacité à créer ses propres valeurs et à assumer les conséquences de ses choix sans se réfugier dans des excuses ou des déterminismes factices.
Camus, dans ''Le Mythe de Sisyphe'', développe une vision du courage face à l'absurde. Le courage ne consiste pas à nier l'absurdité de l'existence ni à se suicider face à elle, mais à se révolter lucidement contre cette absurdité tout en continuant à vivre pleinement<ref>Camus, Albert, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942, rééd. Folio Essais, 1972, p. 165-168</ref>. Il écrit : « Il faut imaginer Sisyphe heureux », suggérant que le courage ultime réside dans l'affirmation de la vie malgré son caractère répétitif et apparemment dénué de sens.
Nietzsche, précurseur de l'existentialisme, avait déjà développé une conception du courage liée à l'''amor fati'' – l'amour du destin. Le courage nietzschéen consiste à dire « oui » à la vie dans sa totalité, y compris à ses aspects les plus difficiles et les plus douloureux<ref>Nietzsche, Friedrich, ''Le Gai Savoir'', §276, trad. P. Klossowski, Paris, Gallimard, Folio Essais, 1967, p. 219-220</ref>. Cette acceptation n'est pas passive mais constitue au contraire l'expression d'une force vitale affirmative qui transfigure la nécessité en liberté créatrice.
== Pensées africaines du courage ==
Les philosophies africaines offrent des perspectives distinctes et enrichissantes sur le courage, souvent ancrées dans des conceptions communautaires de la personne et dans des systèmes de valeurs holistiques où le courage s'articule avec d'autres vertus fondamentales.
=== Ubuntu et courage relationnel ===
Dans les philosophies bantoues d'Afrique australe et orientale, le courage (''umoya'' en zoulou) s'inscrit dans le cadre de l'ubuntu – principe selon lequel « une personne est une personne à travers les autres personnes » (''umuntu ngumuntu ngabantu'')<ref>Ramose, Mogobe B., ''African Philosophy through Ubuntu'', Harare, Mond Books, 1999, p. 49-66</ref>. Le courage n'est donc pas conçu comme une vertu purement individuelle mais comme une qualité relationnelle et communautaire.
Cette conception communautaire du courage implique que l'acte courageux vise toujours le bien de la communauté et renforce les liens sociaux. Un guerrier zoulou ou xhosa fait preuve de courage non pour sa gloire personnelle mais pour protéger et honorer sa communauté. Le courage se manifeste également dans la capacité à maintenir l'harmonie sociale face aux conflits, à pardonner les offenses dans l'intérêt de la réconciliation communautaire<ref>Tutu, Desmond, ''No Future Without Forgiveness'', Londres, Rider, 1999, p. 31-35</ref>.
L'exemple de Nelson Mandela illustre parfaitement cette dimension communautaire et réconciliatrice du courage africain. Son courage ne s'est pas seulement manifesté dans sa résistance à l'oppression et dans sa volonté de combattre l'injustice, mais également et surtout dans sa capacité à tendre la main à ses anciens geôliers et à privilégier la réconciliation nationale plutôt que la vengeance<ref>Mandela, Nelson, ''Long Walk to Freedom: The Autobiography of Nelson Mandela'', Boston, Little, Brown and Company, 1994, p. 544-566</ref>. Cette forme de courage requiert une force d'âme exceptionnelle car elle implique de transcender la douleur personnelle pour le bien commun.
=== Le courage dans la philosophie yoruba ===
La philosophie yoruba du Nigeria offre une analyse particulièrement riche du courage. Le terme yoruba ''igboya'' désigne littéralement « avoir un cœur fort » et implique non seulement la bravoure physique mais aussi la force morale et la capacité à prendre des initiatives<ref>Gbadegesin, Segun, ''African Philosophy: Traditional Yoruba Philosophy and Contemporary African Realities'', New York, Peter Lang, 1991, p. 73-91</ref>.
Dans la cosmologie yoruba, le courage est lié au concept d'''ori'' – la « tête intérieure » qui représente le destin personnel et la conscience de soi. Un ''ori'' bien développé confère à la personne la capacité de discerner les situations dangereuses et d'y réagir de manière appropriée. Le courage ne consiste donc pas à ignorer le danger mais à l'affronter avec sagesse et détermination, guidé par un ''ori'' fort.
La tradition yoruba reconnaît également que le courage doit être tempéré par d'autres vertus, notamment la patience (''suuru'') et la sagesse (''ogbon''). Cette conception holiste rappelle que le courage isolé des autres vertus peut conduire à la témérité et à la destruction.
=== Courage et résistance en Afrique contemporaine ===
Les philosophies africaines contemporaines ont développé une réflexion importante sur le courage politique et la résistance à l'oppression. Des penseurs comme Steve Biko en Afrique du Sud ont articulé une conception du courage liée à la conscience de soi et à la résistance à la domination psychologique<ref>Biko, Steve, ''I Write What I Like: A Selection of his Writings'', éd. Aelred Stubbs, Londres, Bowerdean Press, 1978, p. 29-33</ref>.
La philosophie de la conscience noire (Black Consciousness) développée par Biko insiste sur le fait que le premier acte de courage pour les opprimés consiste à rejeter l'image dégradée que le système oppressif leur impose et à affirmer leur dignité et leur humanité pleine. Ce courage psychologique et existentiel précède et rend possible le courage physique de la résistance politique.
Frantz Fanon, psychiatre et philosophe martiniquais dont la pensée a profondément influencé l'Afrique, analyse le courage nécessaire pour se libérer de l'aliénation coloniale<ref>Fanon, Frantz, ''Les Damnés de la terre'', Paris, François Maspero, 1961, rééd. La Découverte, 2002, p. 41-47</ref>. Pour Fanon, le courage révolutionnaire implique non seulement l'affrontement physique avec le système colonial mais aussi une transformation intérieure qui permet au colonisé de se réapproprier son humanité et son histoire.
== Philosophies asiatiques et courage ==
=== Confucianisme et vertu du courage ===
Dans la tradition confucéenne, le courage (''yong'' en chinois, 勇) occupe une place importante parmi les vertus cardinales mais doit toujours être subordonné à la rectitude morale (''yi'', 義) et à l'humanité (''ren'', 仁). Confucius déclare : « L'homme de bien considère la rectitude comme essentielle. L'homme de bien qui possède le courage mais manque de rectitude cause des troubles ; l'homme de peu qui possède le courage mais manque de rectitude devient un brigand »<ref>Confucius, ''Entretiens'' (''Lunyu''), XVII, 23, trad. A. Cheng, Paris, Seuil, Points Sagesses, 1981, p. 186-187</ref>.
Mencius développe cette perspective en distinguant entre différentes formes de courage. Le courage inférieur, purement physique, se manifeste dans les combats et les conflits violents. Le courage supérieur consiste à préserver son cœur-esprit (''xin'', 心) intègre face aux tentations, aux pressions sociales et aux adversités<ref>Mencius, ''Œuvres complètes'', II A, 2, trad. A. Lévy, Paris, Éditions You-Feng, 2008, p. 55-59</ref>. Cette forme de courage moral requiert une cultivation intérieure constante et une pratique de l'auto-examen.
La conception confucéenne du courage implique également une dimension collective. Le courage se manifeste dans la capacité à remplir ses devoirs filiaux, sociaux et politiques malgré les obstacles. Un fils fait preuve de courage en servant ses parents âgés avec dévouement, un ministre en conseillant sincèrement son souverain même au risque de sa propre sécurité, un lettré en maintenant son intégrité intellectuelle face aux pressions politiques.
=== Courage et non-violence ===
Certaines traditions philosophiques et religieuses, notamment le bouddhisme et le jaïnisme, proposent des conceptions du courage qui valorisent la non-violence (''ahimsa''). Dans le bouddhisme, le courage (''virya'' en sanskrit) constitue l'une des six perfections (''paramitas'') et désigne l'effort persévérant dans la pratique spirituelle<ref>Śāntideva, ''Bodhicaryāvatāra'' (''La Marche vers l'Éveil''), chapitre VII, trad. G. Driessens, Paris, Seuil, Points Sagesses, 2007, p. 143-167</ref>.
Cette forme de courage spirituel implique la capacité à affronter ses propres illusions, attachements et peurs sans recourir à la violence. Elle requiert une force d'âme considérable pour rester non-violent face à l'agression, pour cultiver la compassion envers tous les êtres y compris ses ennemis, et pour persévérer dans la pratique méditative malgré les difficultés et les doutes.
Mahatma Gandhi, s'inspirant de ces traditions, développe la conception du courage dans la non-violence active (''satyagraha''). Pour Gandhi, la non-violence n'est pas passivité ou lâcheté mais requiert un courage supérieur à celui de la violence. Il faut plus de courage pour subir les coups sans riposter que pour rendre coup pour coup<ref>Gandhi, Mohandas K., ''Hind Swaraj or Indian Home Rule'', Ahmedabad, Navajivan Publishing House, 1909, rééd. 1938, p. 88-91</ref>. Ce courage non-violent s'est illustré dans les luttes de décolonisation et les mouvements pour les droits civiques, notamment en Afrique du Sud et aux États-Unis.
== Enjeux contemporains ==
=== Courage civique et démocratie ===
Les démocraties contemporaines font face à la question du courage civique – la capacité des citoyens à s'engager dans les affaires publiques, à défendre leurs convictions, et à résister aux injustices malgré les risques personnels. Hannah Arendt analyse comment la peur et l'isolement sous les régimes totalitaires détruisent le courage civique nécessaire à l'action politique<ref>Arendt, Hannah, ''Les Origines du totalitarisme'', trad. J.-L. Bourget, R. Davreu et P. Lévy, Paris, Gallimard, Quarto, 1951, rééd. 2002, p. 628-651</ref>.
Le courage civique contemporain se manifeste dans diverses formes : la dénonciation des abus de pouvoir, la participation aux mouvements sociaux pour la justice, la défense des minorités opprimées, et la résistance pacifique à l'autoritarisme. Ces formes de courage requièrent souvent de sacrifier son confort, sa carrière, voire sa sécurité pour des principes moraux et politiques.
=== Courage et vulnérabilité ===
Des philosophes contemporains, notamment dans les courants féministes, remettent en question les conceptions traditionnelles du courage qui valorisent l'autonomie, l'invulnérabilité et la maîtrise de soi. Ils proposent des conceptions alternatives qui reconnaissent la vulnérabilité humaine comme condition de possibilité du courage plutôt que comme son opposé.
Dans cette perspective, le courage ne consiste pas à nier sa vulnérabilité mais à l'accepter et à agir malgré elle. Cela inclut le courage de demander de l'aide, d'admettre ses limites, et de reconnaître son interdépendance avec les autres. Cette conception élargie du courage résonne avec les philosophies africaines communautaires qui insistent sur la dimension relationnelle de toutes les vertus.
=== Courage écologique ===
Face à la crise climatique et environnementale, une nouvelle forme de courage émerge : le courage écologique. Il s'agit de la capacité à affronter la vérité souvent anxiogène de la dégradation environnementale, à modifier ses habitudes de vie malgré les pressions sociales et économiques, et à s'engager dans l'action collective pour la protection de l'environnement malgré l'incertitude des résultats.
Ce courage écologique implique également une dimension intergénérationnelle – la volonté d'accepter des sacrifices présents pour le bien-être des générations futures. Il requiert de surmonter non seulement la peur mais aussi le déni, l'indifférence et le fatalisme face à l'ampleur des défis environnementaux.
== Conclusion ==
Le courage demeure une vertu fondamentale dont la compréhension s'est enrichie et complexifiée au cours de l'histoire de la philosophie. Des conceptions grecques centrées sur le champ de bataille aux perspectives contemporaines englobant les dimensions civique, morale, écologique et relationnelle, le courage apparaît comme une disposition multiforme essentielle à la vie humaine épanouie.
Les philosophies non-occidentales, particulièrement africaines et asiatiques, offrent des perspectives complémentaires qui soulignent les dimensions communautaires, spirituelles et cosmologiques du courage. Elles rappellent que le courage ne se limite pas à l'héroïsme individuel mais s'inscrit dans des réseaux de relations sociales et dans des visions du monde qui dépassent l'individualisme occidental.
La réflexion philosophique sur le courage reste d'une actualité brûlante dans un monde confronté à de multiples crises – politiques, sociales, environnementales et existentielles. Comprendre la nature du courage, ses diverses formes, et les conditions de son développement constitue un enjeu crucial pour l'éthique et la philosophie politique contemporaines. Le courage, loin d'être une vertu archaïque réservée aux guerriers et aux héros, apparaît comme une disposition nécessaire à tout être humain qui aspire à vivre avec dignité, authenticité et engagement dans le monde.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie sélective ==
=== Sources antiques ===
* Platon, ''Lachès'', in ''Œuvres complètes'', tome I, éd. J. Burnet, Oxford, Clarendon Press, ''Platonis Opera'', tome III, 1903 ; trad. L. Robin, Paris, Gallimard, Bibliothèque de la Pléiade, 1950.
* Platon, ''République'', livres III-IV, éd. J. Burnet ; trad. G. Leroux, Paris, GF-Flammarion, 2002.
* Aristote, ''Éthique à Nicomaque'', livre III, chapitres 6-9, éd. I. Bywater, Oxford, Clarendon Press, ''Oxford Classical Texts'', 1894 ; trad. J. Tricot, Paris, Vrin, 1990 ; trad. R. Bodéüs, Paris, GF-Flammarion, 2004.
* Sénèque, ''De constantia sapientis'', in ''Dialogues'', tome IV, trad. R. Waltz, Paris, Les Belles Lettres, Collection des Universités de France, 1927.
* Épictète, ''Manuel'', trad. É. Bréhier, in ''Les Stoïciens'', Paris, Gallimard, Bibliothèque de la Pléiade, 1962.
* Marc Aurèle, ''Pensées'', trad. P. Hadot, Paris, Les Belles Lettres, 1998.
=== Sources médiévales ===
* Thomas d'Aquin, ''Somme théologique'', IIa-IIae, questions 123-140, trad. française sous la dir. d'A.-M. Roguet, Paris, Cerf, 1985, vol. 3.
* Thomas d'Aquin, ''Summa Theologiae'', texte latin dans ''Sancti Thomae Aquinatis Opera Omnia'', Commission Léonine, Rome, 1888-1906.
=== Sources modernes et contemporaines ===
* Kant, Immanuel, ''Fondements de la métaphysique des mœurs'', trad. V. Delbos, rév. A. Philonenko, Paris, Vrin, 1980.
* Kant, Immanuel, ''Critique de la raison pratique'', trad. F. Picavet, Paris, PUF, Quadrige, 1943.
* Nietzsche, Friedrich, ''Le Gai Savoir'', trad. P. Klossowski, Paris, Gallimard, Folio Essais, 1967.
* Sartre, Jean-Paul, ''L'existentialisme est un humanisme'', Paris, Nagel, 1946 ; rééd. Gallimard, Folio, 1996.
* Camus, Albert, ''Le Mythe de Sisyphe'', Paris, Gallimard, 1942 ; rééd. Folio Essais, 1972.
* Arendt, Hannah, ''Les Origines du totalitarisme'', trad. J.-L. Bourget, R. Davreu et P. Lévy, Paris, Gallimard, Quarto, 1951 ; rééd. 2002.
=== Philosophies non-occidentales ===
* Confucius, ''Entretiens'' (''Lunyu''), trad. A. Cheng, Paris, Seuil, Points Sagesses, 1981.
* Mencius, ''Œuvres complètes'', trad. A. Lévy, Paris, Éditions You-Feng, 2008.
* Śāntideva, ''Bodhicaryāvatāra'' (''La Marche vers l'Éveil''), trad. G. Driessens, Paris, Seuil, Points Sagesses, 2007.
* Gandhi, Mohandas K., ''Hind Swaraj or Indian Home Rule'', Ahmedabad, Navajivan Publishing House, 1909 ; rééd. 1938.
* Ramose, Mogobe B., ''African Philosophy through Ubuntu'', Harare, Mond Books, 1999.
* Gbadegesin, Segun, ''African Philosophy: Traditional Yoruba Philosophy and Contemporary African Realities'', New York, Peter Lang, 1991.
* Biko, Steve, ''I Write What I Like: A Selection of his Writings'', éd. Aelred Stubbs, Londres, Bowerdean Press, 1978.
* Fanon, Frantz, ''Les Damnés de la terre'', Paris, François Maspero, 1961 ; rééd. La Découverte, 2002.
* Tutu, Desmond, ''No Future Without Forgiveness'', Londres, Rider, 1999.
* Mandela, Nelson, ''Long Walk to Freedom: The Autobiography of Nelson Mandela'', Boston, Little, Brown and Company, 1994.
=== Études contemporaines ===
* Broadie, Sarah et Christopher Rowe, ''Aristotle: Nicomachean Ethics: Translation, Introduction, Commentary'', Oxford, Oxford University Press, 2002.
* Emlyn-Jones, Chris, « Dramatic structure and cultural context in Plato's Laches », ''Classical Quarterly'', vol. 49, n° 1, 1999, p. 123-138.
* DeYoung, Rebecca, « Power Made Perfect in Weakness: Aquinas's Transformation of the Virtue of Courage », dans Astell, Ann W. et Bonnie Honecker (dir.), ''Heroic Virtue, Komplementaritaet und Transgression'', Paderborn, Wilhelm Fink Verlag, 2010, p. 133-148.
{{Autocat}}
n0ued3r1bgjljcv7wtk32pzcsr9jdyo
Dictionnaire de philosophie/Convention
0
83114
768276
767894
2026-06-22T03:28:27Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768276
wikitext
text/x-wiki
{{DicoPhilo|Convention|lecture=oui}}
La '''convention''' est un concept qui désigne un accord implicite ou explicite entre des personnes ou au sein d'une communauté, servant à réguler les comportements, à faciliter la communication et à organiser la vie sociale. Loin d'être un simple arrangement pratique, la convention soulève des questions importantes sur la nature de la normativité, la distinction entre ce qui est naturel et ce qui est institué, ainsi que sur les rapports entre l'individu et le collectif.
== Définition et enjeux ==
Une convention peut se définir comme une règle ou un usage admis par un groupe, reposant sur un accord tacite ou formulé. Elle se distingue de ce qui est imposé par la nature des choses : une convention n'est ni nécessaire logiquement, ni déterminée causalement par des faits naturels. Elle procède d'un choix collectif, qu'il soit délibéré ou progressivement sédimenté par l'usage.
Le concept de convention interroge la frontière entre nature (''phusis'') et institution (''nomos'' ou ''thesis''). Dans le contexte grec antique, cette opposition structure le débat sophistique : les conventions humaines, changeantes selon les époques et les lieux, s'opposent aux lois naturelles, universelles et immuables. Cette tension traverse toute l'histoire de la philosophie, de Platon à nos jours.
Les conventions se manifestent dans de multiples domaines : le langage, le droit, la morale, l'art, les pratiques sociales et politiques. Elles permettent la coordination des actions individuelles, l'établissement d'attentes partagées et la stabilisation des interactions sociales. Sans conventions, la communication et la coopération seraient impossibles ou extrêmement coûteuses.
== Le langage comme convention : de Platon aux philosophies analytiques ==
=== La théorie platonicienne et aristotélicienne ===
Dans le ''Cratyle'', Platon examine si les noms des choses sont donnés par nature (''phusei'') ou par convention (''thesei''). Hermogène défend la thèse conventionnaliste : les mots n'ont aucun lien naturel avec ce qu'ils désignent, leur signification résulte d'un accord arbitraire entre les locuteurs<ref>Platon, ''Cratyle'', 384d-385e, trad. L. Méridier, Paris, Les Belles Lettres, 1931, p. 52-54</ref>. Cratyle, à l'inverse, soutient que les noms reflètent l'essence des choses. Socrate explore ces deux positions sans trancher définitivement, mais suggère que si les noms étaient purement conventionnels, toute communication stable serait compromise.
Aristote, dans le ''De interpretatione'', affirme explicitement que les mots sont des symboles conventionnels (''kata sunthêkên'') : « Les sons émis par la voix sont les symboles des états de l'âme, et les mots écrits les symboles des mots émis par la voix. [...] Ce sont là des symboles conventionnels »<ref>Aristote, ''De l'interprétation'', 16a3-8, trad. J. Tricot, Paris, Vrin, 1959, p. 77-78</ref>. Pour Aristote, la convention linguistique ne signifie pas l'arbitraire total : elle suppose un usage stabilisé au sein d'une communauté de locuteurs.
=== Les théories modernes : de Hobbes à Rousseau ===
Thomas Hobbes, dans le ''Léviathan'', inscrit les conventions dans sa théorie politique. Le langage lui-même est conventionnel : les mots sont des « marques » arbitraires que nous assignons aux choses pour nous en souvenir et pour communiquer<ref>Hobbes, Thomas, ''Léviathan'', I, 4, trad. F. Tricaud, Paris, Sirey, 1971, p. 25-27</ref>. Cette conventionnalité du langage s'articule à la conception hobbesienne du contrat social : l'ordre politique, comme le langage, repose sur un accord qui institue des règles communes permettant de sortir de l'état de nature.
Jean-Jacques Rousseau, dans le ''Discours sur l'origine et les fondements de l'inégalité parmi les hommes'' et l'''Essai sur l'origine des langues'', pose un problème crucial : comment les conventions linguistiques ont-elles pu émerger alors qu'elles semblent présupposer la capacité de communiquer qu'elles doivent précisément rendre possible ? Rousseau affirme que « la parole paraît avoir été fort nécessaire pour établir l'usage de la parole »<ref>Rousseau, Jean-Jacques, ''Discours sur l'origine de l'inégalité'', II, in ''Œuvres complètes'', vol. III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964, p. 147</ref>. Il suggère que les premières langues furent dictées non par les besoins pratiques mais par les passions : « Ce n'est ni la faim, ni la soif, mais l'amour, la haine, la pitié, la colère, qui leur ont arraché les premières voix »<ref>Rousseau, Jean-Jacques, ''Essai sur l'origine des langues'', chap. II, Paris, Flammarion, 1993, p. 59</ref>.
=== Le conventionnalisme contemporain : Quine et Davidson ===
Au XXe siècle, Willard Van Orman Quine bouleverse la conception des conventions linguistiques et scientifiques. Dans « Deux dogmes de l'empirisme », Quine rejette la distinction entre vérités analytiques (vraies par convention) et vérités synthétiques (vraies en vertu des faits)<ref>Quine, Willard Van Orman, « Two Dogmas of Empiricism », in ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953, p. 20-46</ref>. Selon lui, aucune proposition n'est vraie par pure convention : même les vérités logiques et mathématiques s'inscrivent dans un réseau holistique de croyances confronté dans son ensemble à l'expérience.
Quine défend un holisme sémantique : « l'unité de signification empirique est la science dans sa globalité »<ref>Quine, W. V. O., ''Word and Object'', Cambridge (Mass.), MIT Press, 1960, p. 42</ref>. Les significations des expressions linguistiques ne sont pas déterminées isolément par des conventions stipulatives, mais par leur rôle dans la théorie globale que nous acceptons. Donald Davidson prolonge cette perspective en affirmant qu'« une phrase (et donc un mot) n'a de sens que dans le contexte d'un (tout) langage »<ref>Davidson, Donald, « Truth and Meaning », ''Synthese'', vol. 17, n° 3, 1967, p. 304-323</ref>.
Ce holisme sémantique a des conséquences importantes pour la notion de convention : si les significations sont interdépendantes et si aucune proposition n'est immunisée contre la révision, alors les conventions linguistiques ne sont pas de simples stipulations arbitraires, mais des éléments d'un système global en constante évolution.
== Conventions sociales et normativité ==
=== Émile Durkheim et le fait social ===
Dans ''Les Règles de la méthode sociologique'', Émile Durkheim définit le fait social comme « toute manière de faire, fixée ou non, susceptible d'exercer sur l'individu une contrainte extérieure »<ref>Durkheim, Émile, ''Les Règles de la méthode sociologique'', Paris, Presses Universitaires de France, 1895, p. 14</ref>. Les conventions sociales constituent un type particulier de faits sociaux : elles ne sont pas nécessairement codifiées en lois, mais exercent néanmoins une force normative sur les individus.
Pour Durkheim, les normes et conventions sociales préexistent à l'individu et s'imposent à lui comme des réalités objectives. Elles ne résultent pas d'un accord délibéré entre individus rationnels, mais émergent de la vie collective et de la solidarité sociale. Cette perspective holiste s'oppose aux conceptions contractualistes qui voient dans les conventions le résultat d'accords volontaires entre agents autonomes.
=== La philosophie du droit : Hart et la règle de reconnaissance ===
H.L.A. Hart, dans ''Le Concept de droit'' (1961), développe une théorie positiviste sophistiquée qui accorde une place centrale aux conventions sociales. Hart distingue deux types de règles juridiques : les règles primaires, qui imposent des obligations, et les règles secondaires, qui concernent la reconnaissance, la modification et l'application des règles primaires<ref>Hart, H.L.A., ''The Concept of Law'', Oxford, Clarendon Press, 1961, p. 79-99</ref>.
La « règle de reconnaissance » est une convention sociale qui permet d'identifier les règles juridiques valides dans un système donné. Elle n'est pas elle-même une règle juridique valide au sens où elle ne dérive d'aucune autre règle supérieure ; elle constitue plutôt une pratique convergente des officiels du système juridique (juges, législateurs, administrateurs). Hart insiste sur la distinction entre le « point de vue interne » (celui de l'acteur qui reconnaît la normativité de la règle) et le « point de vue externe » (celui de l'observateur qui constate l'existence d'une régularité comportementale)<ref>Hart, H.L.A., op. cit., p. 88-91</ref>.
Cette analyse montre que les conventions juridiques ne sont pas de simples régularités comportementales : elles comportent une dimension normative essentielle, reconnue par les participants eux-mêmes. Les conventions constituent ainsi un mode spécifique de normativité, irréductible à la fois à la contrainte physique et à l'obligation morale.
== Perspectives africaines et non-occidentales ==
=== Ubuntu et conventions communautaires ===
La philosophie africaine, notamment à travers le concept d'ubuntu (« une personne est une personne à travers d'autres personnes »), offre une perspective distinctive sur les conventions sociales. Contrairement aux approches individualistes dominantes en philosophie occidentale, l'ubuntu souligne la primauté ontologique de la communauté sur l'individu<ref>Ramose, Mogobe, ''African Philosophy Through Ubuntu'', Harare, Mond Books, 1999, p. 49-66</ref>.
Dans cette perspective, les conventions ne sont pas des accords négociés entre individus préalablement constitués, mais des structures constitutives de la personnalité elle-même. Ifeanyi Menkiti affirme qu'en Afrique, « la communauté définit la personne comme personne, et non l'inverse »<ref>Menkiti, Ifeanyi, « Person and Community in African Traditional Thought », in Richard Wright (ed.), ''African Philosophy: An Introduction'', Lanham, University Press of America, 1984, p. 171-181</ref>. Les conventions sociales, loin d'être des contraintes externes, sont intériorisées comme des éléments constitutifs de l'identité personnelle.
Cette conception communautarienne des conventions se manifeste dans le droit coutumier africain, où les règles émergent des pratiques collectives et sont validées par le consensus communautaire plutôt que par l'autorité d'un législateur central. Le principe du ''kgosi ke kgosi ka batho'' (le chef est chef grâce au peuple) illustre cette logique : l'autorité politique elle-même est fondée sur une convention sociale, un accord tacite de la communauté<ref>Wiredu, Kwasi, « Democracy and Consensus in African Traditional Politics », in Kwasi Wiredu (ed.), ''A Companion to African Philosophy'', Oxford, Blackwell, 2004, p. 435-442</ref>.
=== Confucianisme et conventions rituelles (li) ===
La philosophie confucéenne accorde une importance centrale aux conventions rituelles (''li''), qui structurent les relations sociales et politiques. Pour Confucius et ses successeurs, les rites ne sont pas de simples formalités arbitraires, mais des dispositifs qui harmonisent les relations humaines et alignent l'ordre social sur l'ordre cosmique<ref>Ames, Roger et Rosemont, Henry, ''The Analects of Confucius: A Philosophical Translation'', New York, Ballantine Books, 1998, p. 45-53</ref>.
Les ''li'' englobent les cérémonies religieuses, les règles de bienséance, les protocoles politiques et les conventions sociales. Ils ne sont pas perçus comme des contraintes externes imposées à des individus autonomes, mais comme des expressions de la nature humaine correctement cultivée. Suivre les conventions rituelles, c'est actualiser son humanité (''ren'') dans des formes concrètes d'interaction sociale.
Xunzi, philosophe confucéen du IIIe siècle avant notre ère, soutient que les conventions rituelles sont des créations humaines destinées à canaliser les désirs et les émotions, prévenant ainsi le chaos social<ref>Knoblock, John, ''Xunzi: A Translation and Study of the Complete Works'', Stanford, Stanford University Press, 1988-1994, vol. III, p. 18-24</ref>. Cette position, qui reconnaît explicitement le caractère artificiel des conventions tout en insistant sur leur nécessité, offre une alternative intéressante aux oppositions simples entre nature et convention.
== Convention et conventionnalisme dans les sciences ==
=== Poincaré et le conventionnalisme géométrique ===
Henri Poincaré, mathématicien et philosophe des sciences, défend une forme de conventionnalisme concernant les axiomes de la géométrie. Dans ''La Science et l'Hypothèse'' (1902), il soutient que les axiomes géométriques ne sont ni des vérités a priori synthétiques (comme le pensait Kant), ni des vérités empiriques déduites de l'expérience, mais des conventions commodes que nous adoptons pour organiser notre expérience spatiale<ref>Poincaré, Henri, ''La Science et l'Hypothèse'', Paris, Flammarion, 1902, p. 49-73</ref>.
Pour Poincaré, choisir entre la géométrie euclidienne et les géométries non-euclidiennes n'est pas une question de vérité, mais de commodité : nous sélectionnons le système géométrique qui simplifie le plus nos lois physiques. Ce conventionnalisme modéré reconnaît que certains choix théoriques ne sont pas déterminés par les faits eux-mêmes, mais relèvent d'une décision méthodologique guidée par des critères pragmatiques.
=== Carnap et la tolérance logique ===
Rudolf Carnap, figure majeure du Cercle de Vienne, radicalise le conventionnalisme en l'étendant à la logique elle-même. Dans ''La Syntaxe logique du langage'' (1934), Carnap énonce son célèbre principe de tolérance : « En logique, il n'y a pas de morale. Chacun est libre d'édifier sa propre logique, c'est-à-dire sa propre forme de langage, comme il l'entend. Tout ce qu'on exige de lui, s'il veut en discuter avec nous, c'est qu'il fixe clairement ses méthodes »<ref>Carnap, Rudolf, ''The Logical Syntax of Language'', trad. A. Smeaton, Londres, Routledge & Kegan Paul, 1937, p. 51-52</ref>.
Cette position implique que les règles logiques elles-mêmes sont conventionnelles : il n'existe pas de logique "vraie" en soi, mais seulement des systèmes formels plus ou moins adaptés à certains objectifs. Le choix d'un cadre linguistique (avec ses règles logiques et syntaxiques) est une décision pragmatique, non une découverte de vérités préexistantes. Cette conception a profondément influencé la philosophie analytique et la métaphilosophie contemporaine.
== Art, symboles et conventions esthétiques ==
=== Goodman et les systèmes symboliques ===
Nelson Goodman, dans ''Langages de l'art'' (1968), développe une théorie sémiotique de l'art qui accorde un rôle central aux conventions. Pour Goodman, comprendre une œuvre d'art, c'est maîtriser les conventions du système symbolique dans lequel elle s'inscrit : « Comprendre une œuvre comme symbolique, c'est l'inclure dans un langage ou un système symbolique. La syntaxe du système détermine l'identité de ses signes, sa sémantique fixe leur référence »<ref>Goodman, Nelson, ''Languages of Art'', Indianapolis, Hackett Publishing, 1976, p. 143</ref>.
Les conventions artistiques régissent les modes de référence (dénotation, exemplification, expression), les critères d'identité des œuvres, et les normes d'interprétation. Par exemple, dans la peinture occidentale classique, la convention de la perspective linéaire structure notre perception de l'espace représenté ; dans la notation musicale occidentale, des conventions complexes déterminent comment un texte musical doit être interprété en sons.
Goodman insiste sur le fait que ces conventions ne sont pas arbitraires au sens où elles pourraient être librement choisies par un individu isolé : elles sont ancrées dans des pratiques collectives, transmises par l'apprentissage et la participation à une tradition artistique. L'art, comme le langage, est un fait social gouverné par des conventions qui rendent possibles la création, la communication et l'appréciation esthétiques.
=== Symbolisme et conventions culturelles ===
Le mouvement symboliste, qui se développe en Europe à la fin du XIXe siècle, illustre la tension entre conventions et innovation artistique. Les symbolistes, réagissant contre le naturalisme et le réalisme, cherchent à évoquer des idées et des émotions à travers des symboles suggestifs plutôt que des représentations directes<ref>Moréas, Jean, « Le Symbolisme », manifeste publié dans ''Le Figaro'', 18 septembre 1886</ref>. Paradoxalement, cette recherche d'une expression individuelle et subjective s'appuie sur des conventions partagées : les symboles (la couleur, les formes, les motifs) n'acquièrent leur pouvoir évocateur que parce qu'ils sont reconnus et interprétés au sein d'une communauté culturelle.
En Afrique, l'art traditionnel utilise des symboles et des conventions iconographiques qui codifient des significations cosmologiques, sociales et religieuses. Les masques, les sculptures, les textiles et les pagnes wax portent des messages complexes, intelligibles pour les membres de la communauté qui en connaissent les codes<ref>Constantine Petridis (ed.), ''The Language of Beauty in African Art'', Chicago, Art Institute of Chicago, 2022, p. 15-32</ref>. Ces conventions artistiques ne sont pas de simples ornements, mais des langages visuels qui participent à la transmission et à la perpétuation des valeurs culturelles.
== Problèmes philosophiques contemporains ==
=== Convention et arbitraire ===
Un débat persistant concerne le degré d'arbitraire des conventions. Certaines conventions semblent parfaitement arbitraires (conduire à droite ou à gauche), tandis que d'autres paraissent motivées par des considérations naturelles ou pratiques. Le linguiste Ferdinand de Saussure affirme l'arbitraire du signe linguistique : il n'existe aucun lien naturel entre le signifiant (la suite de sons) et le signifié (le concept)<ref>Saussure, Ferdinand de, ''Cours de linguistique générale'', Paris, Payot, 1916, p. 100-102</ref>. Cependant, des phénomènes comme l'iconicité (où la forme du signe ressemble à ce qu'il désigne) et les contraintes phonétiques universelles suggèrent que l'arbitraire n'est pas absolu.
Cette question a des implications importantes : si les conventions sont totalement arbitraires, alors elles pourraient être modifiées à volonté ; si elles sont partiellement motivées, certaines sont peut-être plus « naturelles » ou « rationnelles » que d'autres. Cette tension traverse les débats sur la réforme linguistique, l'ingénierie sociale et la justice des institutions.
=== Convention et normativité ===
Les conventions posent un problème philosophique majeur : comment des accords arbitraires peuvent-ils engendrer des obligations ? Si une convention n'est qu'une régularité comportementale, pourquoi devrais-je la respecter ? La réponse classique invoque l'intérêt mutuel : nous avons tous intérêt à coordonner nos comportements selon des règles communes, même arbitraires. Mais cette explication utilitariste ne rend pas compte du sentiment d'obligation que nous éprouvons face aux conventions établies.
David Lewis, dans ''Convention: A Philosophical Study'' (1969), propose une analyse sophistiquée des conventions comme solutions d'équilibre dans des jeux de coordination<ref>Lewis, David, ''Convention: A Philosophical Study'', Cambridge (Mass.), Harvard University Press, 1969, p. 42-68</ref>. Une convention émerge lorsque : (1) chacun se conforme à une régularité R dans des situations de coordination ; (2) chacun s'attend à ce que les autres se conforment à R ; (3) chacun préfère se conformer à R si les autres le font également ; (4) il existe une alternative à R ; (5) ces faits sont de connaissance commune. Cette analyse formelle permet de comprendre comment les conventions s'auto-entretiennent sans nécessiter une autorité externe pour les imposer.
=== Convention et universalité ===
La multiplicité des conventions à travers les cultures pose la question de l'universalité des normes. Si les pratiques morales, juridiques et linguistiques varient selon les sociétés, peut-on encore parler de vérités morales universelles ou de droits humains fondamentaux ? Le relativisme culturel s'appuie sur la diversité des conventions pour contester l'existence de normes objectives ; l'universalisme moral cherche, au contraire, à identifier des principes qui transcendent les conventions particulières.
Cette tension est particulièrement vive dans les débats de philosophie politique contemporaine. Les défenseurs des droits humains universels, comme ceux consacrés par la Déclaration universelle de 1948, s'opposent aux critiques qui y voient une imposition de conventions occidentales à des cultures non-occidentales. Les philosophies africaines et asiatiques insistent sur la nécessité de reconnaître des conceptions alternatives de la personne, de la communauté et de la justice, enracinées dans leurs propres conventions culturelles.
== Conclusion ==
La notion de convention, loin d'être un simple concept technique, touche au cœur des questions philosophiques fondamentales : la nature du langage et de la signification, le fondement de la normativité sociale et juridique, la relation entre individu et collectif, la tension entre l'universel et le particulier. De Platon à Quine, de Confucius à Durkheim, de l'ubuntu africain au conventionnalisme scientifique, les philosophies du monde entier ont exploré les multiples facettes de cette notion.
Les conventions ne sont ni de pures constructions arbitraires ni des reflets immédiats de la nature : elles constituent une modalité spécifique de l'institution humaine, ancrée dans les pratiques collectives et porteuse d'une normativité irréductible. Comprendre les conventions, c'est saisir comment les êtres humains créent ensemble les structures symboliques, sociales et politiques qui rendent possible leur coexistence.
L'étude philosophique des conventions invite à une forme d'étonnement socratique : ce qui nous paraît évident et naturel (parler telle langue, respecter telles règles de politesse, organiser telle institution) s'avère être le produit contingent d'accords humains, toujours susceptibles d'être interrogés, critiqués et transformés. Mais cet étonnement ne conduit pas nécessairement au relativisme ou au nihilisme : il peut aussi ouvrir la voie à une compréhension plus profonde de la créativité normative humaine et des possibilités d'émancipation qu'elle recèle.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
* Aristote, ''De l'interprétation'', trad. J. Tricot, Paris, Vrin, 1959
* Carnap, Rudolf, ''The Logical Syntax of Language'', trad. A. Smeaton, Londres, Routledge & Kegan Paul, 1937
* Davidson, Donald, « Truth and Meaning », ''Synthese'', vol. 17, n° 3, 1967, p. 304-323
* Durkheim, Émile, ''Les Règles de la méthode sociologique'', Paris, Presses Universitaires de France, 1895
* Goodman, Nelson, ''Languages of Art'', Indianapolis, Hackett Publishing, 1976
* Hart, H.L.A., ''The Concept of Law'', Oxford, Clarendon Press, 1961
* Hobbes, Thomas, ''Léviathan'', trad. F. Tricaud, Paris, Sirey, 1971
* Lewis, David, ''Convention: A Philosophical Study'', Cambridge (Mass.), Harvard University Press, 1969
* Menkiti, Ifeanyi, « Person and Community in African Traditional Thought », in Richard Wright (ed.), ''African Philosophy: An Introduction'', Lanham, University Press of America, 1984
* Platon, ''Cratyle'', trad. L. Méridier, Paris, Les Belles Lettres, 1931
* Poincaré, Henri, ''La Science et l'Hypothèse'', Paris, Flammarion, 1902
* Quine, Willard Van Orman, « Two Dogmas of Empiricism », in ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953
* Ramose, Mogobe, ''African Philosophy Through Ubuntu'', Harare, Mond Books, 1999
* Rousseau, Jean-Jacques, ''Discours sur l'origine de l'inégalité'', in ''Œuvres complètes'', vol. III, Paris, Gallimard, « Bibliothèque de la Pléiade », 1964
* Rousseau, Jean-Jacques, ''Essai sur l'origine des langues'', Paris, Flammarion, 1993
* Saussure, Ferdinand de, ''Cours de linguistique générale'', Paris, Payot, 1916
* Wiredu, Kwasi (ed.), ''A Companion to African Philosophy'', Oxford, Blackwell, 2004
{{Autocat}}
ramvyfitp7ajtk61r8ogd6deobo3fr0
Dictionnaire de philosophie/Découverte
0
83116
768283
767284
2026-06-22T03:29:37Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768283
wikitext
text/x-wiki
{{DicoPhilo|Découverte|lecture=oui}}
La découverte désigne le processus par lequel un sujet prend connaissance d'une réalité préexistante qui lui était jusqu'alors inconnue. Cette notion traverse l'ensemble de la philosophie en touchant à des questions épistémologiques (comment connaissons-nous ?), métaphysiques (qu'est-ce qui existe indépendamment de nous ?) et méthodologiques (comment progresse la science ?). Elle se distingue de l'invention, qui implique la création de quelque chose de nouveau, et de la création, qui suppose un acte producteur original.
== Distinction conceptuelle : découverte, invention et création ==
La tradition philosophique établit une hiérarchie entre ces trois notions. La découverte concerne principalement le domaine scientifique et suppose qu'une vérité préexiste à son dévoilement. Ainsi, on dira qu'Isaac Newton a ''découvert'' les lois de la gravitation, car ces lois régissaient déjà le mouvement des corps avant qu'il ne les formule. L'invention, en revanche, relève davantage du domaine technique : elle désigne une synthèse d'éléments préexistants présentant un caractère de nouveauté tel qu'elle ne pouvait être déduite d'évidence de ces éléments<ref>« Invention », in Encyclopédie Larousse de Philosophie, Paris, Larousse, 2002, p. 842.</ref>. La machine à vapeur fut ''inventée'', non ''découverte'', car elle n'existait pas dans la nature avant sa conception. La création, notion plus élevée dans cette hiérarchie, touche à des formes de réalité plus fondamentales et évoque souvent une dimension quasi-divine<ref>Anne-Françoise Schmid, « Invention, fiction, création », ''Philosophia Scientiæ'', vol. 23, n° 3, 2019, p. 15-28.</ref>.
Cette distinction demeure toutefois problématique. L{{'}}''Encyclopédie'' de Diderot et d'Alembert exprime bien le rapport ambigu de la philosophie à ces notions : la philosophie entend tirer les leçons méthodologiques des inventeurs (scientifiques, artisans, artistes) dans une visée d'unification du savoir<ref>Denis Diderot et Jean le Rond d'Alembert (dir.), ''Encyclopédie ou Dictionnaire raisonné des sciences, des arts et des métiers'', 1751-1772, article « Invention ».</ref>. Pour les Encyclopédistes, inventer signifie produire du nouveau et/ou combiner de l'existant dans des dispositifs inédits, ce qui rapproche invention et découverte dans la mesure où toute découverte scientifique implique une part de construction conceptuelle.
== La découverte dans l'épistémologie classique ==
=== L'empirisme et l'induction ===
La tradition empiriste, de Francis Bacon à David Hume, a longtemps considéré la découverte scientifique comme un processus inductif, partant de l'observation particulière pour s'élever vers des lois générales. Pour Bacon, la méthode scientifique procède par accumulation patiente de faits, par « torture » de la nature pour lui faire révéler ses secrets<ref>Francis Bacon, ''Novum Organum'', 1620, livre II, aphorisme 5. Voir l'analyse dans : OpenEdition Journals, « Voyages et utopie scientifique dans La Nouvelle Atlantide de Bacon », 2006.</ref>. Cette conception suppose que la découverte résulte d'une observation passive et neutre, le savant se bornant à enregistrer ce que la nature lui présente.
David Hume, toutefois, a montré les limites de cette conception en établissant l'impossibilité de justifier rationnellement le raisonnement inductif<ref>David Hume, ''Traité de la nature humaine'', 1739-1740, livre I, partie III.</ref>. Le passage du particulier au général ne peut être fondé logiquement, car il présuppose toujours l'uniformité de la nature, principe lui-même indémontrable. Cette critique humienne a profondément ébranlé la conception naïve de la découverte comme simple lecture du livre de la nature.
=== Le rationalisme cartésien ===
René Descartes propose une voie différente : la découverte procède par intuition intellectuelle et déduction rationnelle plutôt que par accumulation d'observations<ref>René Descartes, ''Règles pour la direction de l'esprit'', règle III, 1628.</ref>. La méthode cartésienne privilégie l'analyse, la division des difficultés, et la synthèse, remontant du simple au complexe. Dans cette perspective, découvrir revient moins à observer qu'à penser correctement, selon l'ordre des raisons. Les vérités mathématiques sont ''découvertes'' par l'esprit qui en déploie la nécessité interne, sans recours obligé à l'expérience sensible.
Cette opposition entre empirisme et rationalisme structure longtemps le débat sur la nature de la découverte : s'agit-il d'un processus passif de réception de données ou d'un acte actif de construction intellectuelle ?
== La révolution kantienne : la découverte comme synthèse ==
Emmanuel Kant opère une synthèse critique entre ces deux traditions. Dans la ''Critique de la raison pure'' (1781), il établit que toute connaissance résulte de la collaboration entre les intuitions sensibles (matière de la connaissance) et les concepts de l'entendement (forme de la connaissance)<ref>Emmanuel Kant, ''Critique de la raison pure'', 1781, « Logique transcendantale », introduction, section II.</ref>. La découverte n'est ni pure réception ni pure construction : elle est synthèse a priori, unification du divers sensible sous des concepts.
Cette perspective transforme radicalement la compréhension de la découverte scientifique. Les lois de la nature ne sont pas simplement ''découvertes'' dans l'expérience, elles sont en partie ''constituées'' par les structures a priori de notre esprit. Comme l'écrit Kant : « La raison ne voit que ce qu'elle produit elle-même d'après ses propres plans »<ref>Kant, ''Critique de la raison pure'', Préface à la seconde édition, B XIII.</ref>. Cette révolution copernicienne en épistémologie implique que la découverte scientifique n'est jamais la simple lecture d'une vérité préexistante, mais toujours déjà une interprétation guidée par nos cadres conceptuels.
== La philosophie des sciences au XXe siècle ==
=== Karl Popper et le contexte de découverte ===
Karl Popper établit une distinction devenue classique entre le contexte de découverte (context of discovery) et le contexte de justification (context of justification)<ref>Karl Popper, ''La Logique de la découverte scientifique'' (''Logik der Forschung''), Vienne, Springer, 1934, chapitre 1, section 2. Popper trace cette distinction jusqu'à la distinction kantienne ''quid juris'' / ''quid facti'' dans la ''Critique de la raison pure'' (A84/B116).</ref>. Le contexte de découverte concerne les processus psychologiques, historiques et sociologiques par lesquels un scientifique parvient à formuler une hypothèse nouvelle. Le contexte de justification, en revanche, concerne l'évaluation rationnelle de cette hypothèse, sa mise à l'épreuve empirique et sa validation ou réfutation.
Pour Popper, seul le contexte de justification relève de la logique et de l'épistémologie philosophique. Le contexte de découverte appartient à la psychologie et à la sociologie : « L'acte de concevoir ou d'inventer une théorie ne me semble pas appeler une analyse logique, pas plus qu'il ne semble susceptible d'une telle analyse »<ref>Popper, ''Logique de la découverte scientifique'', trad. fr. Paris, Payot, 1973, p. 31.</ref>. Cette séparation stricte implique qu'il n'existe pas de « logique de la découverte » au sens propre, pas de méthode permettant de générer mécaniquement des hypothèses nouvelles. La découverte relève du génie créateur, de l'intuition, voire du hasard.
La méthode scientifique poppérienne repose sur le principe de falsifiabilité : une théorie scientifique doit pouvoir être réfutée par l'expérience. La science progresse non par accumulation de vérités confirmées, mais par élimination d'erreurs, par ''conjectures et réfutations''<ref>Karl Popper, ''Conjectures et réfutations. La croissance du savoir scientifique'', trad. fr. Paris, Payot, 1985.</ref>. Dans cette perspective, la découverte d'une théorie nouvelle importe moins que sa capacité à résister aux tentatives de falsification.
=== Thomas Kuhn et les révolutions scientifiques ===
Thomas Kuhn conteste cette vision poppérienne en montrant que la science ne progresse pas de façon linéaire et cumulative<ref>Thomas S. Kuhn, ''La Structure des révolutions scientifiques'' (''The Structure of Scientific Revolutions''), Chicago, University of Chicago Press, 1962, trad. fr. Paris, Flammarion, 1983.</ref>. Il distingue la science normale, période durant laquelle les scientifiques travaillent à l'intérieur d'un paradigme accepté, et les révolutions scientifiques, moments de rupture où un paradigme est abandonné au profit d'un autre incompatible avec le précédent. La découverte, dans ce cadre, n'est jamais un événement ponctuel : elle est un processus étendu qui implique la reconnaissance d'une anomalie, l'exploration de solutions alternatives, et finalement l'acceptation d'un nouveau paradigme par la communauté scientifique.
Kuhn souligne également que l'observation est toujours «chargée de théorie» (theory-laden) : ce que nous observons dépend des concepts et des théories que nous mobilisons<ref>Kuhn, ''Structure des révolutions scientifiques'', chap. X, « Les révolutions comme changements de la vision du monde ».</ref>. Deux scientifiques travaillant dans des paradigmes différents ne voient littéralement pas la même chose lorsqu'ils observent un même phénomène. Cette thèse remet en question l'idée d'une découverte comme simple dévoilement d'une réalité objective indépendante de nos cadres conceptuels.
=== Norwood Russell Hanson : la découverte comme processus rationnel ===
Norwood Russell Hanson, dans son ouvrage majeur ''Patterns of Discovery'' (1958), s'oppose à la dichotomie stricte entre contexte de découverte et contexte de justification<ref>Norwood Russell Hanson, ''Patterns of Discovery: An Inquiry into the Conceptual Foundations of Science'', Cambridge, Cambridge University Press, 1958.</ref>. Pour Hanson, la découverte scientifique n'est pas un éclair irrationnel de génie, mais un processus rationnel susceptible d'analyse philosophique. Il introduit la notion d'inférence rétroductive (ou abduction), empruntée à Charles Sanders Peirce, pour désigner le raisonnement qui permet de remonter des effets observés à leurs causes possibles.
Hanson analyse en détail la découverte par Johannes Kepler des lois du mouvement planétaire, montrant qu'elle ne résulte ni d'une induction pure (accumulation de données de Tycho Brahe) ni d'une déduction à partir de principes premiers, mais d'un processus complexe d'essais et d'erreurs guidé par des considérations théoriques<ref>Hanson, ''Patterns of Discovery'', chap. IV, « Causality and Discovery ». Voir également Andrew Lugg, « The Process of Discovery », ''Philosophy of Science'', vol. 52, n° 2, 1985, p. 207-220.</ref>. Kepler a «superinduit» le concept d'ellipse sur les données de Tycho, réalisant ainsi une «colligation» des faits autour d'une conception nouvelle. La découverte implique donc une créativité conceptuelle, une invention de nouvelles façons de voir les phénomènes.
Hanson insiste également sur le fait que l'observation est chargée de théorie (theory-laden observation). Dans un exemple célèbre, il imagine Kepler et Tycho Brahe observant le lever du soleil : voient-ils la même chose ?<ref>Hanson, ''Patterns of Discovery'', chap. I, « Observation ».</ref> Physiquement, leurs yeux reçoivent les mêmes stimulations lumineuses. Mais conceptuellement, Tycho voit le Soleil se lever au-dessus d'une Terre immobile, tandis que Kepler voit la Terre tourner pour révéler un Soleil fixe. L'observation n'est jamais neutre : elle est toujours médiatisée par nos théories et nos concepts.
=== Gaston Bachelard et l'obstacle épistémologique ===
En France, Gaston Bachelard développe une conception de la découverte scientifique comme rupture avec le sens commun et dépassement des obstacles épistémologiques<ref>Gaston Bachelard, ''La Formation de l'esprit scientifique'', Paris, Vrin, 1938.</ref>. L'esprit scientifique ne se forme pas spontanément : il doit lutter contre les habitudes mentales, les images premières, les analogies faciles qui constituent autant d'obstacles à la connaissance objective. La découverte scientifique implique une «rupture épistémologique», un effort pour penser contre soi-même, contre les évidences du sens commun.
Pour Bachelard, « rien n'est donné, tout est construit »<ref>Bachelard, ''Le Nouvel Esprit scientifique'', Paris, PUF, 1934, p. 3.</ref>. Les faits scientifiques ne sont pas simplement découverts dans la nature : ils sont produits par des instruments, des expérimentations, des théorisations. Les instruments scientifiques sont des « théories matérialisées »<ref>Bachelard, ''Nouvel Esprit scientifique'', p. 15.</ref>, et les observations qu'ils permettent sont toujours déjà imprégnées de théorie. Cette perspective constructiviste relativise l'opposition entre découverte et invention : toute découverte scientifique implique une part de construction conceptuelle et instrumentale.
== La découverte et la question du réalisme ==
=== Le réalisme scientifique ===
Le débat entre réalisme et antiréalisme structure la philosophie des sciences contemporaine. Le réalisme scientifique soutient que les théories scientifiques visent à décrire la réalité telle qu'elle est indépendamment de nous, et que les découvertes scientifiques nous donnent accès à cette réalité objective<ref>Stathis Psillos, ''Scientific Realism: How Science Tracks Truth'', London, Routledge, 1999.</ref>. Dans cette perspective, découvrir une loi scientifique, c'est mettre au jour une structure réelle du monde.
L'argument principal en faveur du réalisme est l'argument de l'absence de miracle (formulé par Hilary Putnam) : le succès prédictif extraordinaire de la science serait miraculeux si nos théories n'étaient pas au moins approximativement vraies<ref>Hilary Putnam, « What is Mathematical Truth? », in ''Mathematics, Matter and Method: Philosophical Papers'', vol. I, Cambridge University Press, 1975, p. 60-78.</ref>. Les découvertes scientifiques ne sont pas de simples instruments pratiques : elles révèlent des aspects authentiques de la réalité.
=== L'antiréalisme : empirisme constructif et instrumentalisme ===
L'antiréalisme scientifique, sous diverses formes, conteste cette interprétation. L'empirisme constructif de Bas van Fraassen soutient que les théories scientifiques visent seulement l'adéquation empirique (sauver les phénomènes observables), sans prétendre décrire des entités ou des structures inobservables<ref>Bas van Fraassen, ''The Scientific Image'', Oxford, Clarendon Press, 1980.</ref>. Accepter une théorie scientifique, ce n'est pas croire qu'elle est vraie, mais seulement qu'elle est empiriquement adéquate.
L'instrumentalisme va plus loin en considérant les théories comme de simples outils de prédiction et de contrôle, sans valeur de vérité. Dans cette perspective, parler de « découverte » en science est trompeur : les scientifiques inventent des modèles utiles plutôt qu'ils ne découvrent des vérités préexistantes.
=== La sous-détermination des théories ===
Un argument central de l'antiréalisme est la thèse de la sous-détermination des théories par les données empiriques (Duhem-Quine). Pour un ensemble donné de phénomènes observables, il existe toujours plusieurs théories incompatibles mais empiriquement équivalentes<ref>Willard Van Orman Quine, « On Empirically Equivalent Systems of the World », ''Erkenntnis'', vol. 9, 1975, p. 313-328.</ref>. Les données ne suffisent pas à déterminer univoquement la théorie vraie. Comment alors parler de « découverte » de la vérité si les données sont compatibles avec des interprétations radicalement divergentes ?
Le réaliste peut répondre que les scientifiques mobilisent d'autres critères que l'adéquation empirique : simplicité, pouvoir explicatif, fécondité heuristique. Ces critères «extra-empiriques» guident la découverte vers les théories les plus probablement vraies. Mais l'antiréaliste rétorque que ces critères sont pragmatiques, non épistémiques : ils révèlent nos préférences cognitives, non la structure objective du réel.
== Découverte et créativité scientifique ==
=== Le rôle de l'imagination ===
La découverte scientifique ne procède pas mécaniquement. Elle requiert imagination, intuition, et parfois même «coup de génie». Les exemples abondent : la théorie de la relativité d'Einstein, née d'expériences de pensée sur la lumière et le mouvement ; la structure hélicoïdale de l'ADN découverte par Watson et Crick après la vision du modèle en double hélice ; la théorie de l'évolution de Darwin, synthèse créatrice de multiples observations et lectures.
Henri Poincaré analyse le rôle de l'intuition mathématique et de l'inconscient dans la découverte<ref>Henri Poincaré, ''Science et méthode'', Paris, Flammarion, 1908, livre I, chap. III, «L'invention mathématique».</ref>. Il décrit sa propre expérience de «l'illumination» soudaine, après une période d'incubation inconsciente, où la solution d'un problème mathématique apparaît avec évidence. Cette phase de découverte, rapportée par de nombreux créateurs et savants, est toujours précédée d'une longue phase d'immersion dans le problème<ref>Jacques Hadamard, ''Psychologie de l'invention dans le domaine mathématique'', Paris, Gauthier-Villars, 1959.</ref>.
=== Hasard et sérendipité ===
Certaines découvertes majeures résultent du hasard : la pénicilline (Alexander Fleming), les rayons X (Wilhelm Röntgen), le fond diffus cosmologique (Penzias et Wilson). Cette dimension contingente de la découverte questionne l'idée d'une méthode scientifique infaillible. Comme l'écrit Louis Pasteur : «Le hasard ne favorise que les esprits préparés»<ref>Louis Pasteur, conférence à l'Université de Lille, 7 décembre 1854.</ref>. La sérendipité n'est fructueuse que pour celui qui possède les connaissances et la perspicacité nécessaires pour reconnaître l'importance d'une observation inattendue.
== Découverte et progrès scientifique ==
=== Le cumulativisme ===
La conception classique du progrès scientifique est cumulativiste : la science progresse par accumulation de découvertes, chaque génération ajoutant de nouvelles vérités au corpus de connaissances hérité. Cette vision optimiste, héritée des Lumières, voit dans la science un processus de perfectionnement continu de notre représentation du réel.
=== Le non-cumulativisme kuhnien ===
Thomas Kuhn conteste ce cumulativisme. Les révolutions scientifiques ne sont pas des ajouts au savoir établi, mais des remplacements de paradigmes incommensurables. Les concepts de la physique aristotélicienne (mouvement naturel, lieu naturel) ne sont pas conservés et améliorés par la physique newtonienne : ils sont abandonnés. De même, la physique quantique ne « découvre » pas de nouvelles vérités qui s'ajouteraient à la physique classique : elle propose une ontologie radicalement différente.
Dans cette perspective, parler de « découverte » de lois naturelles éternelles est trompeur. Ce que nous appelons découvertes sont des constructions théoriques dépendantes de paradigmes historiquement situés. Le progrès scientifique est réel, mais il consiste moins en une approximation croissante de la Vérité qu'en une résolution de problèmes de plus en plus efficace.
=== Le progrès comme croissance du savoir ===
Karl Popper propose une conception alternative : le progrès scientifique consiste en la croissance du savoir objectif à travers le processus d'élimination d'erreurs<ref>Karl Popper, ''Objective Knowledge: An Evolutionary Approach'', Oxford, Clarendon Press, 1972.</ref>. Les découvertes authentiques sont celles qui augmentent le contenu empirique de nos théories, qui nous disent davantage sur le monde en s'exposant à davantage de risques de réfutation. Une théorie T2 représente un progrès par rapport à T1 si T2 explique tous les succès de T1, plus des phénomènes que T1 ne pouvait expliquer, tout en étant plus falsifiable.
== Enjeux contemporains ==
=== Découverte assistée par ordinateur ===
L'intelligence artificielle et le calcul massivement parallèle transforment les modalités de la découverte scientifique. Des algorithmes d'apprentissage automatique (machine learning) identifient des patterns dans d'énormes masses de données, suggèrent de nouvelles hypothèses, accélèrent la simulation de phénomènes complexes<ref>Pat Langley, « Bacon.5: The Discovery of Conservation Laws », ''Proceedings of the Seventh International Joint Conference on Artificial Intelligence'', 1981, p. 121-126.</ref>. Certains programmes découvrent autonomément des lois scientifiques à partir de données brutes.
Cette « science assistée par ordinateur » soulève des questions philosophiques : peut-on parler de découverte lorsque le processus est entièrement automatisé ? La compréhension humaine est-elle nécessaire à la découverte authentique ? Ou bien la capacité prédictive suffit-elle, même si les mécanismes sous-jacents restent opaques pour les humains ?
=== Découverte et valeurs ===
La philosophie des sciences féministe et les études sociales des sciences ont montré que les valeurs sociales, politiques et culturelles influencent ce qui est découvert et comment<ref>Helen Longino, ''Science as Social Knowledge'', Princeton, Princeton University Press, 1990. Voir également Sandra Harding, «Rethinking Standpoint Epistemology», in ''Feminist Epistemologies'', New York, Routledge, 1993, p. 49-82.</ref>. Le choix des questions de recherche, l'interprétation des données, la reconnaissance de certains résultats comme significatifs, tout cela est médiatisé par le contexte social. Les découvertes en biologie sur les différences sexuelles, par exemple, ont souvent reflété et renforcé des stéréotypes de genre préexistants.
Cette contextualisation sociale de la découverte ne conduit pas nécessairement au relativisme. Elle invite plutôt à reconnaître que la science se fait toujours depuis un point de vue situé, et qu'une science plus objective peut résulter de la multiplication des perspectives plutôt que de leur effacement.
=== Découverte et propriété intellectuelle ===
Les découvertes scientifiques soulèvent des questions juridiques et éthiques complexes concernant la propriété intellectuelle. Peut-on breveter une découverte ? La tradition juridique distingue généralement les découvertes (non brevetables) des inventions (brevetables). On ne peut breveter E=mc², mais on peut breveter une application technologique de cette loi. Cette distinction est parfois difficile à maintenir, notamment en biotechnologie (peut-on breveter un gène ?) ou en pharmacologie (peut-on breveter une molécule naturelle purifiée ?).
Ces questions touchent aux finalités de la recherche scientifique : la découverte scientifique vise-t-elle la connaissance désintéressée ou l'utilité pratique ? Le savoir découvert appartient-il à l'humanité entière ou peut-il être approprié privativement ?
== Conclusion ==
La notion de découverte traverse toute la philosophie en révélant les tensions constitutives de notre rapport au savoir. Entre passivité réceptive et activité constructive, entre dévoilement d'une réalité préexistante et invention de nouvelles façons de penser, la découverte interroge la possibilité même de connaître un monde indépendant de nos cadres conceptuels.
Les perspectives contemporaines, enrichies par les approches historiques, sociologiques et multiculturelles, reconnaissent la complexité du processus de découverte. Il n'existe pas de méthode mécanique garantissant la découverte, pas plus qu'il n'existe d'observation pure, neutre, non médiatisée par des théories et des valeurs. Toute découverte est toujours déjà une interprétation, une construction conceptuelle, une intervention sur le réel.
Cela ne conduit pas pour autant au relativisme ou au scepticisme. Les découvertes scientifiques possèdent un caractère objectif : elles s'imposent à nous, résistent à nos désirs et à nos attentes, se révèlent fécondes bien au-delà de leur contexte d'émergence. Reconnaître la dimension constructive de la découverte n'annule pas sa dimension réaliste : c'est bien le monde lui-même qui résiste, qui surprend, qui oblige à réviser nos théories.
La découverte demeure ainsi l'expérience philosophique fondamentale : celle de la rencontre entre la pensée et le réel, où s'éprouve à la fois notre dépendance envers le monde et notre capacité à le transformer par la connaissance.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie sélective ==
=== Ouvrages fondamentaux ===
* Gaston Bachelard, ''La Formation de l'esprit scientifique'', Paris, Vrin, 1938.
* Gaston Bachelard, ''Le Nouvel Esprit scientifique'', Paris, PUF, 1934.
* Norwood Russell Hanson, ''Patterns of Discovery: An Inquiry into the Conceptual Foundations of Science'', Cambridge, Cambridge University Press, 1958.
* Emmanuel Kant, ''Critique de la raison pure'', 1781, trad. Alain Renaut, Paris, Flammarion, 2006.
* Thomas S. Kuhn, ''La Structure des révolutions scientifiques'', 1962, trad. Laure Meyer, Paris, Flammarion, 1983.
* Karl Popper, ''La Logique de la découverte scientifique'', 1934, trad. Nicole Thyssen-Rutten et Philippe Devaux, Paris, Payot, 1973.
* Karl Popper, ''Conjectures et réfutations'', 1963, trad. Michelle-Irène et Marc B. de Launay, Paris, Payot, 1985.
=== Études spécialisées ===
* Ian Hacking, ''Representing and Intervening'', Cambridge University Press, 1983.
* Helen Longino, ''Science as Social Knowledge: Values and Objectivity in Scientific Inquiry'', Princeton University Press, 1990.
* Stathis Psillos, ''Scientific Realism: How Science Tracks Truth'', Routledge, 1999.
* Bas van Fraassen, ''The Scientific Image'', Oxford, Clarendon Press, 1980.
=== Articles de référence ===
* Andrew Lugg, « The Process of Discovery », ''Philosophy of Science'', vol. 52, n° 2, 1985, p. 207-220.
* Hilary Putnam, « What is Mathematical Truth? », in ''Mathematics, Matter and Method'', Cambridge University Press, 1975, p. 60-78.
* W.V.O. Quine, « On Empirically Equivalent Systems of the World », ''Erkenntnis'', vol. 9, 1975, p. 313-328.
== Articles connexes ==
* [[Épistémologie]]
* [[Méthode scientifique]]
* [[Observation]]
* [[Vérité]]
* [[Invention]]
* [[Progrès scientifique]]
* [[Réalisme scientifique]]
{{Autocat}}
1whndg8p7gxm6dxxygkj08bq6rokosm
Dictionnaire de philosophie/Criticisme
0
83139
768278
767294
2026-06-22T03:28:47Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768278
wikitext
text/x-wiki
{{DicoPhilo|Criticisme|lecture=oui}}
Le criticisme désigne la méthode philosophique inaugurée par Emmanuel Kant dans la ''Critique de la raison pure'' (1781/1787), puis développée dans la ''Critique de la raison pratique'' (1788) et la ''Critique de la faculté de juger'' (1790). Ce terme, dont Kant lui-même usait rarement, s'est progressivement imposé pour qualifier l'ensemble du projet philosophique kantien et les doctrines ultérieures qui s'en réclament. Le criticisme se caractérise avant tout par une interrogation systématique des conditions de possibilité, de l'étendue légitime et des limites incontournables de la connaissance humaine. Cette investigation préalable constitue une condition sine qua non avant d'entreprendre toute spéculation métaphysique sérieuse. À ce titre, le criticisme représente un dépassement sans équivoque du dogmatisme rationaliste et du scepticisme empiriste, ces deux positions qu'il absorbe en les transcendant.
== Origines et signification du terme ==
Le mot « criticisme » s'avère relativement tardif dans l'histoire de la langue philosophique. Kant lui-même privilégiait les formules « philosophie critique » ou « critique de la raison », réservant un usage plus restreint au substantif « criticisme ». C'est dans la tradition post-kantienne, particulièrement chez ses successeurs allemands, que le terme se cristallise et s'impose pour désigner l'ensemble du projet critique, notamment afin de le distinguer clairement d'autres courants philosophiques concurrents.
L'étymologie éclaire la signification profonde de cette démarche. Le mot « critique » procède du grec κρίνειν (''krinein''), qui signifie littéralement « séparer », « juger », « décider ». Le criticisme kantien organise donc essentiellement une institution judiciaire de la raison qui se prononce sur elle-même, examinant ses propres capacités et ses frontières inévitables. Cette image du tribunal revient constamment chez Kant, qui propose dans la préface de la première ''Critique'' une perspective révélatrice : « Notre siècle est spécialement le siècle de la critique, à laquelle tout doit se soumettre. La religion par sa sainteté et la législation par sa majesté veulent communément s'y soustraire »<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'', A xi, note, Riga, Johann Friedrich Hartknoch, 1781 ; trad. fr. Alexandre J.-L. Delamarre et François Marty, ''Critique de la raison pure'', Paris, Gallimard, « Bibliothèque de la Pléiade », 1980, p. 728.</ref>. Cette déclaration révèle l'ambition du criticisme : soumettre tous les domaines du savoir humain au tribunal de la raison, nul n'échappant à cet examen rigoureux, fût-ce les institutions traditionnelles qui revendiquent une autorité sacrée ou politique.
La notion kantienne de critique s'oppose radicalement à une critique superficielle ou polémique. Il ne s'agit nullement de critiquer au sens banal de « blâmer » ou de « contester ». Kant entend plutôt une critique d'ordre transcendantal, c'est-à-dire une investigation portant sur les conditions a priori qui rendent possibles nos connaissances et nos représentations. Cette critique révolutionne la philosophie en refusant d'accorder une confiance naïve aux prétentions cognitives de la métaphysique traditionnelle.
== La révolution copernicienne ==
=== Le point de départ critique ===
La genèse du criticisme répond à une situation historique précise dont Kant fut profondément conscient. La métaphysique, à ses yeux, s'était engagée dans une impasse depuis des siècles, produisant un spectacle lamentable de controverses interminables entre les dogmatiques. Les rationalistes leibniziens s'opposaient irréductiblement aux empiristes anglais, sans que jamais l'un des camps ne parvînt à démontrer ses positions de façon probante. Cette stagnation philosophique contrastait fortement avec les progrès spectaculaires accomplis par la physique mathématique, notamment sous l'impulsion de Newton.
Kant diagnostique l'origine de ce mal : la métaphysique ignore la véritable nature du rapport entre la raison et l'objet. Il faut inverser la perspective dominante depuis l'Antiquité. Plutôt que de supposer que notre connaissance doit s'adapter passivement aux objets tels qu'ils existent indépendamment de nous, le criticisme propose une hypothèse audacieuse que Kant compare volontiers à la révolution copernicienne en astronomie : les objets doivent s'adapter à notre connaissance, c'est-à-dire à la structure de nos facultés cognitives. Comme Copernic avait renversé l'astronomie en faisant tourner la Terre autour du Soleil, Kant propose de renverser l'épistémologie en affirmant que ce que nous pouvons connaître dépend des conditions subjectives du connaître.
Kant explique cette révolution avec une clarté remarquable dans la préface de la seconde édition de la ''Critique de la raison pure'' : « On a admis jusqu'ici que toute notre connaissance devait se régler sur les objets ; mais, dans cette hypothèse, tous les efforts pour établir sur eux quelque jugement a priori par concepts ne tombait dans l'absurde. Que l'on essaye donc enfin de voir si nous ne réussirions pas mieux dans les problèmes de la métaphysique, en admettant que les objets doivent se régler sur notre connaissance »<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'', B xvi, Riga, Johann Friedrich Hartknoch, 1787 ; trad. fr. Alain Renaut, ''Critique de la raison pure'', Paris, Aubier, 1997, p. 76.</ref>.
Cette inversion perspectiviste constitue la clé de voûte du criticisme entier. Elle permet de réconcilier deux exigences apparemment incompatibles : maintenir la certitude et l'universalité de la connaissance scientifique tout en reconnaissant que notre savoir porte exclusivement sur les phénomènes et non sur les choses en elles-mêmes.
=== Dépassement des positions extrêmes ===
Le criticisme se positionne avec précision entre deux pôles qui représentent autant d'erreurs symétriques. Le dogmatisme rationalist, incarné par la métaphysique wolffienne d'Allemagne, prétend accéder par la seule raison conceptuelle à la connaissance des réalités transcendantes (Dieu, l'âme, le monde comme totalité). Cette prétention ignore complètement la question préalable : quelles sont les véritables limites du pouvoir cognitif de la raison pure ? Le dogmatique procède comme si cette question n'avait aucune pertinence. C'est pourquoi Kant qualifie cette démarche de non-critique : elle manque précisément d'une réflexion critique sur ses propres fondements.
Le scepticisme, particulièrement dans sa formulation humienne, réagit contre les prétentions du dogmatisme en arguant que nos concepts ne peuvent jamais atteindre les choses telles qu'elles sont. Hume en conclut que nous devons nous contenter de régularités observées et d'associations habituelles, sans prétendre à une connaissance véritable des connexions causales ou de la nature profonde des objets. Cette position possède un mérite : elle reconnaît les limites du connaître. Mais elle va trop loin en niant la possibilité même d'une connaissance certaine et universelle. Kant reconnaît explicitement sa dette envers Hume : « Ce fut David Hume qui interrompit d'abord mon sommeil dogmatique et donna à mes recherches dans le champ de la philosophie spéculative une tout autre direction »<ref>Emmanuel Kant, ''Prolegomena zu einer jeden künftigen Metaphysik'', § 4, note 1, Riga, Johann Friedrich Hartknoch, 1783, AA IV, 260 ; trad. fr. Louis Guillermit, ''Prolégomènes à toute métaphysique future'', Paris, Vrin, 1986, p. 22.</ref>. Cependant, le criticisme refuse d'accepter la conclusion scéptique selon laquelle la science n'offrirait que des généralités sans fondement rationnel.
Le criticisme surpasse cette opposition en montrant la possibilité d'une connaissance rigoureuse qui, tout en reconnaissant ses limites, s'avère certaine et universelle dans son domaine propre. Oui, nous ne pouvons connaître les choses en soi ; oui, nos connaissances dépendent de la structure de nos facultés ; mais précisément pour cette raison, nous pouvons énoncer avec certitude apodictique les lois qui gouvernent les phénomènes. Nos intuitions et nos concepts, bien que finement adaptés à notre condition d'êtres finis doués de sensibilité et d'entendement, nous fournissent néanmoins une connaissance valide de ce qui s'offre à notre expérience.
== Structure et architectonique du système critique ==
=== Les trois Critiques comme système unifié ===
L'originalité profonde du kantisme réside dans sa structure tripartite, loin d'être accidentelle ou rhétorique. Kant lui-même conçoit les trois ''Critiques'' comme constituant un système architectoniquement organisé, où chaque partie correspond à l'exercice d'une faculté différente et examine ses conditions de légitimité. Cette architecture n'est pas un simple arrangement externe mais manifeste la structure même de la raison humaine telle que Kant la déploie.
La Critique de la raison pure (première édition 1781, seconde édition 1787) examine l'usage théorique de la raison en déterminant quelles connaissances objectives nous pouvons légitimement acquérir. Elle analyse les deux grandes facultés cognitives : la sensibilité, qui reçoit passivement les données du monde extérieur et interne, et lentendement, qui structure activement ces données au moyen de concepts. Aucune de ces deux facultés ne suffit à elle seule. Comme le formule le passage si fameux : « Des pensées sans contenu sont vides, des intuitions sans concepts sont aveugles »<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'', A 51 / B 75 ; trad. fr. Alain Renaut, Paris, Aubier, 1997, p. 131.</ref>. La première Critique établit que la connaissance objective naît exclusivement de la convergence harmonieuse de ces deux sources.
La Critique de la raison pratique (1788) s'interroge sur les principes de l'action morale et de la volonté. Elle demande : comment la raison peut-elle être pratique ? Comment peut-elle commander impérativement sans se fonder sur un objet donné ou un but empirique ? Cette deuxième Critique révèle que les réalités que la première Critique devait exclure du savoir théorique acquièrent une signification nouvelle. La liberté, l'âme immortelle, l'existence de Dieu demeurent théoriquement inconnaissables, mais la raison pratique les requiert comme postulats, c'est-à-dire comme conditions de possibilité de la vie morale.
La Critique de la faculté de juger (1790) occupe une position médiatrice. Elle examine la faculté de juger réfléchissante, qui opère différemment de celle du jugement déterminant examiné dans les deux premières Critiques. Cette troisième Critique reconstitue l'unité du système en montrant comment la nature peut être pensée comme un système d'êtres et de processus doués de finalité, comment l'esthétique et la téléologie constituent des modes légitimes d'organisation de notre expérience sans accéder au statut d'une connaissance théorique.
=== Les formes a priori de la sensibilité ===
La révolution transcendantale kantienne commence dans l'Esthétique transcendantale, où Kant établit que l'espace et le temps ne sont ni des propriétés des choses en elles-mêmes, ni de simples conventions, mais les formes a priori de l'intuition sensible. Autrement dit, espace et temps constituent la structure subjective selon laquelle tout objet possible nous apparaît nécessairement.
Cette doctrine s'oppuse frontalement aux conceptions adverses. Ni l'espace n'existe objectivement comme théâtre immobile où les choses se mouvaient (conception newtonienne absolue), ni les formes spatio-temporelles n'émanent simplement du rapport des choses elles-mêmes : ce sont les conditions requises pour que des choses nous soient présentes comme objets d'expérience. Kant en conclut que la géométrie et la chronométrie possèdent un caractère nécessaire et universel non parce qu'elles décriraient la structure intrinsèque du monde, mais parce qu'elles explicitent les conditions qui structurent toute expérience possible.
Cette analyse permit à Kant de résoudre un problème qui avait préoccupé les penseurs des siècles précédents : comment les mathématiques peuvent-elles être à la fois rigoureuses et applicables au monde empirique ? La réponse : les mathématiques traitent des formes de l'intuition et des concepts a priori de l'entendement qui constituent objectivement la structure de tout phénomène.
=== L'entendement et ses catégories ===
L'Analytique transcendantale approfondit cette investigation en démontrant que l'entendement lui aussi possède des formes a priori : les catégories, que Kant déduit systématiquement des formes du jugement logique. À partir de l'examen des jugements grammaticaux et logiques, Kant isole douze catégories organisées en quatre groupes : la quantité (unité, pluralité, totalité), la qualité (réalité, négation, limitation), la relation (substance-accident, cause-effet, communauté), la modalité (possibilité-impossibilité, existence-non-existence, nécessité-contingence)<ref>Emmanuel Kant, ''Kritik der reinen Vernunft'', A 70-83 / B 95-116 ; trad. fr. Alain Renaut, Paris, Aubier, 1997, p. 148-162.</ref>.
Or ces catégories ne demeurent pas abstraites ou purement subjectives. La Déduction transcendantale des catégories, chapitre décisif et notablement ardu de la première Critique, établit que ces concepts possèdent une validité objective : ils s'appliquent légitimement et nécessairement à tout objet possible de notre expérience. Comment cette application est-elle possible ? En raison de l'unité transcendantale de l'aperception. Le « je pense » doit pouvoir accompagner toutes nos représentations, et ce je qui synthétise toute multiplicité est la condition de possibilité de l'objectivité elle-même. Par cette doctrine, Kant montre que les catégories ne sont nullement des cadres arbitraires imposés du dehors à un flux chaotique de sensations ; elles constituent plutôt les très principes selon lesquels une multiplicité peut être synthétisée en une représentation cohérente d'objet.
=== La chose en soi et le noumène ===
L'idéalisme transcendantal kantien s'édifie sur la distinction cruciale entre le phénomène et la chose en soi (''Ding an sich''), entre le noumène et le phénomène. Cette dichotomie n'est pas une faiblesse ou une lacune du système ; elle en constitue au contraire l'architecture fondatrice.
Le phénomène désigne l'objet tel qu'il apparaît au sujet connaissant, structuré par nos formes a priori de sensibilité et d'entendement. Nos connaissances, sans exception, portent exclusivement sur les phénomènes. Les lois de la nature que la science énonce, les vérités mathématiques que nous démontrons, les jugements synthétiques a priori que nous formons tous s'appliquent au monde des phénomènes.
La chose en soi ou noumène représente ce qui existe indépendamment de nos représentations. Nous pouvons former le concept d'une chose en soi ; nous savons qu'il faut que quelque chose existe au-delà de l'apparence pour que l'apparence même soit intelligible. Mais nous ne pouvons avoir aucune intuition d'une chose en soi, et sans intuition, il n'existe aucune connaissance objective. Le noumène demeure donc pensable mais non connaissable.
Cette doctrine résout les antinomies classiques qui tourmentaient la métaphysique. À titre d'exemple, l'antinomie de la liberté et du déterminisme : dans l'ordre phénoménal, tout événement obéit à la loi de causalité stricte et le déterminisme règne universellement ; mais dans l'ordre nouménal, la liberté reste pensable et même métaphysiquement possible. Chaque action humaine se présente sous deux aspects : en tant que phénomène, elle s'insère dans une chaîne causale rigoureuse ; en tant que prise en elle-même, elle peut s'identifier à l'expression d'une décision libre de l'être intelligible que je suis. Ces deux perspectives ne s'excluent pas mutuellement, elles s'étagent sur deux niveaux ontologiques distincts.
== La doctrine morale du criticisme ==
=== L'autonomie de la raison pratique ===
La ''Critique de la raison pratique'' inaugure un nouveau domaine où la raison exerce un pouvoir ignoré jusqu'alors. Contrairement à la raison théorique, qui subit passivement l'empire de la sensibilité et se laisse dominer par la chaîne causale du monde empirique, la raison pratique possède la capacité d'édicter sa propre loi, indépendamment des penchants sensibles. Cette capacité constitue ce que Kant appelle l'autonomie (littéralement : autolégislation).
L'autonomie s'oppose symétriquement à l'hétéronomie, qui caractérise toutes les autres doctrines morales. Le moraliste hédoniste, le perfectioniste classique, le moraliste utilitariste fondent tous le bien sur quelque principe externe à la volonté elle-même : le plaisir, la perfection, l'utilité, le bien-être. Même si ces doctrines prétendent au rationnalisme, elles demeurent hétéronomes puisqu'elles subordinent la volonté à une fin qui ne procède pas de sa propre nature rationnelle.
L'impératif catégorique constitue la formulation la plus rigoureuse de cette autonomie. Cet impératif commande inconditionnellement, sans référence à un objet déterminé : « Agis uniquement d'après la maxime qui fait que tu peux vouloir en même temps qu'elle devienne une loi universelle »<ref>Emmanuel Kant, ''Grundlegung zur Metaphysik der Sitten'', AA IV, 421, Riga, Johann Friedrich Hartknoch, 1785 ; trad. fr. Alain Renaut, ''Fondements de la métaphysique des mœurs'', Paris, GF-Flammarion, 1994, p. 108.</ref>. Cette formulation exprime l'exigence d'universalité qui marque toute loi rationnelle. Une maxime, c'est-à-dire le principe subjectif de notre action, n'est morale que si nous pouvons simultanément vouloir que ce principe devienne une loi universelle à laquelle chacun serait soumis.
Kant propose plusieurs formulations équivalentes de ce principe. La formule de l'humanité énonce : « Agis de telle sorte que tu traites l'humanité, aussi bien dans ta personne que dans la personne de tout autre, toujours en même temps comme fin, et jamais simplement comme moyen »<ref>Emmanuel Kant, ''Grundlegung zur Metaphysik der Sitten'', AA IV, 429 ; trad. fr. Alain Renaut, Paris, GF-Flammarion, 1994, p. 119.</ref>. Cette formulation révèle que l'impératif catégorique n'est nullement étroit ou formaliste. Il érige en principe suprême le respect de la dignité de chaque personne raisonnable, reconnaissant en chaque être doué de raison une fin en soi, jamais réductible à un simple moyen au service d'autres fins.
=== Les postulats de la raison pratique ===
Une singularité remarquable du système kantien réside dans le rapport inverse qu'il établit entre la raison théorique et la raison pratique. Alors que la première Critique devait rejeter les « idées transcendantales » de la psychologie, la cosmologie et la théologie rationnelles, la seconde Critique les postule comme conditions nécessaires de la vie morale.
La liberté constitue le postulat fondateur. Agir moralement signifie se déterminer par la seule représentation de la loi morale, indépendamment de tout mobile empirique. Cette détermination par la raison suppose la liberté, conçue comme indépendance envers le mécanisme causal qui gouverne la nature. Sans postulat de liberté, l'impératif catégorique perd tout sens : comment pourrait-on commander ce qui est impossible ?
L'immortalité de l'âme s'avère nécessaire pour une raison profonde. L'impératif catégorique nous ordonne d'accomplir notre devoir en vue d'une perfection morale infinie, une harmonie complète entre notre volonté et la loi morale. Or cette perfection, en tant que but d'une action morale infinie, ne peut s'accomplir dans une durée finie. Postulons donc une existence future où l'âme poursuive indéfiniment ce progrès moral.
L'existence de Dieu s'impose comme troisième postulat. L'impératif moral nous ordonne de viser le ''souverain bien'', c'est-à-dire l'union complète de la vertu et du bonheur dans la mesure que l'on en est digne. Or empiriquement, ces deux éléments semblent totalement disjoints : la vertu n'entraîne nullement le bonheur, un monde rempli de méchants peut prospérer matériellement tandis que les justes souffrent. Pour que le ''souverain bien'' soit possible, nous devons postuler l'existence d'un être tout-puissant et parfaitement juste, capable de garantir l'accord final entre la vertu et le bonheur dans la perspective éternelle.
Ces trois postulats constituent autant de conditions de la vie morale pensée dans sa totalité. Ils ne constituent nullement des connaissances ; ce sont des articles d'une foi morale ou foi pratique (distincte de la foi théorique ou spéculative). Contrairement à la foi religieuse traditionnelle qui prétend à une révélation surnaturelle, la foi morale kantienne repose exclusivement sur la raison pratique elle-même et l'exigence inconditionnelle de l'impératif catégorique.
== Postérité du criticisme ==
=== Le néo-criticisme français ===
En France, l'accueil du kantisme s'avéra compliqué et différé. Méconnue ou déformée durant les premières décennies du XIXe siècle, la pensée de Kant connaît une redécouverte tardive. Victor Cousin (1792-1867), qui façonna la philosophie universitaire sous la Monarchie de Juillet, proposera une assimilation sélective du criticisme, l'intégrant dans un éclectisme philosophique qui en dilue la portée révolutionnaire.
C'est Charles Renouvier (1815-1903) qui en France développa le plus systématiquement une reprise du criticisme. Son néo-criticisme se réclame explicitement de Kant tout en s'en écartant sur des points essentiels. Renouvier rejette la fameuse distinction kantienne entre phénomène et chose en soi, défendant un phénoménisme intégral selon lequel notre expérience phénoménale constitue la réalité elle-même. Il affirme également l'indéterminisme et la contingence radicale contre le déterminisme scientiste de son époque.
L'œuvre maîtresse de Renouvier, les ''Essais de critique générale'' (1854-1864), opère une reconstruction complète de la philosophie critique en la libérant, selon lui, de ses résidus dogmatiques. Renouvier fonde en 1867 l{{'}}''Année philosophique'', puis en 1872 la ''Critique philosophique, politique, scientifique, littéraire'', organes d'influence considérable pour la Troisième République naissante. Le néo-criticisme renouviériste acquiert une dimension éthique et politique prononcée, se présentant comme une philosophie de l'émancipation républicaine, de la laïcité et du libre arbitre contre les déterminismes fatalistes.
=== Le néo-kantisme allemand ===
En Allemagne même, la fin du XIXe siècle voit l'émergence du néo-kantisme comme courant philosophique dominant. Le cri de ralliement « Retour à Kant ! » (''Zurück zu Kant!''), lancé par Otto Liebmann en 1865, incarne le projet de ressaisir la méthode critique en la dégageant des spéculations idéalistes post-kantiennes qui l'auraient dénaturée.
L'école de Marbourg, fondée par Hermann Cohen, développe une interprétation logico-transcendantale du criticisme. Accordant la primauté à l'entendement sur la sensibilité, les penseurs de Marbourg voient en Kant un précurseur de la philosophie de la science, capable de fournir les outils conceptuels pour analyser les structures logiques de la connaissance scientifique. Paul Natorp, qui poursuivit cette orientation, élabora sa fameuse ''Psychologie reconstructive'', où l'introspection cède le pas à la reconstruction du psychique à partir de ses manifestations objectives.
Ernst Cassirer, penseur de stature considérable, appartient à la tradition de Marbourg mais en élargit l'horizon. Sa ''Philosophie des formes symboliques'' (1923-1929) applique la méthode critique à l'ensemble de la culture humaine, montrant comment l'homme ne se rapporte jamais directement aux choses mais toujours à travers des systèmes symboliques complexes : langage, art, mythologie, science.
L'école de Bade ou du Sud-Ouest, avec Wilhelm Windelband et Heinrich Rickert, infléchit le néo-kantisme dans une direction différente. Ces penseurs s'intéressent particulièrement à la axiologie (théorie des valeurs) comme transcendantal propre aux sciences de la culture. Ils argüent que si les sciences de la nature visent à dégager des lois universelles, les sciences historiques et culturelles opèrent autrement, en sélectionnant dans la réalité les faits dotés d'une signification axiologique particulière.
=== Critiques et dépassements ultérieurs ===
Le criticisme fut soumis à d'intenses critiques par les générations qui suivirent Kant. L'idéalisme allemand, incarné par Fichte, Schelling et surtout Hegel, reproche au kantisme son dualisme apparent entre phénomène et chose en soi, dualisme présenté comme une lacune méthodique insupportable. Fichte proposa un ''Moi'' absolu capable d'engendrer le ''Non-Moi'' par une série d'oppositions dialectiques, écartant ainsi la chose en soi kantienne demeurée externe et incompréhensible.
Schopenhauer, tout en proclamant son attachement à Kant, transforma radicalement le criticisme en identifiant la chose en soi à la Volonté universelle, principe métaphysique transcendant que nous connaissons immédiatement dans notre propre vouloir. Nietzsche, bien plus tard, radicalisera la critique du kantisme en contestant l'idée même de vérité objective et en dénonçant les catégories a priori comme des fictions utiles plutôt que des structures rationnelles nécessaires.
Husserl, fondateur de la phénoménologie, critiquera le psychologisme implicite qu'il détecte dans l'approche kantienne du sujet transcendantal. Martin Heidegger, dans son ''Kant et le problème de la métaphysique'' (1929), proposera une interprétation ontologique du criticisme, enracinant la théorie kantienne de la connaissance dans une enquête sur l'être même.
La philosophie française du XXe siècle demeure traversée par la question de Kant. Léon Brunschvicg (1869-1944) élabore un idéalisme critique centré sur le jugement et l'activité de synthèse de l'esprit. Sartre critiquera le sujet transcendantal kantien comme insuffisamment ancré dans la factualité de l'existence concrète. Deleuze, dans sa ''Philosophie critique de Kant'' (1963), produira une lecture nouvelle et créative où le criticisme apparaît moins comme une théorie générale de la connaissance que comme une architectonique subtile des facultés et de leurs rapports mutuels.
== Actualité et relevance du criticisme ==
Le criticisme conserve une pertinence philosophique constante pour plusieurs raisons d'importance. Premièrement, il a établi de manière durable que toute philosophie authentique doit commencer par une réflexion sur ses propres conditions de possibilité. Le geste critique, au sens kantien, est désormais constitutif de la démarche philosophique moderne. Aucun penseur contemporain ne peut prétendre ignorer l'exigence de justifier les fondements de ses entreprises conceptuelles.
Secondement, la distinction entre phénomène et chose en soi, quels que soient les critiques adressés à sa formulation kantienne, pose de manière exemplaire le problème inévitable du rapport entre ce qui apparaît et ce qui est, entre la représentation et la réalité, entre l'ordre épistémique et l'ordre ontologique. Le réalisme naïf et le scepticisme radical butte l'un et l'autre contre les apories qu'il faut dépasser.
Tertio, en épistémologie contemporaine, le criticisme kantien inspire les conceptions constructivistes qui reconnaissent le rôle actif que le sujet connaissant exerce dans l'élaboration de l'objectivité scientifique. Les philosophes des sciences modernes, même ceux qui rejettent explicitement Kant, fonctionnent en arrière-plan dans un horizon critique kantien, acceptant que la connaissance scientifique construise son objet plutôt que de simplement le refléter.
Quarto, en morale et en politique, l'idée kantienne d'autonomie et le principe du respect de la personne comme fin en soi demeurent des références incontournables pour la pensée contemporaine des droits de l'homme, de la justice et de la dignité. L'impératif catégorique, correctement interprété, fournit une base rationnelle à l'éthique qui dépasse les particularismes historiques et culturels tout en respectant la pluralité des conceptions du bien.
Enfin, le criticisme a nourri la réflexion contemporaine en philosophie du droit et en théorie politique. L'idée kantienne d'une paix perpétuelle fondée sur l'adoption universelle de constitutions républicaines demeure pertinente pour penser l'ordre international et les conditions d'une coexistence juste entre les peuples souverains.
Peter Strawson, dans son ouvrage ''The Bounds of Sense'' (1966), s'efforça d'extraire un « noyau analytiquement rigoureux » du criticisme kantien en le libérant de ce que les penseurs analytiques considéraient comme ses résidus métaphysiques. Cette tentative, si elle témoigne d'une certaine marginalisation du kantisme dans la tradition analytique anglophone, révèle également la fécondité persistante de la méthode critique, sa capacité à féconder les discussions philosophiques ultérieures et sa résistance aux obsolescences doctrinales qui guettent les pensées philosophiques moins bien charpentées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Kant ===
* Emmanuel Kant, ''Kritik der reinen Vernunft'', 1re édition (A), Riga, Johann Friedrich Hartknoch, 1781 ; 2e édition (B), 1787. Traductions françaises : Alain Renaut, ''Critique de la raison pure'', Paris, Aubier, 1997 ; Alexandre J.-L. Delamarre et François Marty, in ''Œuvres philosophiques'', t. I, Paris, Gallimard, « Bibliothèque de la Pléiade », 1980.
* Emmanuel Kant, ''Prolegomena zu einer jeden künftigen Metaphysik, die als Wissenschaft wird auftreten können'', Riga, Johann Friedrich Hartknoch, 1783. Traduction française Louis Guillermit, ''Prolégomènes à toute métaphysique future qui pourra se présenter comme science'', Paris, Vrin, 1986.
* Emmanuel Kant, ''Grundlegung zur Metaphysik der Sitten'', Riga, Johann Friedrich Hartknoch, 1785. Traduction française Alain Renaut, ''Fondements de la métaphysique des mœurs'', Paris, GF-Flammarion, 1994.
* Emmanuel Kant, ''Kritik der praktischen Vernunft'', Riga, Johann Friedrich Hartknoch, 1788. Traduction française Jean-Pierre Fussler, ''Critique de la raison pratique'', Paris, GF-Flammarion, 2003.
* Emmanuel Kant, ''Kritik der Urteilskraft'', Berlin et Libau, Lagarde et Friedrich, 1790. Traduction française Alain Renaut, ''Critique de la faculté de juger'', Paris, Aubier, 1995.
* Emmanuel Kant, ''Zum ewigen Frieden. Ein philosophischer Entwurf'', Königsberg, Friedrich Nicolovius, 1795. Traduction française Jean-François Poirier et Françoise Proust, ''Vers la paix perpétuelle'', Paris, GF-Flammarion, 1991.
* Emmanuel Kant, ''Die Religion innerhalb der Grenzen der blossen Vernunft'', Königsberg, Friedrich Nicolovius, 1793. Traduction française Alexis Philonenko, ''La Religion dans les limites de la simple raison'', Paris, Vrin, 1988.
=== Études générales ===
* Henri Bergson, « La philosophie critique de Kant », in ''Écrits philosophiques'', Paris, PUF, 2011, p. 249-285.
* Émile Bréhier, ''Histoire de la philosophie'', t. II : ''La Philosophie moderne'', Paris, Félix Alcan, 1921-1926.
* Léon Brunschvicg, ''Le Progrès de la conscience dans la philosophie occidentale'', 2 vol., Paris, PUF, 1927 (réédition 1953).
* Gilles Deleuze, ''La Philosophie critique de Kant'', Paris, PUF, 1963.
* Michel Fichant, « L'espace est représenté comme une grandeur infinie donnée. La radicalité de l'Esthétique », ''Philosophie'', no 56, 1997, p. 20-48.
* Luc Ferry, ''Kant : une lecture des trois Critiques'', Paris, Grasset, 2006.
* Paul Guyer, ''Kant'', Londres, Routledge, 2006.
* Alexis Philonenko, ''L'Œuvre de Kant'', 2 vol., Paris, Vrin, 1969-1972.
* Alain Renaut, ''Kant aujourd'hui'', Paris, Aubier, 1997.
=== Sur le néo-criticisme et le néo-kantisme ===
* François Azouvi, ''La Gloire de Bergson. Essai sur le magistère philosophique'', Paris, Gallimard, 2007.
* François Azouvi et Dominique Bourel, ''De Königsberg à Paris. La Réception de Kant en France (1788-1804)'', Paris, Vrin, 1991.
* Hermann Cohen, ''Kants Theorie der Erfahrung'', Berlin, Ferdinand Dümmler, 1871 (3e édition augmentée, 1918).
* Ernst Cassirer, ''Philosophie der symbolischen Formen'', 3 vol., Berlin, Bruno Cassirer, 1923-1929. Traduction française Ole Hansen-Love et Jean Lacoste, ''Philosophie des formes symboliques'', 3 vol., Paris, Minuit, 1972.
* Jules Lachelier, ''Du Fondement de l'induction'', Paris, Ladrange, 1871 (rééd. in ''Œuvres'', t. I, Paris, Félix Alcan, 1933).
* Octave Hamelin, ''Essai sur les éléments principaux de la représentation'', Paris, Félix Alcan, 1907.
* Charles Renouvier, ''Essais de critique générale : premier essai. Traité de logique générale et de logique formelle'', Paris, Ladrange, 1854.
* Charles Renouvier, ''Essais de critique générale : deuxième essai. L'Homme. La raison, la passion, la liberté, la certitude, la probabilité morale'', Paris, Ladrange, 1859.
* Charles Renouvier, ''Essais de critique générale : troisième essai. Les Principes de la nature'', Paris, Bureau de la Critique philosophique, 1864.
* Heinrich Rickert, ''Die Grenzen der naturwissenschaftlichen Begriffsbildung. Eine logische Einleitung in die historischen Wissenschaften'', Tübingen, Mohr, 1902.
* Pietro Terzi, ''Images de Kant et formes du criticisme dans la philosophie française contemporaine. Une enquête historico-théorétique (1850-1980)'', thèse de doctorat, Université Paris Nanterre, 2020.
* Wilhelm Windelband, ''Geschichte und Naturwissenschaft'', Strasbourg, Heitz, 1894.
* Peter Strawson, ''The Bounds of Sense: An Essay on Kant's Critique of Pure Reason'', Londres, Methuen, 1966.
== Voir aussi ==
* Idéalisme transcendantal
* Phénomène et noumène
* Catégories
* Impératif catégorique
* Jugement synthétique a priori
* Raison pratique et raison théorique
* Néo-kantisme
* Liberté et déterminisme
* Autonomie morale
* Philosophie transcendantale
[[Catégorie:Épistémologie]]
[[Catégorie:Métaphysique]]
{{AutoCat}}
9jakybh86w7r0kn6q1qsvfq0hdnj7xj
Dictionnaire de philosophie/Déduction
0
83184
768284
754381
2026-06-22T03:29:47Z
PandaMystique
119061
Bot : ajout du paramètre lecture=oui au modèle {{DicoPhilo}}
768284
wikitext
text/x-wiki
{{DicoPhilo|Déduction|lecture=oui}}
La déduction constitue l'une des formes fondamentales du raisonnement philosophique et scientifique. Elle désigne ce mode d'inférence par lequel, à partir de prémisses tenues pour vraies, une conclusion en découle nécessairement. À la différence de l'induction, qui procède du particulier au général, ou de l'abduction, qui infère la meilleure explication possible, la déduction garantit la vérité de la conclusion si les prémisses sont vraies et si le raisonnement respecte les règles de la logique. Cette forme de raisonnement occupe une place centrale dans l'histoire de la philosophie, depuis les analyses d'Aristote jusqu'aux développements contemporains de la logique formelle.
== Origines aristotéliciennes et syllogistique ==
La première théorisation systématique de la déduction remonte à Aristote (384-322 av. J.-C.), qui développe dans les ''Premiers Analytiques'' une théorie du syllogisme<ref>Aristote, ''Premiers Analytiques'', I, 1, 24b18-20</ref>. Le syllogisme (''sullogismos'' en grec) désigne, selon la définition qu'en donne le Stagirite, « un discours dans lequel, certaines choses étant posées, quelque chose d'autre que ces données en résulte nécessairement par le fait même de ces données »<ref>Aristote, ''Premiers Analytiques'', I, 1, 24b18-22</ref>. Cette définition met en évidence les caractères essentiels de la déduction : la nécessité du lien entre prémisses et conclusion, et le fait que la conclusion diffère des prémisses tout en en découlant.
Aristote distingue trois figures du syllogisme, selon la position du terme moyen qui assure la liaison entre les deux prémisses. Le syllogisme de la première figure, considéré comme parfait, prend la forme suivante : « Si A se dit de tout B, et B de tout C, alors nécessairement A se dit de tout C »<ref>Aristote, ''Premiers Analytiques'', I, 4-6</ref>. Cette structure trouve son illustration dans l'exemple célèbre : « Tous les hommes sont mortels ; or Socrate est un homme ; donc Socrate est mortel ». Le terme moyen (« homme ») permet d'établir le lien entre le grand terme (« mortel ») et le petit terme (« Socrate »).
La syllogistique aristotélicienne repose sur quatre types de propositions catégoriques, traditionnellement désignées par les voyelles A, E, I, O : l'affirmative universelle (« Tout S est P »), la négative universelle (« Nul S n'est P »), l'affirmative particulière (« Quelque S est P ») et la négative particulière (« Quelque S n'est P »). Ces propositions, combinées selon des règles précises, permettent d'établir quatorze modes valides de syllogisme répartis en trois figures. La tradition médiévale leur donnera des noms mnémotechniques (Barbara, Celarent, Darii, Ferio pour la première figure).
Pour Aristote, les syllogismes de la première figure sont « parfaits » (''teleioi''), car leur validité apparaît immédiatement évidente à partir des définitions mêmes des quantificateurs universels et particuliers<ref>Aristote, ''Premiers Analytiques'', I, 1, 24b22-26</ref>. Les syllogismes des deuxième et troisième figures sont « imparfaits » et doivent être réduits aux syllogismes parfaits au moyen de règles de conversion. Cette réduction assure que tous les raisonnements déductifs valides peuvent ultimement se ramener aux formes évidentes de la première figure.
== Déduction et démonstration scientifique ==
Dans les ''Seconds Analytiques'', Aristote approfondit l'analyse de la déduction en l'articulant à la théorie de la démonstration scientifique (''apodeixis'')<ref>Aristote, ''Seconds Analytiques'', I, 2, 71b9-72b4</ref>. La démonstration constitue une forme particulière de syllogisme : elle part de prémisses qui sont vraies, premières, immédiates, plus connues que la conclusion, antérieures à elle et qui en sont les causes. Cette caractérisation met en lumière une difficulté majeure : si toute connaissance démonstrative procède de prémisses antérieures, comment éviter la régression à l'infini dans la recherche des principes ?
Aristote écarte trois réponses : celle qui accepterait une régression infinie, celle qui admettrait une circularité dans les démonstrations, et celle qui postulerait des principes hypothétiques indémontrables<ref>Aristote, ''Seconds Analytiques'', I, 3, 72b5-15</ref>. Il affirme au contraire l'existence de principes immédiats, connus par une faculté intellectuelle distincte de la démonstration : l'intuition intellectuelle (''noûs''). Ces principes, qui sont les définitions et les axiomes, ne requièrent pas de démonstration et constituent le fondement ultime de toute connaissance scientifique.
Cette solution aristotélicienne au problème de la régression suscite des débats qui traversent toute l'histoire de la philosophie. Elle articule la déduction, qui procède de principes à leurs conséquences, avec l'intuition qui saisit les principes eux-mêmes. La science démonstrative se trouve ainsi ancrée dans une connaissance non démonstrative des premiers principes.
== Développements médiévaux ==
La tradition scolastique médiévale hérite de la syllogistique aristotélicienne et l'enrichit considérablement. Les logiciens du Moyen Âge, travaillant principalement sur les textes latins d'Aristote et de Boèce, raffinent l'analyse des termes, des propositions et des inférences. La logique médiévale développe notamment la théorie de la ''suppositio'' (supposition), qui étudie la manière dont les termes réfèrent à leurs objets dans différents contextes<ref>Guillaume d'Ockham, ''Summa Logicae'', I, 63-77, vers 1323</ref>.
Les discussions portent également sur le statut des universaux et sur la nature des entités logiques. La querelle des universaux oppose réalistes, comme Guillaume de Champeaux, conceptualistes, comme Abélard, et nominalistes, comme Guillaume d'Ockham. Ces débats métaphysiques ont des implications directes pour la compréhension de la déduction : si les universaux n'existent que dans l'esprit ou ne sont que des noms, quel est le fondement ontologique des inférences déductives ?
Au XIII{{exp|e}} siècle, des penseurs comme Robert Kilwardby et Albert le Grand commentent extensivement les ''Analytiques'' d'Aristote. Ils distinguent différents types de syllogismes selon leur modalité (assertorique, nécessaire, contingent) et selon leur matière. La syllogistique modale, qui traite des syllogismes dont les propositions contiennent des modalités (nécessaire, possible, contingent), fait l'objet de développements techniques considérables.
Thomas d'Aquin (1225-1274) intègre la logique aristotélicienne dans son système philosophique et théologique. Pour lui, la déduction permet de déployer les conséquences contenues virtuellement dans les principes de la foi et de la raison naturelle. La distinction entre l'ordre de la découverte (''ordo inventionis'') et l'ordre de l'enseignement (''ordo doctrinae'') met en évidence que la déduction ne constitue pas nécessairement le chemin par lequel on parvient à la connaissance, mais plutôt la manière dont on l'expose et la justifie une fois acquise<ref>Thomas d'Aquin, ''Somme théologique'', I, q. 2, a. 2</ref>. Dans son commentaire des ''Seconds Analytiques'', Thomas précise que le raisonnement déductif sert à justifier un jugement en exhibant sa cause, tandis que la découverte elle-même peut emprunter d'autres voies<ref>Thomas d'Aquin, ''Commentaire des Seconds Analytiques'', livre I, leçon 9, n° 78</ref>.
== Critique et renouvellement à l'époque moderne ==
À l'aube de la modernité, la syllogistique fait l'objet de critiques sévères. Francis Bacon (1561-1626), dans le ''Novum Organum'' (1620), reproche au syllogisme son impuissance à produire de nouvelles connaissances. Selon lui, le syllogisme ne fait que reformuler ce qui est déjà contenu dans les prémisses et s'avère donc stérile pour l'avancement des sciences<ref>Francis Bacon, ''Novum Organum'', I, aphorisme 13, 1620</ref>. Bacon propose de substituer à la logique déductive une méthode inductive qui permettrait de tirer des lois générales de l'observation méthodique des phénomènes naturels.
René Descartes (1596-1650) formule une critique similaire dans les ''Règles pour la direction de l'esprit'' (rédigées vers 1628) et le ''Discours de la méthode'' (1637). Il estime que la logique traditionnelle, bien qu'elle contienne « beaucoup de préceptes très vrais et très bons », est néanmoins « mêlée de plusieurs autres, ou nuisibles ou superflus »<ref>Descartes, ''Discours de la méthode'', deuxième partie, 1637</ref>. Plutôt que de s'en remettre aux formes syllogistiques, Descartes propose une méthode fondée sur l'intuition et la déduction, comprises comme opérations de l'esprit plus que comme structures formelles. L'intuition saisit les natures simples de manière claire et distincte, tandis que la déduction enchaîne ces intuitions selon un ordre nécessaire<ref>Descartes, ''Règles pour la direction de l'esprit'', règle III</ref>.
Dans les ''Règles'', Descartes définit l'intuition comme « une représentation qui est le fait de l'intelligence pure et attentive, représentation si facile et si distincte qu'il ne subsiste aucun doute sur ce que l'on y comprend », et la déduction comme « tout ce qui se conclut nécessairement de certaines choses connues avec certitude »<ref>Descartes, ''Règles pour la direction de l'esprit'', règle III</ref>. La déduction cartésienne ne se présente pas sous forme de propositions catégoriques mais comme un mouvement continu de la pensée qui passe d'une évidence à une autre. Elle ne cherche pas à établir la subsomption d'un cas particulier sous une règle universelle, mais à déployer l'ordre des raisons à partir des vérités les plus simples. Elle s'inscrit dans un projet de mathématisation du savoir, où la rigueur de la géométrie sert de modèle à toute connaissance certaine.
Gottfried Wilhelm Leibniz (1646-1716) poursuit et approfondit ce projet de réforme de la logique. Il conçoit le projet d'une ''characteristica universalis'', langue symbolique universelle qui permettrait de représenter toutes les pensées, et d'un ''calculus ratiocinator'', calcul formel qui permettrait de résoudre mécaniquement les questions philosophiques et scientifiques<ref>Leibniz, ''Dissertatio de arte combinatoria'', 1666</ref>. Bien que ces projets n'aient pas abouti de son vivant, ils anticipent remarquablement les développements ultérieurs de la logique formelle. Leibniz affirme que les vérités nécessaires, objets de la déduction, reposent sur le principe d'identité et le principe de non-contradiction, tandis que les vérités contingentes dépendent du principe de raison suffisante<ref>Leibniz, ''Monadologie'', §31-36, 1714</ref>.
== La révolution de la logique formelle ==
Le XIX{{exp|e}} siècle marque un tournant décisif dans l'histoire de la déduction avec l'émergence de la logique mathématique moderne. Gottlob Frege (1848-1925) publie en 1879 la ''Begriffsschrift'' (« Idéographie »), ouvrage qui pose les fondements de la logique contemporaine<ref>Frege, ''Begriffsschrift, eine der arithmetischen nachgebildete Formelsprache des reinen Denkens'', 1879</ref>. Frege y développe une notation entièrement formalisée qui permet d'exprimer les relations logiques avec une précision sans précédent. Il introduit la distinction entre fonction et argument, qui remplace l'ancienne distinction entre sujet et prédicat, ainsi que la théorie de la quantification, qui permet de traiter rigoureusement les propositions universelles et existentielles.
La logique frégéenne constitue un système axiomatique complet pour le calcul propositionnel et le calcul des prédicats du second ordre. Elle repose sur un petit nombre d'axiomes et sur deux règles d'inférence : le ''modus ponens'' (de « si p alors q » et « p », on peut déduire « q ») et la règle de substitution<ref>Frege, ''Grundgesetze der Arithmetik'', vol. I, §13-25, 1893</ref>. Ce système permet de formaliser intégralement l'arithmétique, réalisant ainsi le programme logiciste qui vise à réduire les mathématiques à la logique pure.
L'objectif de Frege dépasse la simple amélioration technique de la syllogistique aristotélicienne. Il s'agit de fournir un fondement rigoureux aux mathématiques en montrant que les vérités arithmétiques sont des vérités logiques, dérivables par pure déduction à partir de principes logiques fondamentaux. Cette entreprise suppose une réflexion approfondie sur la nature du jugement, de la vérité et de l'inférence. Frege distingue soigneusement le contenu conceptuel (''begrifflicher Inhalt'') d'une proposition, qui détermine ses conditions de vérité, de la force assertorique qui s'y attache lorsqu'on porte un jugement<ref>Frege, « Über Sinn und Bedeutung », 1892</ref>.
Le projet logiciste de Frege rencontre toutefois un obstacle majeur avec la découverte du paradoxe de Russell en 1902. Bertrand Russell montre que l'axiome V des ''Grundgesetze'', qui autorise la formation de l'extension de tout concept, conduit à une contradiction<ref>Russell, lettre à Frege du 16 juin 1902, publiée dans le volume II des ''Grundgesetze der Arithmetik'', 1903</ref>. Cette découverte met en évidence que la déduction, aussi rigoureuse soit-elle, ne garantit la vérité des conclusions que si les axiomes de départ sont eux-mêmes cohérents. Elle ouvre la voie à d'importants développements en théorie des ensembles et en théorie des types.
== Déduction naturelle et calcul des séquents ==
Au XX{{exp|e}} siècle, Gerhard Gentzen (1909-1945) propose deux nouveaux systèmes déductifs qui transforment profondément la théorie de la démonstration : la déduction naturelle et le calcul des séquents<ref>Gentzen, « Untersuchungen über das logische Schließen », ''Mathematische Zeitschrift'', vol. 39, 1934-1935, p. 176-210 et 405-431</ref>. La déduction naturelle cherche à formaliser les raisonnements tels qu'ils apparaissent dans la pratique mathématique ordinaire. Elle introduit, pour chaque connecteur logique, des règles d'introduction et d'élimination qui reflètent l'usage naturel de ces connecteurs. Par exemple, la règle d'introduction de la conjonction permet de conclure « p et q » si l'on a établi séparément « p » et « q », tandis que la règle d'élimination permet de déduire « p » (ou « q ») de « p et q ».
Le calcul des séquents, de son côté, manipule des séquents de la forme « Γ ⊢ Δ », où Γ et Δ sont des séquences de formules. Un séquent peut être interprété comme affirmant que si toutes les formules de Γ sont vraies, alors au moins une formule de Δ est vraie. Ce formalisme présente l'avantage d'une grande symétrie et facilite l'analyse structurelle des démonstrations. Gentzen démontre dans ce cadre le théorème fondamental d'élimination des coupures (''Hauptsatz''), qui établit que toute démonstration peut être transformée en une démonstration ne faisant pas appel à la règle de coupure (une forme généralisée du ''modus ponens'')<ref>Gentzen, « Untersuchungen über das logische Schließen », ''Mathematische Zeitschrift'', vol. 39, 1934-1935, p. 405-431</ref>. Ce résultat a des conséquences profondes pour la compréhension de la structure des démonstrations et pour la preuve de la cohérence de l'arithmétique.
La déduction naturelle et le calcul des séquents se sont révélés des outils puissants non seulement pour la logique classique, mais aussi pour l'étude de logiques non classiques : logique intuitionniste, logique modale, logique linéaire. Ils permettent de formuler précisément les propriétés structurelles des démonstrations et de comparer les différents systèmes logiques selon leurs caractéristiques formelles.
== Déduction, induction et abduction ==
Charles Sanders Peirce (1839-1914) propose une analyse tripartite des formes de raisonnement qui enrichit considérablement la réflexion sur la déduction. Outre la déduction et l'induction, Peirce identifie un troisième mode d'inférence qu'il nomme abduction ou rétroduction<ref>Peirce, « Deduction, Induction, and Hypothesis », ''Popular Science Monthly'', vol. 13, août 1878, p. 470-482</ref>. La déduction, selon Peirce, explicite ce qui est implicitement contenu dans les prémisses : elle va du général au particulier et garantit la vérité de la conclusion si les prémisses sont vraies. L'induction procède du particulier au général en généralisant à partir d'observations répétées. L'abduction, enfin, consiste à inférer une hypothèse explicative à partir d'un fait surprenant : elle propose la meilleure explication possible d'un phénomène observé.
Cette distinction éclaire la place respective de ces trois formes de raisonnement dans l'enquête scientifique. L'abduction génère des hypothèses nouvelles et créatives pour expliquer les phénomènes. La déduction en tire les conséquences observables, permettant ainsi de les soumettre à l'épreuve de l'expérience. L'induction évalue ces conséquences à la lumière des données empiriques et établit des généralisations probables. Ces trois opérations forment un cycle qui caractérise la démarche scientifique dans son ensemble.
Pour Peirce, la déduction possède une certitude que n'ont ni l'induction ni l'abduction. Si les prémisses d'un raisonnement déductif sont vraies, la conclusion l'est nécessairement. En revanche, l'induction et l'abduction ne fournissent que des conclusions probables ou plausibles. Cette analyse met en lumière le rôle spécifique de la déduction dans l'architecture de la connaissance : elle assure la cohérence interne d'un système de propositions et permet de déployer toutes les conséquences d'hypothèses données, mais elle ne peut par elle-même accroître notre connaissance factuelle du monde.
== Déduction et vérité analytique ==
La distinction entre vérités analytiques et vérités synthétiques, introduite par Kant dans la ''Critique de la raison pure'' (1781) et reformulée par les philosophes du Cercle de Vienne, a des implications importantes pour la compréhension de la déduction. Une vérité analytique est vraie en vertu du seul sens des termes qui la composent, indépendamment de tout fait empirique. Par exemple, « Tous les célibataires sont non mariés » est analytiquement vraie car le prédicat « non marié » fait partie du sens du sujet « célibataire ». Les vérités déductives, dans cette perspective, sont analytiques : elles ne font qu'expliciter ce qui est contenu dans les définitions et dans les axiomes logiques.
Cette conception soulève toutefois des difficultés. John Stuart Mill (1806-1873), dans son ''Système de logique'' (1843), conteste que les inférences déductives soient purement analytiques<ref>Mill, ''A System of Logic'', livre II, chap. III, 1843</ref>. Selon lui, tout syllogisme implique une pétition de principe : pour affirmer que tous les hommes sont mortels, il faut déjà savoir que Socrate est mortel. La prémisse universelle ne peut être connue que si tous ses cas d'application sont connus, de sorte que la conclusion est déjà présupposée dans les prémisses. Mill en conclut que la véritable inférence n'est pas le passage de la prémisse universelle à la conclusion particulière, mais le passage des cas observés (Pierre, Paul, Jacques sont mortels) aux cas non observés (Socrate est mortel). La déduction syllogistique ne serait qu'un mode d'exposition d'inférences qui sont, en réalité, inductives.
Cette critique millienne a suscité d'importantes discussions sur la nature de la déduction et son rôle dans l'accroissement de la connaissance. Les défenseurs de la logique déductive, comme Gottlob Frege, répondent que Mill confond l'ordre de la connaissance (l'ordre selon lequel nous parvenons à connaître les vérités) avec l'ordre de la justification (l'ordre selon lequel les vérités se fondent les unes sur les autres). Même si, psychologiquement, nous apprenons d'abord que Socrate est mortel avant de formuler la loi générale, cette loi, une fois établie, fonde logiquement les jugements particuliers qui en découlent.
Willard Van Orman Quine (1908-2000) remet en question la distinction même entre analytique et synthétique dans son article célèbre « Deux dogmes de l'empirisme » (1951)<ref>Quine, « Two Dogmas of Empiricism », ''Philosophical Review'', vol. 60, n° 1, janvier 1951, p. 20-43</ref>. Il soutient qu'il n'existe pas de critère clair pour distinguer les vérités qui sont vraies en vertu du sens et celles qui sont vraies en vertu des faits. Tout énoncé peut être maintenu comme vrai face à n'importe quelle expérience, pourvu que l'on soit prêt à effectuer suffisamment d'ajustements dans notre système de croyances. Inversement, même les vérités logiques peuvent être révisées si les avantages théoriques d'une telle révision l'emportent sur ses inconvénients. Cette thèse holistique a des conséquences pour le statut de la déduction : celle-ci n'apparaît plus comme un domaine absolument distinct et privilégié de la connaissance, mais comme un élément d'un vaste réseau de croyances qui font face collectivement au tribunal de l'expérience.
== Déduction et calculabilité ==
Le développement de la logique mathématique au XX{{exp|e}} siècle conduit à s'interroger sur les limites de la méthode déductive. Le programme de Hilbert visait à formaliser intégralement les mathématiques et à démontrer par des moyens finitistes la cohérence des systèmes axiomatiques ainsi construits. Les théorèmes de complétude et d'incomplétude de Kurt Gödel (1906-1978) apportent des réponses fondamentales à ces questions.
Le théorème de complétude (1930) établit que tout énoncé logiquement valide dans le calcul des prédicats du premier ordre est démontrable dans un système axiomatique approprié<ref>Gödel, « Die Vollständigkeit der Axiome des logischen Funktionenkalküls », ''Monatshefte für Mathematik und Physik'', vol. 37, 1930, p. 349-360</ref>. Autrement dit, les méthodes déductives disponibles suffisent à démontrer toutes les vérités logiques. Ce résultat confirme la puissance et l'adéquation du calcul des prédicats du premier ordre comme outil pour formaliser le raisonnement déductif.
En revanche, le premier théorème d'incomplétude (1931) montre qu'aucun système formel récursivement axiomatisable et cohérent ne peut démontrer toutes les vérités arithmétiques<ref>Gödel, « Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I », ''Monatshefte für Mathematik und Physik'', vol. 38, 1931, p. 173-198</ref>. Dans tout système formel suffisamment puissant pour exprimer l'arithmétique, il existe des énoncés vrais qui ne sont pas démontrables dans le système. Ce résultat met en évidence une limitation intrinsèque de la méthode déductive : il n'est pas possible de capturer la totalité de la vérité mathématique au moyen d'un ensemble fini de règles de déduction et d'axiomes.
Le second théorème d'incomplétude établit qu'un système formel cohérent et suffisamment puissant ne peut pas démontrer sa propre cohérence. Ce résultat ruine le programme de Hilbert dans sa version originale : on ne peut pas espérer démontrer la cohérence de l'arithmétique en utilisant uniquement des moyens finitistes formalisables dans l'arithmétique elle-même. Ces théorèmes ont des conséquences philosophiques considérables. Ils montrent que la déduction, bien qu'elle soit un instrument puissant et indispensable, ne peut à elle seule fonder de manière absolue l'édifice de la connaissance mathématique.
== Déduction et sémantique ==
La distinction entre syntaxe et sémantique en logique moderne éclaire d'un jour nouveau la nature de la déduction. La syntaxe étudie les relations formelles entre les symboles, indépendamment de leur signification. La démonstration, au sens syntaxique, consiste en une suite finie de formules où chaque formule est soit un axiome, soit obtenue à partir de formules antérieures par application d'une règle d'inférence. La sémantique, en revanche, étudie les relations entre les symboles et ce qu'ils dénotent. Une formule est sémantiquement valide si elle est vraie dans toutes les interprétations possibles.
Le théorème de complétude de Gödel établit la coïncidence entre démontrabilité syntaxique et validité sémantique pour le calcul des prédicats du premier ordre : une formule est démontrable si et seulement si elle est valide. Ce résultat montre que les règles de déduction capturent exactement les lois de la vérité logique. Il justifie donc l'emploi de la méthode déductive comme moyen de découvrir les vérités logiques : en appliquant mécaniquement les règles de démonstration, on peut en principe énumérer toutes les tautologies.
Cette distinction entre syntaxe et sémantique permet aussi de clarifier le statut des règles de déduction. Du point de vue syntaxique, ces règles sont de simples stipulations qui définissent quelles suites de formules comptent comme des démonstrations. Du point de vue sémantique, elles doivent être justifiées par leur capacité à préserver la vérité : si les prémisses d'une règle sont vraies dans toute interprétation, sa conclusion doit l'être également. La correction d'un système déductif (le fait que toute formule démontrable est valide) est une propriété sémantique fondamentale qui garantit la fiabilité de la méthode déductive.
== Limites et portée de la déduction ==
L'analyse philosophique de la déduction conduit à s'interroger sur sa portée épistémologique. D'une part, la déduction semble ne produire aucune connaissance réellement nouvelle : si la conclusion d'un raisonnement déductif est logiquement contenue dans les prémisses, n'est-il pas vrai que celui qui connaît les prémisses connaît déjà, au moins implicitement, la conclusion ? Cette objection, formulée par les empiristes britanniques et reprise par Mill, met en doute l'utilité cognitive de la déduction.
D'autre part, il apparaît que la déduction possède une fécondité indéniable. Les démonstrations mathématiques, qui sont paradigmatiquement déductives, permettent d'établir des théorèmes dont la vérité n'est nullement évidente à partir des axiomes. La démonstration du théorème de Pythagore, par exemple, révèle une propriété des triangles rectangles qui n'est pas immédiatement visible dans les définitions et postulats de la géométrie euclidienne. Comment concilier le caractère non amplifiant de la déduction avec sa capacité à produire des résultats surprenants et informatifs ?
Une réponse consiste à distinguer entre l'information logique et l'information psychologique. Logiquement, la conclusion d'une déduction valide n'ajoute rien aux prémisses : elle en fait explicite un contenu qui y était implicite. Psychologiquement, en revanche, la déduction peut accroître notre connaissance en rendant manifeste des conséquences que nous n'avions pas aperçues. La complexité d'une démonstration, le caractère indirect d'une preuve par l'absurde, l'utilisation de lemmes intermédiaires, tout cela contribue à faire de la déduction un instrument de découverte, non pas au sens où elle révélerait des faits nouveaux sur le monde, mais au sens où elle met au jour des relations logiques que notre esprit n'avait pas spontanément perçues.
Une autre réponse, développée notamment par les intuitionnistes, consiste à nier que la vérité d'une proposition mathématique soit indépendante de la possibilité de la démontrer. Pour L. E. J. Brouwer (1881-1966) et les constructivistes, une proposition mathématique n'est vraie que si l'on possède une construction effective qui la vérifie<ref>Brouwer, « Intuitionism and Formalism », ''Bulletin of the American Mathematical Society'', vol. 20, 1913, p. 81-96</ref>. Dans cette perspective, la déduction ne se contente pas d'expliciter ce qui était déjà vrai : elle construit effectivement la vérité de la conclusion. La démonstration n'est plus un simple véhicule qui transporte la vérité des prémisses à la conclusion ; elle est l'acte même par lequel la conclusion devient vraie.
== Déduction et intelligence artificielle ==
Les développements récents en intelligence artificielle et en informatique théorique ont renouvelé l'intérêt pour l'étude de la déduction. Les systèmes de démonstration automatique cherchent à implémenter mécaniquement les règles de la logique déductive afin de permettre à des machines de découvrir des théorèmes. Ces systèmes utilisent des méthodes comme la résolution, le chaînage avant et le chaînage arrière, qui transforment le problème de la démonstration en un problème de recherche dans un espace d'états.
L'essor des systèmes experts et des ontologies formelles montre l'importance pratique de la déduction dans la représentation des connaissances et le raisonnement automatique. Ces systèmes encodent des règles générales dans un format formel et les appliquent automatiquement à des cas particuliers pour en déduire des conclusions. Les applications vont du diagnostic médical à la planification en robotique, en passant par la vérification formelle de logiciels.
Ces développements soulèvent toutefois des questions philosophiques nouvelles. La démonstration effectuée par une machine possède-t-elle la même valeur épistémique qu'une démonstration effectuée et comprise par un être humain ? La vérification formelle d'une preuve par ordinateur peut-elle remplacer la compréhension intuitive qu'un mathématicien a de sa démonstration ? Ces questions touchent au cœur de la nature de la déduction et de sa place dans la connaissance humaine.
== Conclusion ==
La déduction, en tant que mode d'inférence nécessaire, constitue un pilier fondamental de la rationalité humaine. De la syllogistique aristotélicienne aux systèmes formels contemporains, elle n'a cessé d'être analysée, critiquée, raffinée et étendue. Les développements de la logique mathématique au XX{{exp|e}} siècle ont permis de préciser sa nature et ses limites, tout en confirmant sa centralité dans l'édifice de la connaissance scientifique et philosophique.
Cependant, la déduction ne saurait à elle seule fonder l'intégralité du savoir humain. Elle doit s'articuler avec d'autres formes de raisonnement – induction, abduction – et avec des modes de connaissance non discursifs – intuition, perception. La tension entre le caractère apparemment tautologique de la déduction et sa fécondité réelle demeure un défi pour la philosophie de la logique. De même, les limites révélées par les théorèmes de Gödel invitent à une réflexion critique sur les ambitions et les possibilités de la méthode axiomatico-déductive.
Loin d'être un instrument figé, la déduction reste un objet vivant de recherche philosophique et mathématique. Les développements en théorie de la démonstration, en théorie des types, en logique catégorielle et en théorie computationnelle de la démonstration témoignent de sa vitalité et de sa capacité à se renouveler. La question de savoir ce qu'est exactement la déduction, quelle est sa justification ultime et quelles sont ses limites intrinsèques demeure ouverte et continue d'animer la réflexion philosophique contemporaine.
== Notes ==
{{references}}
== Bibliographie ==
=== Ouvrages classiques ===
;'''Aristote'''
: ''Organon. Premiers Analytiques.'' Trad. J. Tricot, Vrin, 2002.
: ''Seconds Analytiques''. Trad. B. Saint-André, GF Flammarion, 1991.
: ''Topiques''. Trad. M. Crubellier, GF Flammarion, 2007.
;'''Thomas d'Aquin'''
: ''Commentaire des Seconds Analytiques d'Aristote''. Trad. J. Peghaire, Paris, Vrin, 1970.
;'''René Descartes'''
: ''Règles pour la direction de l'esprit'' (1628). In : ''Œuvres philosophiques'', éd. F. Alquié, Gallimard, Bibliothèque de la Pléiade, 1966.
: ''Discours de la méthode'' (1637), édition GF, Paris : Flammarion, 2000.
;'''Francis Bacon'''
: ''Novum Organum'' (1620). Trad. M. Malherbe & J.-M. Pousseur, PUF, 1986.
;'''Gottfried Wilhelm Leibniz'''
: ''Dissertatio de arte combinatoria'' (1666), trad. F. de Careil, Paris, 1859.
: ''Monadologie'' (1714), trad. P. Schrecker, GF Flammarion, 1988.
;'''John Stuart Mill'''
: ''A System of Logic, Ratiocinative and Inductive'', 1843. Oxford University Press, 1973.
;'''Gottlob Frege'''
: ''Begriffsschrift'' (1879), trad. J.-M. Chevalier, Vrin, 1994.
: ''Les fondements de l'arithmétique'' (''Die Grundlagen der Arithmetik'', 1884), trad. C. Imbert, Seuil, 1969.
: ''Grundgesetze der Arithmetik'' (vol. I, 1893 ; vol. II, 1903).
;'''Bertrand Russell'''
: ''Principia Mathematica'' (avec A.N. Whitehead), Cambridge University Press, 1910–1913.
: ''Lettre à Frege'', 16 juin 1902, publiée dans ''Grundgesetze der Arithmetik'' vol. II, 1903.
;'''Gerhard Gentzen'''
: « Untersuchungen über das logische Schließen », ''Mathematische Zeitschrift'', vol. 39, 1934–1935.
;'''Kurt Gödel'''
: « Die Vollständigkeit der Axiome des logischen Funktionenkalküls », ''Monatshefte für Mathematik und Physik'', vol. 37, 1930, p. 349–360.
: « Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I », ''Monatshefte für Mathematik und Physik'', vol. 38, 1931, p. 173–198.
;'''Charles Sanders Peirce'''
: ''The Collected Papers'', vols. 1–8, Harvard University Press, 1931–1958.
: « Deduction, Induction, and Hypothesis », ''Popular Science Monthly'', vol. 13, août 1878, p. 470–482.
;'''L. E. J. Brouwer'''
: « Intuitionism and Formalism », ''Bulletin of the American Mathematical Society'', vol. 20, 1913, p. 81–96.
;'''Immanuel Kant'''
: ''Critique de la raison pure'', trad. A. Tremesaygues & B. Pacaud, PUF, 2007.
;'''Willard Van Orman Quine'''
: « Two Dogmas of Empiricism », ''The Philosophical Review'', vol. 60, n° 1, janvier 1951, p. 20–43.
=== Manuels universitaires et encyclopédies ===
* S. S. Shapiro (éd.), ''The Oxford Handbook of Philosophy of Mathematics and Logic'', Oxford University Press, 2005.
* J. Hintikka, ''Logic, Language-Games and Information: Kantian Themes in the Philosophy of Logic'', Oxford University Press, 1973.
* J. van Heijenoort (éd.), ''From Frege to Gödel: A Source Book in Mathematical Logic, 1879–1931'', Harvard University Press, 1967.
* G. Priest, ''An Introduction to Non-Classical Logic: From If to Is'', Cambridge University Press, 2008.
* S. Read, ''Thinking about Logic: An Introduction to the Philosophy of Logic'', Oxford University Press, 1995.
* M. Cresswell, ''Logic and Language'', Routledge, 2000.
* ''Encyclopédie philosophique universelle'', PUF, article « Déduction », vol. II, 1998.
* ''Stanford Encyclopedia of Philosophy'', articles « Deductive and Inductive Arguments », « Syllogism », « Gentzen's Natural Deduction ». [https://plato.stanford.edu/ En ligne]
* ''Internet Encyclopedia of Philosophy'', article « Logic ». [https://iep.utm.edu/ En ligne]
* ''Encyclopédie de la philosophie'' (Pochothèques), Paris, Le Livre de Poche, 2011, articles « Déduction », « Syllogisme », « Gentzen », « Gödel ».
=== Études critiques et monographies ===
* J.-Y. Béziau (dir.), ''La logique aujourd'hui'', Paris : CNRS éditions, 2014.
* M. Fitting, ''First-order Logic and Automated Theorem Proving'', Springer, 1996.
* S. Feferman et al., ''Proof Theory: An Historical Survey'', North-Holland, 1997.
* J.-L. Gardies, ''Logique et philosophie des sciences'', Presses Universitaires de France, 1997.
* T. Smiley, « Syllogism and Quantification », ''The Journal of Symbolic Logic'', vol. 28, n° 2, 1963, p. 113–134.
* G. Restall, ''Logic: An Introduction'', Routledge, 2006.
* J. Dubucs & M. Marion (éd.), ''Déduction et induction'', Presses Universitaires de Lille, 1998.
* J. Seoane & A. Aja Sanchez (éd.), ''Aristotelian Logic and the Laws of Thought'', Georg Olms, 2011.
* L. Haaparanta (éd.), ''The Development of Modern Logic'', Oxford University Press, 2009.
=== Approches historiques et comparatives ===
* Y. Iwakuma & C. Posy (éd.), ''Logic in China'', Kluwer, 1994.
* S. Ranganathan, ''Indian Logic: A Primer'', Routledge, 2023.
* J.-M. Vienne & J. Dubucs (dir.), ''Logique : histoire, mathématiques, philosophie'', CNRS Éditions, 1994.
* J. Marenbon (éd.), ''The Oxford Handbook of Medieval Philosophy'', Oxford University Press, 2012.
* P. R. Anstey (éd.), ''The Oxford Handbook of British Philosophy in the Seventeenth Century'', Oxford University Press, 2013.
=== Logique formelle contemporaine ===
* B. Linsky, ''The Evolution of Principia Mathematica: Bertrand Russell's Manuscripts and Notes for the Second Edition'', Cambridge University Press, 2011.
* M. Detlefsen (éd.), ''Proof, Logic and Formalization'', Routledge, 1992.
* D. Prawitz, ''Natural Deduction: A Proof-Theoretical Study'', Dover, 2006.
* J.-Y. Girard, « Proof Theory and the Dialectic of Logic », ''Annals of Pure and Applied Logic'', vol. 76, n° 3, 1995, p. 223–261.
* G. E. Takeuti, ''Proof Theory'', Dover, 1987.
* S. Negri & J. von Plato, ''Structural Proof Theory'', Cambridge University Press, 2001.
=== Articles et contributions spécialisées ===
* R. D. Luce, « Deduction, Induction and Implication », ''Philosophy of Science'', vol. 21, n° 4, 1954, p. 263–273.
* C. Lejewski, « Aristotle's Syllogistic and its Extensions », in ''The Encyclopedia of Philosophy'', Macmillan, 1967, vol. 8, p. 32–46.
* J. Corcoran, « Completeness of an Ancient Logic », ''The Journal of Symbolic Logic'', vol. 37, n° 4, 1972, p. 696–702.
* D. Edgley, « Deductive Knowledge and Belief », ''Philosophy of Science'', vol. 29, n° 3, 1962, p. 254–264.
* M. Sainsbury, ''Logical Forms: An Introduction to Philosophical Logic'', Blackwell, 2000.
=== Pour approfondissements spécialisés ===
* I. Angelelli, ''Studies on Gottlob Frege and Traditional Philosophy'', Reidel, 1967.
* T. W. Bynum (éd.), ''Dictionary of the Exact Sciences'', Cornell University Press, 2002.
* P. Hacker, ''Insight and Illusion: Themes in the Philosophy of Wittgenstein'', Oxford University Press, 1986.
* H. Scholz, ''Esquisse d'une histoire de la logique'', trad. P. Devaux, Payot, 1968.
=== Ressources en ligne ===
* [https://plato.stanford.edu/ Stanford Encyclopedia of Philosophy]
* [https://iep.utm.edu/ Internet Encyclopedia of Philosophy]
* [https://encyclo-philo.fr/ Encyclopédie philosophique]
== Voir aussi ==
* [[Induction]]
* {{Page|Abduction}}
* [[Syllogisme]]
* [[Logique]]
* [[Démonstration]]
* [[Vérité]]
* [[Raisonnement]]
{{AutoCat}}
nvs4x7mhh2pokaulwm5rjv0ixsjdtzq
Dictionnaire de philosophie/Q
0
83952
768273
767979
2026-06-22T03:21:58Z
PandaMystique
119061
768273
wikitext
text/x-wiki
{{DicoPhilo|Q}}
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;">
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:Quadrivium
:Qualia
:Qualité
:Quantification
:Quantité
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:Querelle des universaux
:Question
:Quiddité
:Quiétisme
</div>
<div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);">
:Quiétude
:[[Dictionnaire de philosophie/Willard Van Orman Quine|W.V.O. Quine]]
:Quintessence
:Quotidienneté
</div>
</div>
{{PhiloRecherche}}
{{autocat}}
jnswba987vsfvxdqtuwr9aqnrd5eyds
Dictionnaire de philosophie/Willard Van Orman Quine
0
83958
768247
2026-06-21T13:45:54Z
PandaMystique
119061
Page créée avec « {{DicoPhilo|Willard Van Orman Quine}} [[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]] Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme log... »
768247
wikitext
text/x-wiki
{{DicoPhilo|Willard Van Orman Quine}}
[[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]]
Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme logique lui-même les outils qu'il en avait reçus. Son nom reste attaché à quelques gestes critiques qui ont reconfiguré la discipline : la mise en cause de la distinction entre vérités analytiques et vérités synthétiques, l'abandon de l'idée d'une [[Dictionnaire de philosophie/Métaphysique|philosophie première]] antérieure à la science, et la thèse, longtemps reçue comme un paradoxe, selon laquelle la traduction d'une langue dans une autre demeure indéterminée. À ces gestes critiques répond une construction patiente : un naturalisme qui range l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] parmi les sciences de la nature, une conception holiste de la [[Dictionnaire de philosophie/Connaissance|connaissance]] où nos énoncés ne se mesurent pas isolément à l'expérience, mais à l'intérieur d'ensembles théoriques plus ou moins vastes, et un critère précis pour décider de ce qu'une théorie tient pour existant.
Quine écrit une prose dense, ironique, parsemée de formules qui se retiennent : « Être, c'est être la valeur d'une variable liée », « pas d'entité sans identité », « aucun énoncé n'est à l'abri d'une révision ». Cette élégance n'est pas un ornement. Elle traduit une exigence constante d'économie : se contenter des hypothèses les moins nombreuses et les plus claires qui suffisent à la tâche, comme un cartographe qui ne retient d'un territoire que les traits utiles au voyageur. Ce goût de la sobriété, Quine l'avouait volontiers en parlant de sa préférence pour « les paysages désertiques » : un monde ontologiquement maigre, mais net.
== Repères biographiques ==
=== Akron, Oberlin et la découverte de la logique ===
Quine naît le 25 juin 1908 à Akron, dans l'Ohio. Au lycée, il choisit la filière scientifique, manifeste un don pour les mathématiques, gagne un concours de poésie et, plusieurs étés de suite, dessine et vend des cartes des environs. Ce plaisir des cartes et cette passion du voyage ne le quitteront pas : des décennies plus tard, il rédigera pour la ''New York Review of Books'' des recensions d'atlas, et son ami Burton Dreben, devant le nombre de lieux mentionnés dans son autobiographie, suggérera de l'intituler non ''The Time of My Life'' mais « un camion de déménagement ». La lecture d{{'}}''Eureka'' d'Edgar Poe, qui transmet l'ivresse de comprendre l'univers, compte parmi ses premières émotions philosophiques, en même temps qu'un scepticisme précoce en matière religieuse. La dernière année de lycée éveille un intérêt durable pour le langage, la grammaire et l'étymologie.
Entré à l'Oberlin College en 1926, il hésite entre les mathématiques, la philosophie et les lettres classiques. Un compagnon de poker lui apprend qu'un certain Bertrand Russell aurait une « philosophie mathématique ». Quine y voit le moyen de réunir deux de ses penchants : il choisit les mathématiques, complétées par des lectures dirigées en philosophie des mathématiques. Personne, à Oberlin, ne connaît alors les travaux récents de Frege, de Russell ou de Whitehead ; son directeur lui compose, avec une aide extérieure, une liste de lectures qui inclut les ''Principia Mathematica'' de Whitehead et Russell. En 1929, son mémoire de fin d'études généralise une formule empruntée à Couturat et la démontre dans le formalisme strict des ''Principia''. Sa première publication savante, un compte rendu de l'ouvrage de Nicod sur les fondements de la géométrie et de l'induction, paraît dans l{{'}}''American Mathematical Monthly''.
=== Harvard et la renaissance européenne ===
[[Fichier:Russell1907-2.jpg|vignette|upright=1|Bertrand Russell vers 1907. Sa venue à Harvard en 1931 fut, selon Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell joua dans son œuvre le rôle d'un rival admiré dont les thèses appelaient des solutions de rechange.]]
Quine choisit Harvard pour ses études doctorales, parce que son département de philosophie est alors le plus fort en logique du pays : on y trouve Alfred North Whitehead, le coauteur des ''Principia''. Il y soutient en deux ans une thèse intitulée « The Logic of Sequences: A Generalization of Principia Mathematica ». Une préoccupation y affleure déjà, qui ne le quittera plus : celle de l'ontologie, de la question de savoir ce qu'il y a. Là où les ''Principia'' admettent des fonctions propositionnelles, c'est-à-dire des propriétés, donc des entités intensionnelles, Quine cherche à parvenir aux mêmes fins avec des objets extensionnels comme les classes. La même année 1931, Russell vient donner une conférence à Harvard : ce sera, dira Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell restera une présence centrale, à la manière d'un rival dont les positions appellent des solutions de rechange plus acceptables.
Vient ensuite ce que Quine nomme sa renaissance en Europe centrale. Titulaire en 1932-1933 d'une bourse de voyage, il séjourne à Vienne, à Prague et à Varsovie. À Vienne, il assiste aux réunions du Cercle de Vienne et fait la connaissance de Neurath, de [[Dictionnaire de philosophie/Moritz Schlick|Schlick]], de Gödel, de Hahn et de Menger. À Prague, il rencontre Rudolf Carnap, suit ses cours et lit en tapuscrit allemand sa ''Syntaxe logique du langage''. Carnap deviendra une influence aussi forte que Russell, et le débat qui les opposera durant des décennies comptera parmi les échanges majeurs du siècle. À Varsovie, Quine suit les leçons de Lesniewski, de Lukasiewicz et de Tarski, et noue avec l'école polonaise une sympathie durable pour son extensionnalisme et son parcimonie ontologique. Il décrira ces semaines de Prague et de Varsovie comme « les mois les plus enrichissants » qu'il ait connus.
=== Le professeur de Harvard ===
De retour à Harvard en 1933, Quine est élu Junior Fellow de la Society of Fellows, ce qui le libère de toute charge d'enseignement pendant trois ans. C'est dans cette période qu'il met au point trois de ses positions distinctives : sa conception de l'engagement ontologique, ses systèmes de logique les plus connus, dont les « New Foundations for Mathematical Logic » de 1937, et la première phase de sa critique de la vérité dite analytique, esquissée dans « Truth by Convention » (1936). Son behaviorisme, soit dit en passant, ne date pas de sa fréquentation de B. F. Skinner, autre Junior Fellow, mais de ses lectures de Watson au temps du collège.
Sa facilité pour les langues se manifeste en 1942 : alors qu'il s'est déjà porté volontaire pour la marine, Quine ajourne son engagement afin d'enseigner quatre mois durant à São Paulo, en portugais, langue dont il avait pris les rudiments aux Açores, et il tire de ces leçons un manuel de logique rédigé dans cette langue. Il sert ensuite plus de trois ans dans la marine des États-Unis, où il travaille au déchiffrement des communications des sous-marins allemands et atteint le grade de capitaine de corvette. Professeur titulaire à Harvard à partir de 1948, puis titulaire de la chaire Edgar Pierce de philosophie, il y enseignera jusqu'à sa retraite, en 1978. Ses textes les plus discutés s'échelonnent sur ces décennies : « De ce qui est » (1948), « Deux dogmes de l'empirisme » (1951), le recueil ''Du point de vue logique'' (1953), puis l'ouvrage qui condense sa philosophie, ''Le mot et la chose'' (1960). Suivront « La relativité de l'ontologie » (1968) et « L'épistémologie naturalisée » (1969). La retraite ne ralentit ni sa production ni son influence : il publie encore ''Theories and Things'' (1981), son autobiographie ''The Time of My Life'' (1985), le dictionnaire ''Quiddités'' (1987), ''La poursuite de la vérité'' (1990) et ''From Stimulus to Science'' (1995). Il meurt le 25 décembre 2000.
== L'héritage de l'empirisme logique ==
On comprend mal Quine si on ne le situe pas dans la tradition qu'il prolonge et conteste à la fois. Cette tradition est celle de l'empirisme logique, né de la rencontre entre la nouvelle logique de Frege et de Russell et le programme du Cercle de Vienne. Carnap en avait donné l'exposé le plus soigné, autour de trois thèses. La première est le critère de vérifiabilité : une phrase n'a de signification empirique que si l'on peut indiquer les observations qui la confirmeraient ou l'infirmeraient. La deuxième fait du savoir a priori, celui des mathématiques et de la logique, un savoir purement linguistique : ces vérités seraient vraies en vertu des seules conventions de notre langage, non de quelque fait du monde. La troisième tient la métaphysique pour dépourvue de sens, simple jeu de mots sans portée cognitive. Ce résumé en trois points est une commodité d'exposition, non un portrait figé : la pensée de Carnap se déplace beaucoup, de l{{'}}''Aufbau'' à la syntaxe logique, puis à la sémantique et au principe de tolérance, et c'est avec chacune de ces étapes que Quine dialogue.
Quine partage le point de départ empiriste : toute la matière probante de la science est sensorielle, et l'apprentissage des mots repose en dernière instance sur l'expérience. Mais il va soumettre chacune des trois thèses à un examen qui en démonte les ressorts. Le réductionnisme attaché au critère de vérifiabilité supposait que chaque énoncé possède, pris isolément, un contenu empirique propre ; Quine y opposera le holisme. L'idée d'une vérité purement analytique, qui isolait le linguistique du factuel, lui paraîtra reposer sur un cercle. Quant à la métaphysique, Quine ne la réhabilite pas sous sa forme classique, mais il refuse qu'on tranche d'un trait les questions d'existence : la question « qu'y a-t-il ? » est pour lui sur le même plan que les questions de la science naturelle. Ce que Carnap croyait pouvoir séparer, Quine le tient pour un continuum. Tel est le ressort de son œuvre : un empirisme qui se retourne sur ses propres présupposés et en abandonne les deux dogmes.
== Qu'est-ce qui existe ? L'engagement ontologique ==
=== La barbe de Platon ===
« Qu'y a-t-il ? » Le problème de l'ontologie, observe Quine au seuil de « De ce qui est »<ref>W. V. O. Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', trad. sous la dir. de Sandra Laugier, Paris, Vrin, 2003 (éd. originale ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953). La « barbe de Platon » et l'énigme du non-être ouvrent l'essai (''From a Logical Point of View'', ci-après ''FLPV'', p. 2) ; le débat avec Wyman et le « bidonville des possibles » figurent p. 4.</ref>, a ceci de curieux qu'il s'énonce en trois mots et se résout en un seul : il y a tout ce qu'il y a. Chacun l'accordera. Le désaccord ne porte jamais sur cette formule vide, mais sur les cas. Or les cas suscitent une difficulté logique que Quine met en scène par une petite comédie philosophique. Supposons que deux penseurs, qu'il nomme McX et lui-même, divergent sur l'[[Dictionnaire de philosophie/Existence|existence]] de quelque chose. McX affirme qu'il y a une certaine entité ; Quine le nie. Comment Quine peut-il seulement formuler son désaccord ? S'il dit « il y a une chose que McX admet et que je rejette », il se contredit, car il vient d'admettre l'existence de ce qu'il prétendait refuser. Le partisan du non semble condamné à ne pouvoir dire ce qu'il nie.
C'est l'antique énigme du non-être : le non-être doit en quelque façon être, sinon qu'est-ce donc qui n'est pas ? Quine surnomme cette doctrine enchevêtrée « la barbe de Platon », tant elle a, dit-il, émoussé le rasoir d'Occam. Elle pousse certains à conférer une forme d'être à ce qui n'en a aucune. Prenons Pégase. Si Pégase n'était rien, raisonne McX, nous ne parlerions de rien en prononçant ce nom, et il serait absurde de dire même que Pégase n'est pas ; donc Pégase, en un sens, est. Pressé d'en dire davantage, McX se réfugie dans l'idée que Pégase est « une idée dans les esprits ». Mais c'est confondre le Parthénon avec l'idée du Parthénon. Le Parthénon est de pierre, visible ; l'idée du Parthénon est mentale, invisible. Nul ne les confond. Quand nous nions Pégase, ce n'est pas une image mentale que nous nions, c'est un cheval ailé de chair et de sang dont nous disons qu'il n'existe nulle part.
Un esprit plus subtil, que Quine appelle Wyman, soutient que Pégase « subsiste » comme un possible non actualisé. Dire que Pégase n'existe pas reviendrait seulement à dire qu'il n'a pas l'attribut d'actualité, comme on dirait que le Parthénon n'est pas rouge. Cette manœuvre peuple l'univers d'une foule d'êtres fantomatiques. Quine en montre l'incohérence par une série de questions désopilantes. Combien d'hommes possibles se tiennent dans cette embrasure de porte ? Le gros possible et le chauve possible sont-ils le même, ou deux ? Y a-t-il plus de minces possibles que de gros ? Sont-ils tous distincts, ou bien deux choses qui se ressemblent en tout ne font-elles qu'une ? À ces possibles inactuels, on ne sait même pas appliquer la notion d'identité. Et que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ? Le « bidonville des possibles » est, conclut Quine, un foyer d'éléments désordonnés. Mieux vaut le raser.
=== La leçon de Russell : décrire au lieu de nommer ===
La sortie de cette impasse, Quine la trouve dans la théorie russellienne des descriptions définies, qu'il tient pour un modèle d'analyse. Le piège tenait à ce que nous traitions « Pégase » comme un nom, un terme qui, pour avoir un sens, devrait désigner un objet. Russell avait montré comment se passer de cette supposition. Au lieu de « Pégase n'existe pas », qui paraît présupposer Pégase, paraphrasons : « il n'existe rien qui soit à la fois ailé, chevalin et unique en son genre. » L'énoncé devient une quantification existentielle niée : il n'y a aucun x tel que x soit Pégase. Le nom embarrassant a disparu, dissous dans un jeu de variables et de quantificateurs ; et il ne reste plus, pour porter un poids ontologique, que ce sur quoi nous quantifions. La phrase peut être fausse, c'est-à-dire nier l'existence de quelque chose, sans présupposer cette existence. L'énigme du non-être s'évanouit avec la grammaire qui l'avait engendrée.
De là résulte un déplacement capital. Ce ne sont pas les noms qui engagent une théorie à l'existence de quoi que ce soit, car tout nom peut être analysé à la façon de « Pégase ». Le poids ontologique se concentre dans les variables liées par les quantificateurs « il existe un… » et « pour tout… ». Dire « il existe quelque chose qui est un chien » suffit à s'engager sur les chiens, sans qu'on ait à les nommer. C'est pourquoi Quine peut soutenir que la prédication, plus que la dénomination, fait le fond de la référence : un prédicat comme « est humain » s'applique à Socrate, à Platon, à d'autres, et ce sont là précisément les valeurs que doivent prendre les variables pour que les énoncés où figure ce prédicat soient vrais.
=== « Être, c'est être la valeur d'une variable liée » ===
De ce constat naît le critère de l'engagement ontologique, ramassé dans une formule devenue célèbre : « Être, c'est être la valeur d'une variable liée. »<ref>La formule « être, c'est être la valeur d'une variable » (« To be is to be the value of a variable ») se trouve dans « De ce qui est » (''FLPV'', p. 15).</ref> L'univers des entités, écrit Quine, est l'étendue des valeurs des variables. Pour savoir à quels objets une théorie s'engage, il ne faut pas examiner les noms ni les prédicats qu'elle emploie, mais demander quelles entités doivent figurer parmi les valeurs de ses variables pour que ses énoncés soient vrais. Une variable, suggère-t-il par une image éclairante, est une sorte de pronom : « x » fonctionne comme le « il » d'une langue, terme provisoirement indéterminé qui attend, dans le champ d'un quantificateur, de se voir attribuer des valeurs.
Ce critère a une vertu de clarté. Il transforme une question métaphysique notoirement floue, « qu'est-ce qui existe ? », en une question précise sur la forme logique de nos théories, « sur quoi cette théorie quantifie-t-elle ? ». Encore faut-il, pour le mettre en œuvre, disposer d'une langue régimentée. Une phrase du langage ordinaire est souvent trop équivoque pour qu'on lise à même elle ses présuppositions. Quine propose donc de la reformuler dans une notation canonique : celle de la logique des prédicats du premier ordre, avec ses variables, ses quantificateurs et ses fonctions de vérité. Cette régimentation n'est pas une description de la langue naturelle, mais une réforme, entreprise au nom de la clarté et de l'économie. Une fois la théorie ainsi mise au net, ses engagements se lisent à livre ouvert : ce sont les objets sur lesquels portent ses variables liées. Il importe de ne pas se méprendre sur la portée de ce critère. Il ne tranche pas, par lui-même, ce qui existe ; il dit seulement à quoi une théorie s'engage lorsqu'on la tient pour vraie et qu'on l'a reformulée en langue logique. Le critère n'est pas un oracle métaphysique, mais une méthode pour lire les engagements d'une théorie déjà admise ou mise à l'examen. Reste ensuite la question, distincte, de savoir quelle théorie nous avons les meilleures raisons d'accepter.
Reste à savoir ce que Quine, pour sa part, accepte d'inscrire à l'inventaire du monde. Sa réponse penche vers la sobriété : des objets physiques, entendus largement comme les contenus matériels de régions de l'espace-temps, fussent-elles discontinues, et, parce que la science, et en particulier les mathématiques, ne peut s'en passer, des classes, c'est-à-dire des ensembles, admis pour leur puissance théorique autant que pour la netteté de leurs critères d'identité. Les premiers fournissent l'ameublement concret ; les secondes, l'ossature abstraite sans laquelle on ne peut formuler les lois quantitatives de la physique. Quine résiste en revanche aux propriétés, aux significations et aux propositions, qu'il tient pour des entités intensionnelles mal individuées. Sa raison est toujours la même, et elle a valeur de maxime : « pas d'entité sans identité. »<ref>La maxime « pas d'entité sans identité » (« No entity without identity ») est formulée dans « Parler d'objets » (« Speaking of Objects »), repris dans ''Relativité de l'ontologie et autres essais'', trad. Jean Largeault, Paris, Aubier-Montaigne, 1977 (''Ontological Relativity and Other Essays'', ci-après ''OR'', New York, Columbia University Press, 1969, p. 23).</ref> Une entité n'est admissible que si l'on peut dire à quelle condition elle est identique à une autre ou en diffère. Les classes satisfont à cette exigence, car deux classes sont identiques si et seulement si elles ont les mêmes éléments. Les propriétés n'y satisfont pas : nul critère ne dit quand « avoir un cœur » et « avoir des reins », vrais des mêmes êtres, expriment une seule propriété ou deux. Faute d'identité, point d'entité ; et c'est tout un pan de l'ontologie traditionnelle qui se trouve congédié au nom de cette discipline.
== Les deux dogmes de l'empirisme ==
Paru en 1951, « Deux dogmes de l'empirisme » est sans doute l'un des articles les plus lus et les plus discutés de la philosophie analytique.<ref>W. V. O. Quine, « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', éd. citée (« Two Dogmas of Empiricism », ''FLPV'', p. 20-46). L'article parut d'abord dans ''The Philosophical Review'' en janvier 1951.</ref> Quine y dénonce deux croyances que l'empirisme moderne partageait sans les interroger : la distinction entre énoncés analytiques et énoncés synthétiques, et le réductionnisme, c'est-à-dire l'idée que chaque énoncé, pris à part, possède un contenu empirique propre. Ces deux dogmes, montre-t-il, sont liés à la racine, et leur abandon transforme la figure de l'empirisme.
=== Le premier dogme : la distinction analytique et synthétique ===
L'opposition vient de loin. Kant distinguait les jugements analytiques, où le concept du prédicat est déjà contenu dans celui du sujet (« tous les corps sont étendus »), des jugements synthétiques, qui ajoutent au sujet une information nouvelle (« tous les corps sont pesants »). Les empiristes logiques avaient repris la distinction sous une forme linguistique : est analytique l'énoncé vrai en vertu des seules significations des mots qui le composent, indépendamment de tout fait du monde. « Aucun célibataire n'est marié » serait de ce type : il suffit de comprendre les mots pour en reconnaître la vérité. Cette catégorie était précieuse, car elle offrait un asile aux vérités de la logique et des mathématiques. Si ces vérités sont analytiques, on peut les tenir pour certaines et nécessaires sans renoncer au principe empiriste selon lequel tout savoir procède de l'expérience : elles ne disent rien sur le monde, elles explicitent notre langage.
Quine ne conteste pas qu'il existe des énoncés que tout le monde range spontanément du côté de l'analytique. Il conteste qu'on puisse rendre cette notion claire. Sa stratégie consiste à demander qu'on lui explique « analytique » sans tourner en rond. Une première classe d'énoncés analytiques, les vérités logiques au sens strict comme « aucun homme non marié n'est marié », ne pose pas de problème : elles restent vraies sous toute réinterprétation de leurs termes non logiques. La difficulté commence avec la seconde classe, celle de « aucun célibataire n'est marié », qui ne devient une vérité logique que si l'on remplace « célibataire » par son synonyme « homme non marié ». Tout repose alors sur la notion de synonymie, c'est-à-dire d'identité de signification. Or qu'est-ce que la synonymie ? Si l'on répond qu'elle se fonde sur les définitions, Quine objecte que les définitions du dictionnaire ne font que consigner des synonymies déjà admises : le lexicographe rapporte un usage, il ne le crée pas, sauf dans le cas particulier de la stipulation explicite. Si l'on répond que deux termes sont synonymes lorsqu'ils sont interchangeables partout sans changer la valeur de vérité, Quine montre que ce critère, dans un langage extensionnel, ne garantit que la coextensivité, non l'identité de signification ; et que, pour exclure les coïncidences accidentelles, on doit faire appel à une notion de nécessité, laquelle reconduit en sous-main à l'analyticité que l'on cherchait à définir. Le cercle se referme : analyticité, synonymie, définition, nécessité forment une famille de notions qui se renvoient les unes aux autres sans qu'aucune prenne pied hors du cercle.
On objectera qu'il suffit de poser des règles sémantiques, comme le proposait Carnap, qui spécifieraient pour un langage donné quels énoncés y sont analytiques. Quine répond que cela déplace la difficulté sans la résoudre. Une liste de règles nous apprend quels énoncés sont appelés analytiques dans tel langage artificiel ; elle ne nous apprend pas ce que signifie le mot « analytique » lui-même, ce que ces énoncés ont en commun qui justifierait l'étiquette. On nous explique « analytique-dans-le-langage-L », pour un L particulier, mais non l'adjectif « analytique » en général, qui seul nous intéresse. La notion demeure, selon le mot de Quine, un article de foi métaphysique au cœur même de l'empirisme.
Il faut se garder, sur ce point, d'une lecture trop tranchée. Quine ne nie pas qu'il existe des énoncés que l'usage range du côté de l'analytique, ni qu'on puisse, dans un langage construit, fixer par convention quels énoncés y seront tenus pour tels. Le Quine tardif va plus loin : dans ''Les racines de la référence'' (1974), il propose même un critère comportemental de l'analyticité, un énoncé étant analytique lorsque tout locuteur en apprend la vérité en même temps qu'il apprend les mots qui le composent. Selon ce critère, « aucun célibataire n'est marié » et l'essentiel de la logique élémentaire ressortissent bien à l'analytique. Ce que Quine combat n'est donc ni l'analyticité ordinaire ni l'analyticité réglée d'un langage formel, mais une troisième notion, plus ambitieuse : celle qui prétendrait fonder en raison la nécessité des mathématiques et tracer entre l'a priori et l'empirique la frontière étanche dont Carnap avait besoin. Cette analyticité forte, son critère ne la livre pas, car les mathématiques n'en relèvent pas. C'est elle, et elle seule, que « Deux dogmes » entreprend de dissoudre.<ref>Sur le critère tardif de l'analyticité, voir W. V. O. Quine, ''The Roots of Reference'', La Salle, Open Court, 1974, p. 78-80 (ouvrage non traduit en français), et l'analyse de Richard Creath, « Quine on the Intelligibility and Relevance of Analyticity », dans ''The Cambridge Companion to Quine'', éd. citée, p. 47-64.</ref>
=== Le second dogme : le réductionnisme ===
Le second dogme est le réductionnisme, sous sa forme moderne : la croyance que tout énoncé doué de sens est traduisible en un énoncé portant sur l'expérience immédiate, ou du moins qu'à chaque énoncé est associé un domaine d'expériences qui le confirmeraient et un autre qui l'infirmeraient. C'est la version de la théorie vérificationniste de la signification qui rattache le contenu d'une phrase aux observations qui la vérifient. Quine fait observer que ce dogme est le pendant du premier. Car si chaque énoncé avait son contenu empirique propre, on pourrait définir l'analyticité comme le cas limite : serait analytique l'énoncé dont le contenu empirique est vide, qui se confirme quoi qu'il arrive. Les deux dogmes sont, dit-il, identiques à la racine.
Or le réductionnisme ne résiste pas à l'examen. Quine y oppose un argument qu'il emprunte au physicien et historien des sciences Pierre Duhem : on ne peut pas soumettre à l'expérience une hypothèse isolée. Quand une prédiction tirée d'une théorie se trouve démentie, l'expérience ne nous dit pas quel énoncé est en faute. Elle frappe la théorie comme un tout, et c'est à nous de répartir le blâme. Nous pouvons abandonner l'hypothèse mise à l'épreuve, mais nous pouvons aussi mettre en cause une loi auxiliaire, une condition initiale, un principe de l'instrument de mesure, voire, en dernier recours, une règle de la logique. Aucun énoncé ne se présente seul devant le tribunal de l'expérience. Il n'y a donc pas de contenu empirique attaché à l'énoncé pris isolément ; ce contenu n'appartient qu'à des ensembles d'énoncés, et, à la limite, à la science tout entière. L'unité de signification empirique n'est pas la phrase, mais le système. Voilà qui prive le réductionnisme de son objet et, du même coup, ruine l'espoir de définir l'analyticité comme degré zéro du contenu empirique. En tombant, le second dogme entraîne le premier.
== Le holisme et la révision des croyances ==
Une fois les deux dogmes écartés, l'empirisme prend un autre visage, que Quine peint dans la dernière partie de « Deux dogmes » à l'aide d'une image souvent reprise. La totalité de notre savoir, des vérités les plus quotidiennes de la géographie aux lois de la physique atomique et jusqu'aux théorèmes de la logique, forme un tissu fait de main d'homme qui ne touche l'expérience que par ses bords. Ou, pour changer de figure, la science tout entière est comme un champ de forces dont les conditions aux limites sont l'expérience. Un conflit avec l'expérience, à la périphérie, oblige à des réajustements à l'intérieur du champ : il faut redistribuer des valeurs de vérité sur certains de nos énoncés. Mais le champ est si lâchement déterminé par ses bords que nous gardons une large latitude quant aux énoncés à réviser à la lumière d'une expérience contraire donnée. Aucune expérience particulière n'est liée à un énoncé particulier de l'intérieur du champ, sinon de façon indirecte, par les exigences d'équilibre qui affectent le champ comme un tout.<ref>« Deux dogmes de l'empirisme », sixième section, « L'empirisme sans les dogmes » : le « tissu fait de main d'homme » et le « champ de forces » sont décrits p. 42, « aucun énoncé n'est à l'abri d'une révision » p. 43, les « dieux d'Homère » p. 44 et le « pragmatisme plus poussé » p. 46 (''FLPV'', éd. citée).</ref>
De cette image se déduisent les deux formules les plus frappantes de l'article. Premièrement : tout énoncé peut être tenu pour vrai quoi qu'il arrive, pourvu que nous fassions des ajustements assez énergiques ailleurs dans le système. Même un énoncé proche de la périphérie peut être maintenu en dépit d'une expérience récalcitrante, en plaidant l'hallucination ou en retouchant certaines des lois dites logiques. Deuxièmement, et inversement : aucun énoncé n'est à l'abri d'une révision. On a même proposé de réviser la loi logique du tiers exclu pour simplifier la mécanique quantique ; et quelle différence de principe y a-t-il entre un tel changement et celui par lequel Kepler a supplanté Ptolémée, ou Einstein Newton, ou Darwin Aristote ? Les énoncés de la logique et des mathématiques ne jouissent d'aucune immunité spéciale ; ils occupent seulement une position centrale dans le réseau, loin des bords, là où peu de connexions avec une expérience particulière s'imposent. C'est pourquoi nous hésitons davantage à les abandonner : leur révision aurait des répercussions étendues. Cette résistance est affaire de degré, non de nature.
Ce holisme renverse la hiérarchie héritée. Il n'y a plus de partage tranché entre des [[Dictionnaire de philosophie/Croyance|croyances]] purement empiriques, qui affronteraient seules l'expérience, et des vérités purement formelles, qui en seraient à l'abri. Toutes nos croyances tiennent ensemble par leurs liens logiques, et c'est l'ensemble qui se confronte au monde. Les énoncés de la logique, des mathématiques, de l'ontologie, sont au cœur du réseau ; ceux de l'histoire et de la perception, à sa marge. Mais ce ne sont là que des positions relatives sur une même étoffe, non des espèces hétérogènes.
Pour rendre ces distances tangibles, Quine recourt à des exemples ordinaires. Qu'une expérience nous surprenne, et, selon les cas, nous y ferons face en corrigeant l'énoncé qu'il y a des maisons de brique dans telle rue, ou bien l'énoncé qu'il n'existe pas de centaures. De tels énoncés ont une référence empirique aiguë : ils touchent presque au bord du tissu. Les énoncés de la physique des particules, des mathématiques ou de l'ontologie, eux, gisent au centre, non parce qu'ils échapperaient à l'expérience, mais parce qu'aucune sensation particulière ne s'y noue de façon saillante. C'est pourquoi nous révisons d'abord les premiers : non par contrainte logique, mais par souci de troubler l'ensemble le moins possible.<ref>L'exemple des maisons de brique et des centaures illustre la « référence empirique aiguë » de certains énoncés (« Deux dogmes de l'empirisme », ''FLPV'', éd. citée, p. 43-44).</ref>
Quine en tire une conséquence sur le statut des objets eux-mêmes. Les objets physiques, écrit-il, sont introduits dans notre conception comme des intermédiaires commodes, non par définition à partir de l'expérience, mais à titre de simples postulats, comparables, sur le plan de la connaissance, aux dieux d'Homère. La comparaison est calculée pour choquer, et Quine en précise aussitôt la portée. Lui-même croit aux objets physiques et non aux dieux d'Homère, et il tient pour une erreur scientifique de croire le contraire. Mais quant à leur statut épistémologique, les uns et les autres ne diffèrent que par degré : tous deux entrent dans notre conception comme des entités posées par la culture. Le mythe des objets physiques l'emporte sur les autres en ceci qu'il s'est révélé plus efficace qu'eux pour ménager une structure maniable dans le flux de l'expérience. Postuler des corps, des atomes, des forces, des classes, c'est se donner des instruments d'organisation et de prédiction ; la science continue en cela le geste du sens commun, qui gonfle l'ontologie pour simplifier la théorie.
Deux notions complètent ce tableau et l'éloignent du relativisme facile auquel on le réduit parfois. La première est la sous-détermination des théories par l'expérience : pour un même corps de données possibles, plusieurs théories rivales, incompatibles entre elles, peuvent rendre compte également bien des observations. Les bords du champ ne fixent pas son intérieur. La seconde est que ce jeu n'est pas arbitraire. Quand l'expérience nous contraint à retoucher notre système, deux forces guident notre choix : un conservatisme qui nous porte à déranger le système le moins possible, et une quête de simplicité qui nous fait préférer les hypothèses les plus économiques. Carnap, Lewis et d'autres adoptaient une attitude pragmatique pour le choix entre formes de langage, mais leur pragmatisme s'arrêtait à la frontière supposée de l'analytique et du synthétique. En supprimant cette frontière, Quine étend le pragmatisme à toute la science : chacun reçoit un héritage scientifique et un flux continu de stimulations sensorielles, et les considérations qui le guident, lorsqu'il ajuste cet héritage à ces stimulations, sont, dans la mesure où elles sont rationnelles, pragmatiques. L'empirisme sans les dogmes devient un pragmatisme plus conséquent, attentif à la fois à l'expérience, qui contraint, et à la cohérence du système, qui oriente.
Quine a tempéré, avec le temps, la version forte de 1951. Dans « Two Dogmas in Retrospect » (1991), il reconnaît que faire comparaître la science tout entière à chaque épreuve allait au-delà de ce qu'exigeait sa critique du réductionnisme. Il parle désormais d'un holisme modéré. Ce qui affronte l'expérience, ce ne sont pas des énoncés isolés ; mais ce n'est pas non plus la totalité de nos croyances : ce sont des ensembles d'énoncés assez vastes pour impliquer des prédictions observables, ce qu'il nomme des « masses sémantiques critiques ». Le principe demeure, intact : aucun énoncé n'est en droit à l'abri d'une révision. En fait, pourtant, l'épreuve porte sur des fragments de théorie, non sur le système entier à chaque instant. Quine en tire même une explication de la nécessité mathématique qui se passe d'analyticité : si l'énoncé mis en cause est purement mathématique, nous nous gardons de le réviser, car y toucher ébranlerait trop le reste de la science. C'est ce qu'il appelle la maxime de mutilation minimale. Dans ce cadre, la nécessité mathématique tient à la position centrale des mathématiques dans notre système et à notre politique rationnelle de porter ailleurs les révisions, sauf coût théorique exceptionnel.<ref>W. V. O. Quine, « Two Dogmas in Retrospect », ''Canadian Journal of Philosophy'', vol. 21, 1991, p. 265-274 (ici p. 269-270) ; voir aussi ''La poursuite de la vérité'', éd. citée, chap. 1. Sur ce holisme modéré et la « masse sémantique critique », voir Roger F. Gibson (dir.), ''The Cambridge Companion to Quine'', Cambridge University Press, 2004, p. 12-13.</ref>
== La traduction radicale et l'indétermination de la signification ==
Le holisme atteignait la théorie de la confirmation. Quine va l'étendre à la théorie de la signification, et c'est l'objet central du ''Mot et la chose'' (1960). Le fil conducteur en est une exigence naturaliste : si le langage est un comportement public, appris par l'enfant au contact d'autrui dans des situations observables, alors tout ce qu'il y a à savoir sur la signification doit pouvoir se lire dans ce comportement et dans les circonstances qui l'accompagnent. Il n'y a pas, dans l'apprentissage et l'usage d'une langue, de matière cachée à laquelle le sujet aurait un accès privé. Cette contrainte, Quine la met à l'épreuve par une expérience de pensée qu'il a rendue fameuse : la traduction radicale.
=== Le linguiste de terrain ===
[[Fichier:European Rabbit 09 05 2025 02.jpg|vignette|upright=1.15|« Gavagai. » Un lapin détale, l'indigène prononce ce mot, le linguiste note « Lapin ». Mais rien dans la scène ne décide si le terme indigène vise un lapin entier, un segment temporel de lapin, ou un agrégat de parties non détachées de lapin.]]
Imaginons un linguiste qui aborde une langue jusqu'alors inconnue, sans interprète, sans dictionnaire, sans la moindre passerelle avec une langue déjà comprise. Tout ce dont il dispose, ce sont les sons que prononcent les indigènes et les circonstances visibles où ils les prononcent. C'est la situation de la traduction radicale, où l'on doit tout reconstruire à partir du seul comportement. Un lapin détale, l'indigène dit « Gavagai », et le linguiste inscrit provisoirement « Lapin » comme traduction. Pour étayer cette conjecture, il guette les occasions : il prononce lui-même « Gavagai ? » dans diverses situations et note si l'indigène marque son assentiment, son refus, ou ni l'un ni l'autre. À force d'observations, il accumule des indices et finit par tenir « Gavagai » pour synonyme de « Lapin ».
Ce que le linguiste peut établir ainsi, Quine le nomme la signification stimulante (stimulus meaning) d'une phrase d'occasion : l'ensemble des stimulations sensorielles qui disposeraient l'indigène à donner son assentiment, et l'ensemble de celles qui provoqueraient son refus. Il importe de penser ce qui déclenche l'assentiment comme une stimulation, non comme le lapin lui-même : la stimulation reste la même si l'on remplace l'animal par un leurre habile, et elle change si l'on bouche les yeux de l'indigène. Sur cette base étroite, Quine reconnaît que certains énoncés se laissent traduire avec une assurance suffisante. Ce sont les énoncés d'observation, dont l'assentiment est étroitement commandé par la stimulation présente, et qui constituent le point d'ancrage de la langue dans le monde. « Gavagai » et « Voici un lapin » sont, en ce sens limité, synonymes stimulants : ils commandent l'assentiment dans les mêmes circonstances.
=== Le lapin, ses parties et sa lapinité ===
Il faut ici dissiper une confusion fréquente, car l'exemple du lapin sert en réalité deux thèses voisines mais distinctes. Comme phrase d'observation, « Gavagai » se laisse traduire avec assurance : sa signification stimulante est déterminée, et « Voici un lapin » en est un bon équivalent. La difficulté surgit au niveau du terme. La première thèse, l'inscrutabilité de la référence, porte précisément sur les termes, sur ce que désigne le mot « gavagai » pris à part. La seconde, l'indétermination de la traduction proprement dite, est plus large : elle porte sur les phrases, et surtout sur les énoncés éloignés de l'observation, dont rien ne fixe la traduction même lorsque celle des termes serait arrêtée. Le doute entre le lapin, ses parties et ses phases relève de la première ; il en offre l'image la plus parlante, mais on aurait tort d'y réduire la seconde.
Voici le ressort de l'argument. L'accord sur la signification stimulante de « Gavagai » comme phrase ne garantit nullement que « gavagai » et « lapin » soient des termes coextensifs, vrais des mêmes choses. Car que désigne au juste « gavagai » ? Peut-être des lapins ; mais peut-être de simples segments temporels de lapins, de brèves tranches de leur durée ; ou encore l'ensemble des parties non détachées de lapins ; ou même la fusion de tous les lapins en une seule portion discontinue de l'espace-temps ; ou enfin la lapinité, ce trait universel partout où un lapin se manifeste. Dans tous ces cas, la signification stimulante serait la même. Pointer un lapin, c'est aussi bien pointer une de ses parties, un de ses instants, la fusion à laquelle il appartient, le lieu où la lapinité s'incarne. Aucune ostension, aucune désignation par le doigt ne tranche entre ces lectures, car ce qui les distingue n'est pas dans la ressemblance des stimulations, mais dans l'anatomie des phrases : dans la manière dont la langue manie l'identité, la pluralité, les articles, ce que Quine appelle l'appareil de la référence.
Or cet appareil, le linguiste ne peut le mettre en évidence qu'en posant des hypothèses sur la façon dont la langue indigène rend nos propres procédés : nos pronoms, notre copule, notre « est le même que ». Ces hypothèses, que Quine nomme hypothèses analytiques, vont au-delà de tout ce que la signification stimulante autorise. Elles sont indispensables pour passer de la traduction des phrases d'occasion à celle des termes, mais rien dans le comportement ne les impose. Le linguiste peut équivaloir « gavagai » à « lapin », ou à « segment de lapin », ou à « partie non détachée de lapin », et compenser ce choix en ajustant la traduction de l'identité et des particules associées, sans jamais entrer en conflit avec les significations stimulantes. La référence des termes étrangers reste, selon le mot de Quine, inscrutable. Les phrases d'occasion et la signification stimulante sont une monnaie commune ; les termes et la référence, eux, sont propres à notre schème conceptuel.<ref>W. V. O. Quine, ''Le mot et la chose'', § 12, trad. Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977 (''Word and Object'', Cambridge (Mass.), The MIT Press, 1960). Le lapin, ses segments, ses parties non détachées et la lapinité, ainsi que la remarque selon laquelle « l'inscrutabilité tient non à la ressemblance, mais à l'anatomie des phrases », occupent le § 12 (p. 51-53 de l'éd. de 1960).</ref>
=== Le mythe du musée ===
Derrière cet argument, Quine vise une certaine image de la signification, qu'il appelle le mythe du musée. Selon cette image, les significations seraient à nos expressions ce que les tableaux exposés dans un musée sont à leurs étiquettes : des objets fixes, indépendants des langues, que les mots se borneraient à désigner. Deux expressions seraient synonymes lorsqu'elles renvoient à une même signification, comme deux étiquettes pour un seul tableau ; et traduire un mot, ce serait lui trouver, dans une autre langue, l'étiquette qui pend au même tableau, c'est-à-dire à la même signification interlinguistique. Ce que cet argument établit, c'est qu'aucune signification de ce genre, antérieure aux langues et commune à elles, ne vient fixer la traduction. Il n'existe pas de signification de « Gavagai » qui dirait, par-delà tout comportement, s'il faut le rendre par « lapin » ou par « segment de lapin ». La signification n'est pas un objet logé dans un musée mental : elle se réduit à ce que le comportement linguistique, dans ses circonstances, peut exhiber, c'est-à-dire à la signification stimulante, bien plus pauvre que la synonymie pleine que les philosophes lui prêtaient.<ref>Le « mythe du musée », où « les pièces exposées sont des significations et les mots, des étiquettes », ouvre « La relativité de l'ontologie », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Ontological Relativity », ''OR'', p. 27).</ref>
=== L'indétermination de la traduction ===
De là procède la thèse de l'indétermination de la traduction. Deux linguistes, travaillant indépendamment sur la même langue, pourraient produire deux manuels de traduction, chacun cohérent avec la totalité du comportement verbal observable, et pourtant inconciliables entre eux : là où l'un rendrait une phrase d'une certaine façon, l'autre la rendrait d'une façon que le premier rejetterait. Aucun fait, pas même la totalité des dispositions verbales des locuteurs, ne permettrait de dire lequel a raison, car il n'y a pas, en ce domaine, de fait de l'affaire qui excède le comportement. La traduction n'est pas seulement difficile ou faillible : elle est, en un sens précis, sous-déterminée par tout ce qui pourrait en décider.
Quine insiste sur un point qu'on néglige souvent. S'il a choisi pour théâtre une langue exotique, c'est pour rendre la thèse plausible, à la manière des ''Voyages de Gulliver'' qui éclairent nos mœurs en les transposant dans des contrées étranges. Mais la leçon vaut aussi pour notre propre langue. Étant donné deux manuels rivaux entre la langue de la jungle et la nôtre, nous pouvons traduire perversement notre langue en elle-même, en la faisant passer par la jungle au moyen d'un manuel, puis revenir au moyen de l'autre. L'indétermination n'est pas un accident de l'éloignement ; elle tient à la nature même de la signification. Ce qui se donnait pour un objet bien défini, le sens d'une phrase ou d'un mot, se révèle un mythe dès qu'on exige qu'il rende compte de plus que ce que le comportement public peut porter.
Un écueil guette ici, qu'il faut écarter : confondre cette indétermination avec la sous-détermination des théories physiques rencontrée à propos du holisme. Une théorie de la nature est sous-déterminée parce que les données laissent ouvertes plusieurs descriptions du monde ; mais il y a, sous ces descriptions, un monde à décrire : les théories rivales diffèrent par ce qu'elles disent de la réalité, même si les observations disponibles, voire toutes les observations possibles, ne suffisent pas à les départager. Dans le cas de la traduction, soutient Quine, il n'en va pas ainsi : ce n'est pas que le fait de la signification nous échappe, c'est qu'il n'existe aucun fait à atteindre. L'indétermination n'est pas une ignorance, mais une absence. C'est en ce point précis que la thèse heurte le sens commun, et que ses adversaires la jugent tantôt triviale, tantôt incroyable.<ref>Sur l'idée qu'il n'y a, en matière de signification, aucun fait à connaître, voir « Parler d'objets » (''OR'', éd. citée, p. 5) et ''Le mot et la chose'', § 16. Quine précisera la distinction d'avec la sous-détermination dans ''La poursuite de la vérité'', éd. citée, chap. 1.</ref>
== L'inscrutabilité de la référence et la relativité de l'ontologie ==
L'indétermination de la traduction se rapporte aux phrases et à leur sens. Quine isole un autre phénomène, voisin mais distinct, qui touche cette fois la référence des termes : l'inscrutabilité de la référence. Il l'avait déjà rencontré avec « gavagai », où rien ne fixait si le terme renvoyait au lapin, à ses parties ou à sa fusion. Il en donne dans « La relativité de l'ontologie » (1968) une formulation générale, à l'aide de ce qu'il appelle des fonctions de substitution. Soit une théorie quelconque ; remplaçons systématiquement chacun de ses objets par un autre, au moyen d'une correspondance terme à terme. À chaque objet, faisons par exemple correspondre son singleton, c'est-à-dire la classe qui n'a que lui pour élément ; ou bien son complément spatio-temporel, c'est-à-dire tout le reste du monde, lui excepté. Si l'on réinterprète en même temps tous les prédicats de la théorie de manière concertée, l'ensemble des énoncés vrais reste exactement le même, et avec lui la totalité de la matière probante. Du dehors, rien ne distingue la théorie qui parle de lapins de celle qui parle de singletons de lapins. La référence de chaque terme est, en ce sens, indéterminée : on peut faire tourner l'univers des objets sans que la trame des vérités s'en ressente.<ref>W. V. O. Quine, « La relativité de l'ontologie » (''Relativité de l'ontologie et autres essais'', éd. citée). Les fonctions de substitution, qui établissent l'inscrutabilité de la référence, sont introduites ''OR'', p. 47 et suiv.</ref>
Quine en tire une conséquence sur le sens même des questions d'ontologie. Demander, dans l'absolu, quels sont les objets d'une théorie n'a pas de sens. La question ne devient sensée que relativement à un manuel de traduction dans une théorie d'arrière-plan. C'est seulement en rapportant une langue à une autre, prise pour cadre, que l'on peut dire ce dont parle la première ; et cette théorie d'arrière-plan demande à son tour, si on l'interroge, d'être rapportée à une autre. La référence est ainsi relative, comme la position d'un point est relative à un système de coordonnées. Il est vain de demander où se trouve un objet dans l'espace absolu ; on ne peut indiquer sa place que par rapport à un repère. De même, il est vain de demander quels objets une théorie pose en elle-même ; on ne peut le dire que par rapport à un cadre que l'on adopte sans le mettre lui-même en question. Telle est la relativité de l'ontologie.
On évitera un contresens. Quine ne soutient pas que les objets seraient des illusions, ni que tout se vaut. Resté à l'intérieur de notre langue, sans la mettre en balance avec une autre, je parle bel et bien de lapins, de tables et de nombres, et la question « combien de lapins ? » a une réponse déterminée. C'est l'image qu'il propose en disant qu'il faut « rester à bord de son propre langage » et ne pas faire tanguer la barque : tant qu'on n'entreprend pas de traduire son langage en un autre, ou de le permuter sur lui-même, la référence va de soi.<ref>Sur l'image de rester « à bord de son propre langage » sans « faire tanguer la barque », et sur la traduction perverse de l'anglais en anglais, voir « La relativité de l'ontologie » (''OR'', p. 30 et p. 47-48) et ''La poursuite de la vérité'', trad. Maurice Clavelin, Paris, Seuil, 1993.</ref> Elle ne devient inscrutable que lorsqu'on prend du recul, qu'on contemple une réinterprétation globale ou qu'on traduit. Ce que Quine appelle dans ses derniers textes son structuralisme global tient en ceci : ce que nos théories saisissent du monde, c'est une structure, un réseau de relations, et non une collection d'objets désignés un à un. Les objets sont, selon son mot, des « points neutres » qui tiennent la structure en place ; ce qui compte, ce sont les relations qu'ils entretiennent, non leur nature intime, à jamais hors d'atteinte.
== L'épistémologie naturalisée ==
Le dernier grand déplacement opéré par Quine concerne l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] elle-même. Exposé surtout dans « L'épistémologie naturalisée » (1969)<ref>W. V. O. Quine, « L'épistémologie naturalisée », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Epistemology Naturalized », ''OR'', p. 69-90). L'épistémologie « comme chapitre de la psychologie », la « contenance réciproque » et le rapport entre « l'entrée maigre et la sortie torrentielle » se trouvent p. 83.</ref>, il consiste à ranger la théorie de la connaissance parmi les sciences de la nature, au rebours d'une tradition qui voulait qu'elle les précède et les fonde.
=== La fin de la philosophie première ===
Depuis [[Dictionnaire de philosophie/René Descartes|Descartes]], l'épistémologie se voulait une philosophie première : une discipline antérieure à la science, chargée d'en assurer les fondements depuis un point d'appui que la science ne fournirait pas. Le projet avait deux versants. Sur le versant doctrinal, il s'agissait de déduire les vérités sur le monde à partir de l'expérience immédiate, avec la certitude de la logique ; c'était la quête cartésienne de la [[Dictionnaire de philosophie/Certitude|certitude]]. Sur le versant conceptuel, il s'agissait de définir les notions de la science à partir des seuls termes d'observation. L'aboutissement le plus accompli de ce second versant est l{{'}}''Aufbau'' de Carnap (1928), qui entreprend de construire le monde comme un édifice logique élevé sur la base des données sensibles.
Quine tient ce projet pour irrémédiablement échoué, et il s'y connaît, lui qui admirait Carnap. Sur le versant doctrinal, l'échec était reconnu de longue date : on ne peut déduire la science de l'expérience, car la plus modeste des généralisations sur l'observable porte sur plus de cas que son auteur n'en a jamais pu observer. La quête de certitude était une cause perdue, héritée de Hume autant que de Descartes. Sur le versant conceptuel, l'entreprise de l{{'}}''Aufbau'' achoppe elle aussi. Carnap ne parvient pas à fournir une réduction par traduction, c'est-à-dire une recette permettant de réécrire chaque énoncé sur le monde en termes d'observation, de logique et de théorie des ensembles. Au point capital, là où il faut assigner des qualités sensibles à des positions dans l'espace et le temps, il ne donne qu'une consigne d'ajustement, révisable au fil de l'expérience, et non une définition. L'idéal d'une réduction du monde à l'expérience demeure hors d'atteinte.
L'échec du fondationnalisme ne signe pourtant pas la mort de l'empirisme. Deux thèses empiristes, souligne Quine, demeurent intactes. La première : toute la matière probante dont dispose la science est de nature sensorielle. La seconde : l'apprentissage du sens des mots repose en dernière instance sur l'expérience sensible. Ce qui s'effondre, c'est l'ambition de déduire la science de cette base ; ce qui subsiste, c'est que la science n'a pas d'autre source d'épreuve que l'irritation de nos surfaces sensorielles. Le naturalisme de Quine n'est donc pas un congé donné à l'empirisme, mais sa reformulation : un empirisme qui renonce au fondement sans renoncer à l'expérience.<ref>« L'épistémologie naturalisée » (''OR'', éd. citée, p. 75) : « toute matière probante de la science est sensorielle » et « l'inculcation du sens des mots repose en dernier ressort sur la matière probante sensorielle ».</ref>
=== Un chapitre de la psychologie ===
Devant cet échec, Quine propose un renversement. Puisque le rêve de déduire la science de l'observation est perdu, pourquoi ne pas se contenter de la psychologie ? Pourquoi ne pas étudier, simplement, comment l'édifice de nos croyances s'élève en fait sur la base des stimulations sensorielles ? On objectait jadis à cette idée un cercle vicieux : si l'épistémologue veut valider les fondements de la science, il se contredit en usant, pour cela, de la science elle-même. Mais ce scrupule, observe Quine, perd toute portée dès qu'on a cessé de vouloir déduire la science de l'observation. Si nous cherchons seulement à comprendre le lien entre l'observation et la théorie, nous avons tout intérêt à mobiliser toute l'information disponible, y compris celle que nous fournit la science même dont nous étudions le rapport à l'observation. La crainte de la circularité n'a de sens que pour qui poursuit encore une fondation ; elle s'évanouit pour qui cherche seulement à comprendre.
L'épistémologie trouve alors une place nouvelle : elle devient un chapitre de la psychologie, et par là de la science de la nature. Elle étudie un phénomène naturel, à savoir un sujet humain physique. On accorde à ce sujet une certaine entrée, contrôlée par l'expérimentateur, sous forme de schémas d'irradiation de ses surfaces sensorielles ; et, le temps venu, le sujet livre en sortie une description du monde extérieur à trois dimensions et de son histoire. La relation entre cette entrée maigre et cette sortie torrentielle est précisément ce que l'épistémologue est conduit à étudier, pour des raisons à peu près semblables à celles qui ont toujours animé sa discipline : voir comment la matière probante se rattache à la théorie, et en quoi notre théorie de la nature déborde toute donnée disponible.
Quine décrit le rapport ainsi obtenu entre l'épistémologie et la science par une formule en forme de boucle : il y a contenance réciproque. L'ancienne épistémologie aspirait à contenir la science, à la construire à partir des données sensibles ; la nouvelle, à l'inverse, est contenue dans la science, comme un chapitre de la psychologie. Mais l'ancienne contenance vaut aussi, à sa manière, car nous étudions comment notre sujet pose des corps et projette sa physique à partir de ses données, et nous comprenons que notre propre position dans le monde ne diffère en rien de la sienne. Notre étude de la connaissance, la psychologie où elle s'inscrit, la science tout entière qui contient cette psychologie : tout cela est notre propre construction, projetée à partir de stimulations semblables à celles que nous administrons au sujet observé. Nul cercle vicieux là-dedans, une fois renoncé au rêve de la déduction : nous cherchons à comprendre la science comme un processus dans le monde, et nous n'exigeons pas que cette compréhension soit plus assurée que la science qui en est l'objet.
Cette attitude, Quine la rattache à une image qu'il emprunte à Otto Neurath et qu'il affectionne : celle du [[Dictionnaire de philosophie/Bateau de Neurath|bateau de Neurath]].<ref>L'image du bateau est empruntée à Otto Neurath ; Quine la place en exergue du ''Mot et la chose'' et la reprend dans « L'épistémologie naturalisée » (''OR'', p. 84) ainsi que dans l'essai « Natural Kinds » (même volume, p. 127).</ref> Nous sommes comme des marins qui doivent réparer leur navire en pleine mer, sans pouvoir le mettre en cale sèche ni le reconstruire à neuf depuis la quille. Nous ne disposons d'aucun sol ferme extérieur à la science d'où la refonder ; nous travaillons toujours du dedans, remplaçant une planche après l'autre tout en restant à flot, en nous appuyant sur le reste de la coque. Il n'y a pas de point d'appui archimédien hors de nos croyances, pas de [[Dictionnaire de philosophie/A priori|donnée première]] soustraite à l'enquête. La philosophie ne surplombe pas la science : elle en fait partie, à la pointe la plus générale et la plus réflexive, mais sans privilège de juridiction. On objectera que naturaliser l'épistémologie, c'est la priver de sa fonction d'évaluation : si elle se borne à décrire comment nous formons nos croyances, que devient la question de savoir lesquelles sont justifiées ? Quine répond, on le verra, que la part normative n'est pas abolie, mais reconduite à l'intérieur de la science, sous la forme de recommandations sur les meilleurs moyens d'atteindre la vérité. Le naturalisme ne supprime pas la norme ; il cesse seulement de la chercher hors de la science.
== Logique, extensionnalisme et critique des modalités ==
Logicien de métier, Quine a soutenu en philosophie de la logique des positions cohérentes avec l'ensemble de son œuvre. La première est un extensionnalisme assumé. Un contexte est dit extensionnel lorsqu'on peut y remplacer un terme par un autre, vrai des mêmes objets, sans changer la valeur de vérité de l'énoncé, et lorsqu'on peut y substituer à une phrase toute phrase de même valeur de vérité. La logique classique des prédicats est extensionnelle ; elle ne connaît que les objets, leurs classes et la vérité ou la fausseté des énoncés. Quine y voit le langage le plus clair que nous ayons, et il refuse d'en sortir sans nécessité. Ce refus a une cible précise : les entités intensionnelles, c'est-à-dire les significations, les propositions et les propriétés, qui peuplent les contextes où la substitution échoue. On a vu pourquoi il les écarte : faute de critère d'identité, ces entités ne satisfont pas à la règle « pas d'entité sans identité ».
=== L'opacité des contextes modaux ===
C'est sur ce terrain que se joue la critique quinienne de la logique modale, celle qui ajoute à la logique les opérateurs « il est nécessaire que » et « il est possible que ». Quine ne conteste pas la logique modale comme calcul formel ; il conteste qu'on puisse l'interpréter de façon intelligible dès qu'on y fait entrer des quantificateurs. Son argument procède d'un exemple resté classique. Considérons les deux énoncés : « il est nécessaire que neuf soit plus grand que sept » et « il est nécessaire que le nombre des planètes soit plus grand que sept ». Le premier paraît vrai, les vérités de l'arithmétique passant pour les meilleures candidates à la nécessité. Le second paraît faux, car le nombre des planètes aurait pu être autre : le système solaire aurait pu se former avec moins d'astres. Or, à l'époque où Quine écrit, le nombre des planètes est neuf. On passe donc du premier énoncé au second en remplaçant un terme, « neuf », par un autre qui désigne le même objet, « le nombre des planètes » ; et cette substitution transforme un vrai en un faux. Le contexte modal est ainsi opaque à la référence : ce qui s'y dit ne dépend pas seulement de l'objet désigné, mais de la façon de le désigner.<ref>W. V. O. Quine, « Référence et modalité » (« Reference and Modality »), dans ''Du point de vue logique'', éd. citée : l'exemple du nombre des planètes est introduit ''FLPV'' p. 143, et l'« attitude discriminante » envers les façons de spécifier un objet, censée livrer son « essence », est dénoncée p. 155. Voir aussi « Les trois degrés de l'implication modale » (« Three Grades of Modal Involvement »), dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''The Ways of Paradox and Other Essays'', ci-après ''WP'', New York, Random House, 1966, p. 158 et p. 175).</ref>
Tant qu'on s'en tient à une modalité de dicto, qui porte sur des énoncés tout entiers, Quine concède qu'on peut donner un sens à ces tournures, en traitant la nécessité comme un prédicat attaché à des phrases plutôt qu'à des choses : « la phrase neuf est plus grand que sept est nécessaire ». La difficulté surgit quand on veut quantifier dans le contexte modal, c'est-à-dire affirmer une modalité de re, qui porte sur la chose elle-même : « il existe un objet qui est nécessairement plus grand que sept ». Une telle affirmation prétend qu'un objet possède une certaine propriété nécessairement, en lui-même, indépendamment de la manière dont on le spécifie. Or cela suppose, soutient Quine, ce qu'il nomme avec ironie l'essentialisme aristotélicien : la doctrine selon laquelle, parmi les propriétés vraies d'une chose, certaines lui appartiennent par essence et d'autres par accident, abstraction faite de toute description.
=== Le mathématicien cycliste ===
Pour faire sentir ce qu'il tient pour une perplexité légitime, Quine forge dans ''Le mot et la chose'' un exemple devenu un cas d'école. On dira peut-être que les mathématiciens sont nécessairement rationnels et non nécessairement bipèdes, tandis que les cyclistes sont nécessairement bipèdes et non nécessairement rationnels. Soit. Mais que dire d'un individu qui compte parmi ses occupations à la fois les mathématiques et la bicyclette ? Cet homme concret est-il nécessairement rationnel et accidentellement bipède, ou l'inverse ? La question, juge Quine, n'admet pas de réponse, et ne devrait pas en admettre.<ref>W. V. O. Quine, ''Le mot et la chose'', § 41 (''Word and Object'', éd. citée, p. 199).</ref> Car la rationalité ne lui revient nécessairement qu'en tant qu'on le considère comme mathématicien, et la bipédie qu'en tant qu'on le considère comme cycliste ; rapportées à l'objet nu, sans description privilégiée, ces nécessités s'évanouissent. L'essentialisme exige qu'on tienne pour mieux révélatrices de l'essence certaines manières de spécifier un objet, et pour trompeuses les autres. Cette préférence, Quine la trouve injustifiable, et la nécessité de re qui s'y appuie, à peine intelligible.
=== Attitudes propositionnelles et nécessité ===
La même opacité affecte les contextes de croyance, que Quine range parmi les attitudes propositionnelles. « Œdipe veut épouser Jocaste » peut être vrai quand « Œdipe veut épouser sa mère » est faux, alors même que Jocaste est sa mère. Là encore, la substitution de termes coréférents échoue, et pour la même raison : ce qui est en jeu n'est pas seulement l'objet, mais la façon dont il est présenté à l'esprit du croyant. Quine en conclut que ces tournures, indispensables à la vie ordinaire, résistent à une analyse extensionnelle et qu'il faut, en science rigoureuse, soit les paraphraser, soit s'en passer.
Il faut signaler que ces strictures n'ont pas eu le dernier mot. À partir de « La logique des noms propres » (''Naming and Necessity'') de Saul Kripke et de la sémantique des mondes possibles, une partie de la philosophie a réhabilité la nécessité de re, l'essentialisme et même la notion de vérité nécessaire connue a posteriori. Là où Quine voyait une notion à peine compréhensible, ces travaux ont vu un domaine cohérent et fécond. Le débat reste ouvert, et il oppose deux conceptions de la nécessité : pour Quine et l'empirisme logique, la nécessité, si elle a un sens, vient de nous, de notre langage ; pour la tradition issue de Kripke, elle est ancrée dans la nature des choses. Quine considérait cette seconde idée comme un retour à une métaphysique qu'il croyait dépassée.
=== La logique n'est pas vraie par convention ===
Reste la question du statut des vérités logiques elles-mêmes. L'empirisme logique tenait la logique et les mathématiques pour vraies en vertu de [[Dictionnaire de philosophie/Convention|conventions]] linguistiques. Quine, dès « Truth by Convention » (1936) puis dans « Carnap et la vérité logique », a démonté cette thèse par un argument de régression.<ref>W. V. O. Quine, « La vérité par convention » (« Truth by Convention », 1936) et « Carnap et la vérité logique » (« Carnap and Logical Truth »), repris dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''WP'', éd. citée, p. 89 et p. 113-114).</ref> Si les vérités logiques découlaient de conventions explicites, encore faudrait-il, pour en tirer les cas particuliers à partir des règles générales, user de la logique. On ne peut poser par convention l'infinité des vérités logiques qu'en les énonçant sous forme de quelques principes généraux, dont on déduirait les instances ; mais cette déduction présuppose déjà la logique qu'on prétendait fonder. La convention ne saurait donc engendrer la logique sans la supposer. Quine en conclut que les vérités logiques ne sont pas d'une autre nature que les autres : elles occupent simplement la position la plus centrale et la plus générale du réseau de nos croyances, là où nous touchons le moins volontiers, parce qu'y toucher bouleverserait tout le reste.
De là découle une dernière thèse, que résume une formule de sa ''Philosophie de la logique'' : changer de logique, c'est changer de sujet.<ref>W. V. O. Quine, ''Philosophie de la logique'', chap. 6, « Les logiques déviantes », trad. Jean Largeault, Paris, Aubier-Montaigne, 1975 (''Philosophy of Logic'', Cambridge (Mass.), Harvard University Press, 1970, p. 81 ; sur le « prix » d'une logique déviante, p. 86-87).</ref> Qui prétend réviser une loi logique, par exemple en rejetant le tiers exclu, ne réfute pas l'ancienne loi ; il donne un sens nouveau aux connecteurs, et parle désormais d'autre chose. La logique reste révisable en droit, comme tout le reste du tissu de la science, car aucun énoncé n'y est sacré ; mais sa centralité même fait qu'on ne la révise qu'en dernière extrémité, sous la pression d'une simplification d'ensemble assez forte pour le justifier. Le maintien de la logique classique n'est pas, chez Quine, un dogme : c'est le fruit du conservatisme et de la quête de simplicité qui gouvernent toutes nos révisions, sous la conduite de la maxime de mutilation minimale déjà rencontrée. Réviser une loi logique entraînerait une refonte de si grande ampleur du réseau théorique que le coût en serait, presque toujours, hors de proportion avec le gain. Aussi Quine n'a-t-il jamais recommandé les logiques déviantes : il en admet la possibilité de principe, mais sa maxime milite contre elles, sauf bénéfice théorique exceptionnel, comme celui qu'on a cru parfois entrevoir du côté de la mécanique quantique.
== Postérité et discussions ==
[[Fichier:Willard Van Orman Quine on Bluenose II in Halifax NS harbor 1980.jpg|vignette|upright=1|Quine à la barre du Bluenose II, dans le port de Halifax, en 1980. Le goût des cartes et des voyages, né dans l'enfance, ne le quitta jamais et colore son image de la connaissance comme exploration sans sol ferme.]]
L'œuvre de Quine a façonné le paysage de la philosophie analytique de la seconde moitié du XX{{e}} siècle, au point que ses adversaires eux-mêmes argumentent sur le terrain qu'il a déblayé. Son influence se mesure moins à une école constituée qu'à un climat : le naturalisme, devenu pour beaucoup l'atmosphère par défaut de la discipline.
=== Une influence diffuse ===
Donald Davidson a prolongé le projet quinien de la traduction radicale en une théorie de l'interprétation, posant qu'on ne peut comprendre autrui qu'en lui prêtant, par un principe de charité, une rationalité et des croyances pour l'essentiel vraies. Daniel Dennett a fait du naturalisme quinien un instrument pour la philosophie de l'esprit. En philosophie des mathématiques, l'argument dit d'indispensabilité, élaboré avec Hilary Putnam, soutient que nous devons admettre l'existence des objets abstraits, nombres et ensembles, parce que nos meilleures théories physiques en font un usage que l'on ne sait pas éliminer : c'est le critère de l'engagement ontologique appliqué à la science effective. Le programme d'une [[Dictionnaire de philosophie/Épistémologie|épistémologie]] naturalisée a nourri tout un courant de recherche, qui étudie la formation des croyances avec les ressources de la psychologie et des sciences cognitives, et qui a contribué à rapprocher la philosophie de la connaissance des sciences empiriques de l'esprit.
=== La défense de l'analyticité ===
La critique de la distinction analytique et synthétique n'a pas fait l'unanimité. Dans un article resté célèbre, « Pour la défense d'un dogme » (1956), Paul Grice et Peter Strawson objectent que l'exigence quinienne est trop forte.<ref>H. P. Grice et P. F. Strawson, « In Defense of a Dogma », ''The Philosophical Review'', vol. 65, 1956, p. 141-158.</ref> Que l'on ne sache pas définir « analytique » sans cercle ne prouve pas que la notion soit vide : bien des couples de notions s'éclairent mutuellement sans qu'aucune se laisse réduire à autre chose, et les locuteurs compétents s'accordent en fait, de manière stable, sur ce qui relève du sens des mots et sur ce qui relève des faits. Une distinction dont l'usage est partagé et régulier ne saurait être tenue pour illusoire au seul motif qu'elle résiste à la définition explicite. Carnap, de son côté, n'a jamais cédé sur l'analyticité, qu'il jugeait clarifiable pour les langages réglés. Plus tard, des philosophes comme Paul Boghossian ont cherché à reconstruire une notion défendable de vérité fondée sur la signification, et à rouvrir la question de l'a priori que Quine croyait close.
=== Le langage et l'esprit ===
Sur le terrain du langage, Noam Chomsky a opposé à Quine une linguistique d'inspiration tout autre. Là où Quine, héritier du behaviorisme, voulait expliquer l'acquisition du langage par le conditionnement de dispositions verbales observables, Chomsky fait valoir la pauvreté du stimulus : l'enfant maîtrise sa langue bien au-delà de ce que son exposition limitée pourrait lui apprendre, ce qui suppose des structures innées. Chomsky a de plus contesté le statut de l'indétermination de la traduction, y voyant non un phénomène singulier mais un simple cas de la sous-détermination ordinaire de toute théorie par ses données, sans portée philosophique particulière. Quine a maintenu que l'indétermination était d'une autre espèce : non pas notre ignorance d'un fait qui existerait, mais l'absence de tout fait à connaître. Le différend touche à la question de savoir s'il existe, en matière de signification, des faits que nos méthodes ne feraient qu'approcher, ou s'il n'y a là rien à approcher du tout.
=== Le retour de la nécessité et la question des normes ===
On a dit comment Saul Kripke et la nouvelle théorie de la référence ont rouvert, contre les interdits quiniens, le dossier de la nécessité et de l'essence. Une autre objection, plus interne, vise l'épistémologie naturalisée. Si la théorie de la connaissance se réduit à la description psychologique de la façon dont nous formons nos croyances, que devient sa dimension normative, sa fonction d'évaluer ce qui justifie une croyance et ce qui ne la justifie pas ? Jaegwon Kim a soutenu qu'une épistémologie purement descriptive cesse d'être une épistémologie, faute de pouvoir dire ce que nous devrions croire.<ref>Jaegwon Kim, « What is “Naturalized Epistemology”? », ''Philosophical Perspectives'', vol. 2, 1988, p. 381-405.</ref> Quine a répondu que la norme n'est pas abolie, mais reconduite à une visée pratique : l'épistémologie normative devient une sorte de technologie de la recherche de la [[Dictionnaire de philosophie/Vérité|vérité]], qui étudie, à l'intérieur de la science, par quels moyens on prédit le mieux l'expérience. Les règles de la bonne méthode sont des conseils d'ingénieur, ajustés à une fin, et non des décrets d'une raison souveraine antérieure à toute science. La question de savoir si cette réponse suffit demeure l'un des points vifs de la discussion contemporaine.
== Conclusion ==
L'unité de l'œuvre de Quine tient à une attitude plus qu'à un système. C'est l'attitude de qui refuse tout point d'appui extérieur à la science et travaille toujours du dedans, du sein de nos croyances, sans sol ferme ni certitude première. De ce parti pris découlent, par enchaînement, ses thèses les plus discutées : si nul énoncé n'affronte seul l'expérience, alors le partage de l'analytique et du synthétique s'efface, alors la logique perd son immunité, alors la signification se réduit à ce que le comportement public peut porter, alors la connaissance n'a d'autre juge qu'elle-même. La barbe de Platon tombée sous le rasoir, le mythe du musée dissipé, le rêve de la philosophie première abandonné, il ne reste qu'un univers sobre, des objets et des classes, et une science qui se reconstruit en pleine mer comme le bateau de Neurath, planche après planche. On peut tenir cette austérité pour une perte ou pour une libération. Mais on ne fait plus de l'[[Dictionnaire de philosophie/Métaphysique|ontologie]], de l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] ou de la philosophie du langage sans passer par les questions que Quine a posées, ni sans se situer, fût-ce pour s'en écarter, par rapport aux réponses qu'il a avancées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Quine traduites en français ===
* ''Le mot et la chose'' [''Word and Object'', 1960], traduction de Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977.
* ''Du point de vue logique. Neuf essais logico-philosophiques'' [''From a Logical Point of View'', 1953], traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.
* ''Relativité de l'ontologie et autres essais'' [''Ontological Relativity and Other Essays'', 1969], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1977.
* ''Philosophie de la logique'' [''Philosophy of Logic'', 1970], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1975.
* ''Méthodes de logique'' [''Methods of Logic'', 1950], traduction de Maurice Clavelin, Paris, Armand Colin, 1973.
* ''Les voies du paradoxe et autres essais'' [''The Ways of Paradox and Other Essays'', 1966], Paris, Vrin, 2011.
* ''La poursuite de la vérité'' [''Pursuit of Truth'', 1990], traduction de Maurice Clavelin, Paris, Seuil, 1993.
* ''Quiddités. Dictionnaire philosophique par intermittence'' [''Quiddities. An Intermittently Philosophical Dictionary'', 1987], traduction de Dominique Goy-Blanquet et Thierry Marchaisse, Paris, Seuil, 1992.
=== Principales œuvres non traduites en français ===
* ''Mathematical Logic'', Cambridge (Mass.), Harvard University Press, 1940.
* ''Set Theory and Its Logic'', Cambridge (Mass.), Harvard University Press, 1963.
* ''The Roots of Reference'', La Salle (Illinois), Open Court, 1974.
* ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981.
* ''The Time of My Life. An Autobiography'', Cambridge (Mass.), The MIT Press, 1985.
* ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995.
=== Études ===
* {{Ouvrage|langue=en|prénom1=Edward|nom1=Becker|titre=The Themes of Quine's Philosophy|sous-titre=Meaning, Reference, and Knowledge|lieu=Cambridge|éditeur=Cambridge University Press|année=2012}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=Quintessence|sous-titre=Basic Readings from the Philosophy of W. V. Quine|lieu=Cambridge (Mass.)|éditeur=The Belknap Press of Harvard University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Frederique|nom1=Janssen-Lauret|responsabilité1=dir.|titre=Quine, Structure, and Ontology|lieu=Oxford|éditeur=Oxford University Press|année=2020}}
* {{Ouvrage|prénom1=Paul|nom1=Gochet|titre=Quine en perspective|sous-titre=essai de philosophie comparée|lieu=Paris|éditeur=Flammarion|année=1978}}
* {{Ouvrage|prénom1=Sandra|nom1=Laugier|titre=L'anthropologie logique de Quine|sous-titre=l'apprentissage de l'obvie|lieu=Paris|éditeur=Vrin|année=1992}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=The Cambridge Companion to Quine|lieu=Cambridge|éditeur=Cambridge University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Peter|nom1=Hylton|titre=Quine|lieu=Londres|éditeur=Routledge|année=2007}}
* {{Ouvrage|langue=en|prénom1=Alex|nom1=Orenstein|titre=W. V. Quine|lieu=Chesham|éditeur=Acumen|année=2002}}
* {{Ouvrage|langue=en|prénom1=Christopher|nom1=Hookway|titre=Quine|sous-titre=Language, Experience and Reality|lieu=Cambridge|éditeur=Polity Press|année=1988}}
* {{Ouvrage|langue=en|prénom1=Gilbert|nom1=Harman|prénom2=Ernest|nom2=Lepore|responsabilité1=dir.|titre=A Companion to W. V. O. Quine|lieu=Chichester|éditeur=Wiley-Blackwell|année=2014}}
* {{Ouvrage|langue=en|prénom1=Eve|nom1=Gaudet|titre=Quine on Meaning|sous-titre=The Indeterminacy of Translation|lieu=Londres|éditeur=Continuum|année=2006}}
* {{Ouvrage|langue=en|prénom1=Lewis Edwin|nom1=Hahn|prénom2=Paul Arthur|nom2=Schilpp|responsabilité1=dir.|titre=The Philosophy of W. V. Quine|lieu=La Salle (Illinois)|éditeur=Open Court|année=1986|collection=The Library of Living Philosophers}}
== Voir aussi ==
* [[Dictionnaire de philosophie/Empirisme|Empirisme]]
* [[Dictionnaire de philosophie/Épistémologie|Épistémologie]]
* [[Dictionnaire de philosophie/Métaphysique|Métaphysique]]
* [[Dictionnaire de philosophie/Existence|Existence]]
* [[Dictionnaire de philosophie/Vérité|Vérité]]
* [[Dictionnaire de philosophie/Convention|Convention]]
* [[Dictionnaire de philosophie/A priori|A priori]]
* [[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
* [[Dictionnaire de philosophie/Moritz Schlick|Moritz Schlick]]
* [[Dictionnaire de philosophie/Scepticisme|Scepticisme]]
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Quine, Willard Van Orman}}
owakfv7lyarsw5zppkpiuhhtgzoouo9
768271
768247
2026-06-21T17:45:07Z
PandaMystique
119061
768271
wikitext
text/x-wiki
{{DicoPhilo|Willard Van Orman Quine}}
[[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]]
Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme logique lui-même les outils qu'il en avait reçus. Son nom reste attaché à quelques gestes critiques qui ont reconfiguré la discipline : la mise en cause de la distinction entre vérités analytiques et vérités synthétiques, l'abandon de l'idée d'une [[Dictionnaire de philosophie/Métaphysique|philosophie première]] antérieure à la science, et la thèse, longtemps reçue comme un paradoxe, selon laquelle la traduction d'une langue dans une autre demeure indéterminée. À ces gestes critiques répond une construction patiente : un naturalisme qui range l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] parmi les sciences de la nature, une conception holiste de la [[Dictionnaire de philosophie/Connaissance|connaissance]] où nos énoncés ne se mesurent pas isolément à l'expérience, mais à l'intérieur d'ensembles théoriques plus ou moins vastes, et un critère précis pour décider de ce qu'une théorie tient pour existant.
Quine écrit une prose dense, ironique, parsemée de formules qui se retiennent : « Être, c'est être la valeur d'une variable liée », « pas d'entité sans identité », « aucun énoncé n'est à l'abri d'une révision ». Cette élégance n'est pas un ornement. Elle traduit une exigence constante d'économie : se contenter des hypothèses les moins nombreuses et les plus claires qui suffisent à la tâche, comme un cartographe qui ne retient d'un territoire que les traits utiles au voyageur. Ce goût de la sobriété, Quine l'avouait volontiers en parlant de sa préférence pour « les paysages désertiques » : un monde ontologiquement maigre, mais net.
== Repères biographiques ==
=== Akron, Oberlin et la découverte de la logique ===
Quine naît le 25 juin 1908 à Akron, dans l'Ohio. Au lycée, il choisit la filière scientifique, manifeste un don pour les mathématiques, gagne un concours de poésie et, plusieurs étés de suite, dessine et vend des cartes des environs. Ce plaisir des cartes et cette passion du voyage ne le quitteront pas : des décennies plus tard, il rédigera pour la ''New York Review of Books'' des recensions d'atlas, et son ami Burton Dreben, devant le nombre de lieux mentionnés dans son autobiographie, suggérera de l'intituler non ''The Time of My Life'' mais « un camion de déménagement ». La lecture d{{'}}''Eureka'' d'Edgar Poe, qui transmet l'ivresse de comprendre l'univers, compte parmi ses premières émotions philosophiques, en même temps qu'un scepticisme précoce en matière religieuse. La dernière année de lycée éveille un intérêt durable pour le langage, la grammaire et l'étymologie.
Entré à l'Oberlin College en 1926, il hésite entre les mathématiques, la philosophie et les lettres classiques. Un compagnon de poker lui apprend qu'un certain Bertrand Russell aurait une « philosophie mathématique ». Quine y voit le moyen de réunir deux de ses penchants : il choisit les mathématiques, complétées par des lectures dirigées en philosophie des mathématiques. Personne, à Oberlin, ne connaît alors les travaux récents de Frege, de Russell ou de Whitehead ; son directeur lui compose, avec une aide extérieure, une liste de lectures qui inclut les ''Principia Mathematica'' de Whitehead et Russell. En 1929, son mémoire de fin d'études généralise une formule empruntée à Couturat et la démontre dans le formalisme strict des ''Principia''. Sa première publication savante, un compte rendu de l'ouvrage de Nicod sur les fondements de la géométrie et de l'induction, paraît dans l{{'}}''American Mathematical Monthly''.
=== Harvard et la renaissance européenne ===
[[Fichier:Russell1907-2.jpg|vignette|upright=1|Bertrand Russell vers 1907. Sa venue à Harvard en 1931 fut, selon Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell joua dans son œuvre le rôle d'un rival admiré dont les thèses appelaient des solutions de rechange.]]
Quine choisit Harvard pour ses études doctorales, parce que son département de philosophie est alors le plus fort en logique du pays : on y trouve Alfred North Whitehead, le coauteur des ''Principia''. Il y soutient en deux ans une thèse intitulée « The Logic of Sequences: A Generalization of Principia Mathematica ». Une préoccupation y affleure déjà, qui ne le quittera plus : celle de l'ontologie, de la question de savoir ce qu'il y a. Là où les ''Principia'' admettent des fonctions propositionnelles, c'est-à-dire des propriétés, donc des entités intensionnelles, Quine cherche à parvenir aux mêmes fins avec des objets extensionnels comme les classes. La même année 1931, Russell vient donner une conférence à Harvard : ce sera, dira Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell restera une présence centrale, à la manière d'un rival dont les positions appellent des solutions de rechange plus acceptables.
Vient ensuite ce que Quine nomme sa renaissance en Europe centrale. Titulaire en 1932-1933 d'une bourse de voyage, il séjourne à Vienne, à Prague et à Varsovie. À Vienne, il assiste aux réunions du Cercle de Vienne et fait la connaissance de Neurath, de [[Dictionnaire de philosophie/Moritz Schlick|Schlick]], de Gödel, de Hahn et de Menger. À Prague, il rencontre Rudolf Carnap, suit ses cours et lit en tapuscrit allemand sa ''Syntaxe logique du langage''. Carnap deviendra une influence aussi forte que Russell, et le débat qui les opposera durant des décennies comptera parmi les échanges majeurs du siècle. À Varsovie, Quine suit les leçons de Leśniewski, de Łukasiewicz et de Tarski, et noue avec l'école polonaise une sympathie durable pour son extensionnalisme et sa parcimonie ontologique. Il décrira ces semaines de Prague et de Varsovie comme « les mois les plus enrichissants » qu'il ait connus.
=== Le professeur de Harvard ===
De retour à Harvard en 1933, Quine est élu Junior Fellow de la Society of Fellows, ce qui le libère de toute charge d'enseignement pendant trois ans. C'est dans cette période qu'il met au point trois de ses positions distinctives : sa conception de l'engagement ontologique, ses systèmes de logique les plus connus, dont les « New Foundations for Mathematical Logic » de 1937, et la première phase de sa critique de la vérité dite analytique, esquissée dans « Truth by Convention » (1936). Son behaviorisme, soit dit en passant, ne date pas de sa fréquentation de B. F. Skinner, autre Junior Fellow, mais de ses lectures de Watson au temps du collège.
Sa facilité pour les langues se manifeste en 1942 : alors qu'il s'est déjà porté volontaire pour la marine, Quine ajourne son engagement afin d'enseigner quatre mois durant à São Paulo, en portugais, langue dont il avait pris les rudiments aux Açores, et il tire de ces leçons un manuel de logique rédigé dans cette langue. Il sert ensuite plus de trois ans dans la marine des États-Unis, où il travaille au déchiffrement des communications des sous-marins allemands et atteint le grade de capitaine de corvette. Professeur titulaire à Harvard à partir de 1948, puis titulaire de la chaire Edgar Pierce de philosophie, il y enseignera jusqu'à sa retraite, en 1978. Ses textes les plus discutés s'échelonnent sur ces décennies : « De ce qui est » (1948), « Deux dogmes de l'empirisme » (1951), le recueil ''Du point de vue logique'' (1953), puis l'ouvrage qui condense sa philosophie, ''Le mot et la chose'' (1960). Suivront « La relativité de l'ontologie » (1968) et « L'épistémologie naturalisée » (1969). La retraite ne ralentit ni sa production ni son influence : il publie encore ''Theories and Things'' (1981), son autobiographie ''The Time of My Life'' (1985), le dictionnaire ''Quiddités'' (1987), ''La poursuite de la vérité'' (1990) et ''From Stimulus to Science'' (1995). Il meurt le 25 décembre 2000.
== L'héritage de l'empirisme logique ==
On comprend mal Quine si on ne le situe pas dans la tradition qu'il prolonge et conteste à la fois. Cette tradition est celle de l'empirisme logique, né de la rencontre entre la nouvelle logique de Frege et de Russell et le programme du Cercle de Vienne. Carnap en avait donné l'exposé le plus soigné, autour de trois thèses. La première est le critère de vérifiabilité : une phrase n'a de signification empirique que si l'on peut indiquer les observations qui la confirmeraient ou l'infirmeraient. La deuxième fait du savoir a priori, celui des mathématiques et de la logique, un savoir purement linguistique : ces vérités seraient vraies en vertu des seules conventions de notre langage, non de quelque fait du monde. La troisième tient la métaphysique pour dépourvue de sens, simple jeu de mots sans portée cognitive. Ce résumé en trois points est une commodité d'exposition, non un portrait figé : la pensée de Carnap se déplace beaucoup, de l{{'}}''Aufbau'' à la syntaxe logique, puis à la sémantique et au principe de tolérance, et c'est avec chacune de ces étapes que Quine dialogue.
Quine partage le point de départ empiriste : toute la matière probante de la science est sensorielle, et l'apprentissage des mots repose en dernière instance sur l'expérience. Mais il va soumettre chacune des trois thèses à un examen qui en démonte les ressorts. Le réductionnisme attaché au critère de vérifiabilité supposait que chaque énoncé possède, pris isolément, un contenu empirique propre ; Quine y opposera le holisme. L'idée d'une vérité purement analytique, qui isolait le linguistique du factuel, lui paraîtra reposer sur un cercle. Quant à la métaphysique, Quine ne la réhabilite pas sous sa forme classique, mais il refuse qu'on tranche d'un trait les questions d'existence : la question « qu'y a-t-il ? » est pour lui sur le même plan que les questions de la science naturelle. Ce que Carnap croyait pouvoir séparer, Quine le tient pour un continuum. Tel est le ressort de son œuvre : un empirisme qui se retourne sur ses propres présupposés et en abandonne les deux dogmes.
== Qu'est-ce qui existe ? L'engagement ontologique ==
=== La barbe de Platon ===
« Qu'y a-t-il ? » Le problème de l'ontologie, observe Quine au seuil de « De ce qui est »<ref>W. V. O. Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', trad. sous la dir. de Sandra Laugier, Paris, Vrin, 2003 (éd. originale ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953). La « barbe de Platon » et l'énigme du non-être ouvrent l'essai (''From a Logical Point of View'', ci-après ''FLPV'', p. 2) ; le débat avec Wyman et le « bidonville des possibles » figurent p. 4.</ref>, a ceci de curieux qu'il s'énonce en trois mots et se résout en un seul : il y a tout ce qu'il y a. Chacun l'accordera. Le désaccord ne porte jamais sur cette formule vide, mais sur les cas. Or les cas suscitent une difficulté logique que Quine met en scène par une petite comédie philosophique. Supposons que deux penseurs, qu'il nomme McX et lui-même, divergent sur l'[[Dictionnaire de philosophie/Existence|existence]] de quelque chose. McX affirme qu'il y a une certaine entité ; Quine le nie. Comment Quine peut-il seulement formuler son désaccord ? S'il dit « il y a une chose que McX admet et que je rejette », il se contredit, car il vient d'admettre l'existence de ce qu'il prétendait refuser. Le partisan du non semble condamné à ne pouvoir dire ce qu'il nie.
C'est l'antique énigme du non-être : le non-être doit en quelque façon être, sinon qu'est-ce donc qui n'est pas ? Quine surnomme cette doctrine enchevêtrée « la barbe de Platon », tant elle a, dit-il, émoussé le rasoir d'Occam. Elle pousse certains à conférer une forme d'être à ce qui n'en a aucune. Prenons Pégase. Si Pégase n'était rien, raisonne McX, nous ne parlerions de rien en prononçant ce nom, et il serait absurde de dire même que Pégase n'est pas ; donc Pégase, en un sens, est. Pressé d'en dire davantage, McX se réfugie dans l'idée que Pégase est « une idée dans les esprits ». Mais c'est confondre le Parthénon avec l'idée du Parthénon. Le Parthénon est de pierre, visible ; l'idée du Parthénon est mentale, invisible. Nul ne les confond. Quand nous nions Pégase, ce n'est pas une image mentale que nous nions, c'est un cheval ailé de chair et de sang dont nous disons qu'il n'existe nulle part.
Un esprit plus subtil, que Quine appelle Wyman, soutient que Pégase « subsiste » comme un possible non actualisé. Dire que Pégase n'existe pas reviendrait seulement à dire qu'il n'a pas l'attribut d'actualité, comme on dirait que le Parthénon n'est pas rouge. Cette manœuvre peuple l'univers d'une foule d'êtres fantomatiques. Quine en montre l'incohérence par une série de questions désopilantes. Combien d'hommes possibles se tiennent dans cette embrasure de porte ? Le gros possible et le chauve possible sont-ils le même, ou deux ? Y a-t-il plus de minces possibles que de gros ? Sont-ils tous distincts, ou bien deux choses qui se ressemblent en tout ne font-elles qu'une ? À ces possibles inactuels, on ne sait même pas appliquer la notion d'identité. Et que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ? Le « bidonville des possibles » est, conclut Quine, un foyer d'éléments désordonnés. Mieux vaut le raser.
=== La leçon de Russell : décrire au lieu de nommer ===
La sortie de cette impasse, Quine la trouve dans la théorie russellienne des descriptions définies, qu'il tient pour un modèle d'analyse. Le piège tenait à ce que nous traitions « Pégase » comme un nom, un terme qui, pour avoir un sens, devrait désigner un objet. Russell avait montré comment se passer de cette supposition. Au lieu de « Pégase n'existe pas », qui paraît présupposer Pégase, paraphrasons : « il n'existe rien qui soit à la fois ailé, chevalin et unique en son genre. » L'énoncé devient une quantification existentielle niée : il n'y a aucun x tel que x soit Pégase. Le nom embarrassant a disparu, dissous dans un jeu de variables et de quantificateurs ; et il ne reste plus, pour porter un poids ontologique, que ce sur quoi nous quantifions. La phrase peut être fausse, c'est-à-dire nier l'existence de quelque chose, sans présupposer cette existence. L'énigme du non-être s'évanouit avec la grammaire qui l'avait engendrée.
De là résulte un déplacement capital. Ce ne sont pas les noms qui engagent une théorie à l'existence de quoi que ce soit, car tout nom peut être analysé à la façon de « Pégase ». Le poids ontologique se concentre dans les variables liées par les quantificateurs « il existe un… » et « pour tout… ». Dire « il existe quelque chose qui est un chien » suffit à s'engager sur les chiens, sans qu'on ait à les nommer. C'est pourquoi Quine peut soutenir que la prédication, plus que la dénomination, fait le fond de la référence : un prédicat comme « est humain » s'applique à Socrate, à Platon, à d'autres, et ce sont là précisément les valeurs que doivent prendre les variables pour que les énoncés où figure ce prédicat soient vrais.
=== « Être, c'est être la valeur d'une variable liée » ===
De ce constat naît le critère de l'engagement ontologique, ramassé dans une formule devenue célèbre : « Être, c'est être la valeur d'une variable liée. »<ref>La formule « être, c'est être la valeur d'une variable » (« To be is to be the value of a variable ») se trouve dans « De ce qui est » (''FLPV'', p. 15).</ref> L'univers des entités, écrit Quine, est l'étendue des valeurs des variables. Pour savoir à quels objets une théorie s'engage, il ne faut pas examiner les noms ni les prédicats qu'elle emploie, mais demander quelles entités doivent figurer parmi les valeurs de ses variables pour que ses énoncés soient vrais. Une variable, suggère-t-il par une image éclairante, est une sorte de pronom : « x » fonctionne comme le « il » d'une langue, terme provisoirement indéterminé qui attend, dans le champ d'un quantificateur, de se voir attribuer des valeurs.
Ce critère a une vertu de clarté. Il transforme une question métaphysique notoirement floue, « qu'est-ce qui existe ? », en une question précise sur la forme logique de nos théories, « sur quoi cette théorie quantifie-t-elle ? ». Encore faut-il, pour le mettre en œuvre, disposer d'une langue régimentée. Une phrase du langage ordinaire est souvent trop équivoque pour qu'on lise à même elle ses présuppositions. Quine propose donc de la reformuler dans une notation canonique : celle de la logique des prédicats du premier ordre, avec ses variables, ses quantificateurs et ses fonctions de vérité. Cette régimentation n'est pas une description de la langue naturelle, mais une réforme, entreprise au nom de la clarté et de l'économie. Une fois la théorie ainsi mise au net, ses engagements se lisent à livre ouvert : ce sont les objets sur lesquels portent ses variables liées. Il importe de ne pas se méprendre sur la portée de ce critère. Il ne tranche pas, par lui-même, ce qui existe ; il dit seulement à quoi une théorie s'engage lorsqu'on la tient pour vraie et qu'on l'a reformulée en langue logique. Le critère n'est pas un oracle métaphysique, mais une méthode pour lire les engagements d'une théorie déjà admise ou mise à l'examen. Reste ensuite la question, distincte, de savoir quelle théorie nous avons les meilleures raisons d'accepter.
Reste à savoir ce que Quine, pour sa part, accepte d'inscrire à l'inventaire du monde. Sa réponse penche vers la sobriété : des objets physiques, entendus largement comme les contenus matériels de régions de l'espace-temps, fussent-elles discontinues, et, parce que la science, et en particulier les mathématiques, ne peut s'en passer, des classes, c'est-à-dire des ensembles, admis pour leur puissance théorique autant que pour la netteté de leurs critères d'identité. Les premiers fournissent l'ameublement concret ; les secondes, l'ossature abstraite sans laquelle on ne peut formuler les lois quantitatives de la physique. Quine résiste en revanche aux propriétés, aux significations et aux propositions, qu'il tient pour des entités intensionnelles mal individuées. Sa raison est toujours la même, et elle a valeur de maxime : « pas d'entité sans identité. »<ref>La maxime « pas d'entité sans identité » (« No entity without identity ») est formulée dans « Parler d'objets » (« Speaking of Objects »), repris dans ''Relativité de l'ontologie et autres essais'', trad. Jean Largeault, Paris, Aubier-Montaigne, 1977 (''Ontological Relativity and Other Essays'', ci-après ''OR'', New York, Columbia University Press, 1969, p. 23).</ref> Une entité n'est admissible que si l'on peut dire à quelle condition elle est identique à une autre ou en diffère. Les classes satisfont à cette exigence, car deux classes sont identiques si et seulement si elles ont les mêmes éléments. Les propriétés n'y satisfont pas : nul critère ne dit quand « avoir un cœur » et « avoir des reins », vrais des mêmes êtres, expriment une seule propriété ou deux. Faute d'identité, point d'entité ; et c'est tout un pan de l'ontologie traditionnelle qui se trouve congédié au nom de cette discipline.
== Les deux dogmes de l'empirisme ==
Paru en 1951, « Deux dogmes de l'empirisme » est sans doute l'un des articles les plus lus et les plus discutés de la philosophie analytique.<ref>W. V. O. Quine, « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', éd. citée (« Two Dogmas of Empiricism », ''FLPV'', p. 20-46). L'article parut d'abord dans ''The Philosophical Review'' en janvier 1951.</ref> Quine y dénonce deux croyances que l'empirisme moderne partageait sans les interroger : la distinction entre énoncés analytiques et énoncés synthétiques, et le réductionnisme, c'est-à-dire l'idée que chaque énoncé, pris à part, possède un contenu empirique propre. Ces deux dogmes, montre-t-il, sont liés à la racine, et leur abandon transforme la figure de l'empirisme.
=== Le premier dogme : la distinction analytique et synthétique ===
L'opposition vient de loin. Kant distinguait les jugements analytiques, où le concept du prédicat est déjà contenu dans celui du sujet (« tous les corps sont étendus »), des jugements synthétiques, qui ajoutent au sujet une information nouvelle (« tous les corps sont pesants »). Les empiristes logiques avaient repris la distinction sous une forme linguistique : est analytique l'énoncé vrai en vertu des seules significations des mots qui le composent, indépendamment de tout fait du monde. « Aucun célibataire n'est marié » serait de ce type : il suffit de comprendre les mots pour en reconnaître la vérité. Cette catégorie était précieuse, car elle offrait un asile aux vérités de la logique et des mathématiques. Si ces vérités sont analytiques, on peut les tenir pour certaines et nécessaires sans renoncer au principe empiriste selon lequel tout savoir procède de l'expérience : elles ne disent rien sur le monde, elles explicitent notre langage.
Quine ne conteste pas qu'il existe des énoncés que tout le monde range spontanément du côté de l'analytique. Il conteste qu'on puisse rendre cette notion claire. Sa stratégie consiste à demander qu'on lui explique « analytique » sans tourner en rond. Une première classe d'énoncés analytiques, les vérités logiques au sens strict comme « aucun homme non marié n'est marié », ne pose pas de problème : elles restent vraies sous toute réinterprétation de leurs termes non logiques. La difficulté commence avec la seconde classe, celle de « aucun célibataire n'est marié », qui ne devient une vérité logique que si l'on remplace « célibataire » par son synonyme « homme non marié ». Tout repose alors sur la notion de synonymie, c'est-à-dire d'identité de signification. Or qu'est-ce que la synonymie ? Si l'on répond qu'elle se fonde sur les définitions, Quine objecte que les définitions du dictionnaire ne font que consigner des synonymies déjà admises : le lexicographe rapporte un usage, il ne le crée pas, sauf dans le cas particulier de la stipulation explicite. Si l'on répond que deux termes sont synonymes lorsqu'ils sont interchangeables partout sans changer la valeur de vérité, Quine montre que ce critère, dans un langage extensionnel, ne garantit que la coextensivité, non l'identité de signification ; et que, pour exclure les coïncidences accidentelles, on doit faire appel à une notion de nécessité, laquelle reconduit en sous-main à l'analyticité que l'on cherchait à définir. Le cercle se referme : analyticité, synonymie, définition, nécessité forment une famille de notions qui se renvoient les unes aux autres sans qu'aucune prenne pied hors du cercle.
On objectera qu'il suffit de poser des règles sémantiques, comme le proposait Carnap, qui spécifieraient pour un langage donné quels énoncés y sont analytiques. Quine répond que cela déplace la difficulté sans la résoudre. Une liste de règles nous apprend quels énoncés sont appelés analytiques dans tel langage artificiel ; elle ne nous apprend pas ce que signifie le mot « analytique » lui-même, ce que ces énoncés ont en commun qui justifierait l'étiquette. On nous explique « analytique-dans-le-langage-L », pour un L particulier, mais non l'adjectif « analytique » en général, qui seul nous intéresse. La notion demeure, selon le mot de Quine, un article de foi métaphysique au cœur même de l'empirisme.
Il faut se garder, sur ce point, d'une lecture trop tranchée. Quine ne nie pas qu'il existe des énoncés que l'usage range du côté de l'analytique, ni qu'on puisse, dans un langage construit, fixer par convention quels énoncés y seront tenus pour tels. Le Quine tardif va plus loin : dans ''Les racines de la référence'' (1974), il propose même un critère comportemental de l'analyticité, un énoncé étant analytique lorsque tout locuteur en apprend la vérité en même temps qu'il apprend les mots qui le composent. Selon ce critère, « aucun célibataire n'est marié » et l'essentiel de la logique élémentaire ressortissent bien à l'analytique. Ce que Quine combat n'est donc ni l'analyticité ordinaire ni l'analyticité réglée d'un langage formel, mais une troisième notion, plus ambitieuse : celle qui prétendrait fonder en raison la nécessité des mathématiques et tracer entre l'a priori et l'empirique la frontière étanche dont Carnap avait besoin. Cette analyticité forte, son critère ne la livre pas, car les mathématiques n'en relèvent pas. C'est elle, et elle seule, que « Deux dogmes » entreprend de dissoudre.<ref>Sur le critère tardif de l'analyticité, voir W. V. O. Quine, ''The Roots of Reference'', La Salle, Open Court, 1974, p. 78-80 (ouvrage non traduit en français), et l'analyse de Richard Creath, « Quine on the Intelligibility and Relevance of Analyticity », dans ''The Cambridge Companion to Quine'', éd. citée, p. 47-64.</ref>
=== Le second dogme : le réductionnisme ===
Le second dogme est le réductionnisme, sous sa forme moderne : la croyance que tout énoncé doué de sens est traduisible en un énoncé portant sur l'expérience immédiate, ou du moins qu'à chaque énoncé est associé un domaine d'expériences qui le confirmeraient et un autre qui l'infirmeraient. C'est la version de la théorie vérificationniste de la signification qui rattache le contenu d'une phrase aux observations qui la vérifient. Quine fait observer que ce dogme est le pendant du premier. Car si chaque énoncé avait son contenu empirique propre, on pourrait définir l'analyticité comme le cas limite : serait analytique l'énoncé dont le contenu empirique est vide, qui se confirme quoi qu'il arrive. Les deux dogmes sont, dit-il, identiques à la racine.
Or le réductionnisme ne résiste pas à l'examen. Quine y oppose un argument qu'il emprunte au physicien et historien des sciences Pierre Duhem : on ne peut pas soumettre à l'expérience une hypothèse isolée. Quand une prédiction tirée d'une théorie se trouve démentie, l'expérience ne nous dit pas quel énoncé est en faute. Elle frappe la théorie comme un tout, et c'est à nous de répartir le blâme. Nous pouvons abandonner l'hypothèse mise à l'épreuve, mais nous pouvons aussi mettre en cause une loi auxiliaire, une condition initiale, un principe de l'instrument de mesure, voire, en dernier recours, une règle de la logique. Aucun énoncé ne se présente seul devant le tribunal de l'expérience. Il n'y a donc pas de contenu empirique attaché à l'énoncé pris isolément ; ce contenu n'appartient qu'à des ensembles d'énoncés, et, à la limite, à la science tout entière. L'unité de signification empirique n'est pas la phrase, mais le système. Voilà qui prive le réductionnisme de son objet et, du même coup, ruine l'espoir de définir l'analyticité comme degré zéro du contenu empirique. En tombant, le second dogme entraîne le premier.
== Le holisme et la révision des croyances ==
Une fois les deux dogmes écartés, l'empirisme prend un autre visage, que Quine peint dans la dernière partie de « Deux dogmes » à l'aide d'une image souvent reprise. La totalité de notre savoir, des vérités les plus quotidiennes de la géographie aux lois de la physique atomique et jusqu'aux théorèmes de la logique, forme un tissu fait de main d'homme qui ne touche l'expérience que par ses bords. Ou, pour changer de figure, la science tout entière est comme un champ de forces dont les conditions aux limites sont l'expérience. Un conflit avec l'expérience, à la périphérie, oblige à des réajustements à l'intérieur du champ : il faut redistribuer des valeurs de vérité sur certains de nos énoncés. Mais le champ est si lâchement déterminé par ses bords que nous gardons une large latitude quant aux énoncés à réviser à la lumière d'une expérience contraire donnée. Aucune expérience particulière n'est liée à un énoncé particulier de l'intérieur du champ, sinon de façon indirecte, par les exigences d'équilibre qui affectent le champ comme un tout.<ref>« Deux dogmes de l'empirisme », sixième section, « L'empirisme sans les dogmes » : le « tissu fait de main d'homme » et le « champ de forces » sont décrits p. 42, « aucun énoncé n'est à l'abri d'une révision » p. 43, les « dieux d'Homère » p. 44 et le « pragmatisme plus poussé » p. 46 (''FLPV'', éd. citée).</ref>
De cette image se déduisent les deux formules les plus frappantes de l'article. Premièrement : tout énoncé peut être tenu pour vrai quoi qu'il arrive, pourvu que nous fassions des ajustements assez énergiques ailleurs dans le système. Même un énoncé proche de la périphérie peut être maintenu en dépit d'une expérience récalcitrante, en plaidant l'hallucination ou en retouchant certaines des lois dites logiques. Deuxièmement, et inversement : aucun énoncé n'est à l'abri d'une révision. On a même proposé de réviser la loi logique du tiers exclu pour simplifier la mécanique quantique ; et quelle différence de principe y a-t-il entre un tel changement et celui par lequel Kepler a supplanté Ptolémée, ou Einstein Newton, ou Darwin Aristote ? Les énoncés de la logique et des mathématiques ne jouissent d'aucune immunité spéciale ; ils occupent seulement une position centrale dans le réseau, loin des bords, là où peu de connexions avec une expérience particulière s'imposent. C'est pourquoi nous hésitons davantage à les abandonner : leur révision aurait des répercussions étendues. Cette résistance est affaire de degré, non de nature.
Ce holisme renverse la hiérarchie héritée. Il n'y a plus de partage tranché entre des [[Dictionnaire de philosophie/Croyance|croyances]] purement empiriques, qui affronteraient seules l'expérience, et des vérités purement formelles, qui en seraient à l'abri. Toutes nos croyances tiennent ensemble par leurs liens logiques, et c'est l'ensemble qui se confronte au monde. Les énoncés de la logique, des mathématiques, de l'ontologie, sont au cœur du réseau ; ceux de l'histoire et de la perception, à sa marge. Mais ce ne sont là que des positions relatives sur une même étoffe, non des espèces hétérogènes.
Pour rendre ces distances tangibles, Quine recourt à des exemples ordinaires. Qu'une expérience nous surprenne, et, selon les cas, nous y ferons face en corrigeant l'énoncé qu'il y a des maisons de brique dans telle rue, ou bien l'énoncé qu'il n'existe pas de centaures. De tels énoncés ont une référence empirique aiguë : ils touchent presque au bord du tissu. Les énoncés de la physique des particules, des mathématiques ou de l'ontologie, eux, gisent au centre, non parce qu'ils échapperaient à l'expérience, mais parce qu'aucune sensation particulière ne s'y noue de façon saillante. C'est pourquoi nous révisons d'abord les premiers : non par contrainte logique, mais par souci de troubler l'ensemble le moins possible.<ref>L'exemple des maisons de brique et des centaures illustre la « référence empirique aiguë » de certains énoncés (« Deux dogmes de l'empirisme », ''FLPV'', éd. citée, p. 43-44).</ref>
Quine en tire une conséquence sur le statut des objets eux-mêmes. Les objets physiques, écrit-il, sont introduits dans notre conception comme des intermédiaires commodes, non par définition à partir de l'expérience, mais à titre de simples postulats, comparables, sur le plan de la connaissance, aux dieux d'Homère. La comparaison est calculée pour choquer, et Quine en précise aussitôt la portée. Lui-même croit aux objets physiques et non aux dieux d'Homère, et il tient pour une erreur scientifique de croire le contraire. Mais quant à leur statut épistémologique, les uns et les autres ne diffèrent que par degré : tous deux entrent dans notre conception comme des entités posées par la culture. Le mythe des objets physiques l'emporte sur les autres en ceci qu'il s'est révélé plus efficace qu'eux pour ménager une structure maniable dans le flux de l'expérience. Postuler des corps, des atomes, des forces, des classes, c'est se donner des instruments d'organisation et de prédiction ; la science continue en cela le geste du sens commun, qui gonfle l'ontologie pour simplifier la théorie.
Deux notions complètent ce tableau et l'éloignent du relativisme facile auquel on le réduit parfois. La première est la sous-détermination des théories par l'expérience : pour un même corps de données possibles, plusieurs théories rivales, incompatibles entre elles, peuvent rendre compte également bien des observations. Les bords du champ ne fixent pas son intérieur. La seconde est que ce jeu n'est pas arbitraire. Quand l'expérience nous contraint à retoucher notre système, deux forces guident notre choix : un conservatisme qui nous porte à déranger le système le moins possible, et une quête de simplicité qui nous fait préférer les hypothèses les plus économiques. Carnap, Lewis et d'autres adoptaient une attitude pragmatique pour le choix entre formes de langage, mais leur pragmatisme s'arrêtait à la frontière supposée de l'analytique et du synthétique. En supprimant cette frontière, Quine étend le pragmatisme à toute la science : chacun reçoit un héritage scientifique et un flux continu de stimulations sensorielles, et les considérations qui le guident, lorsqu'il ajuste cet héritage à ces stimulations, sont, dans la mesure où elles sont rationnelles, pragmatiques. L'empirisme sans les dogmes devient un pragmatisme plus conséquent, attentif à la fois à l'expérience, qui contraint, et à la cohérence du système, qui oriente.
Quine a tempéré, avec le temps, la version forte de 1951. Dans « Two Dogmas in Retrospect » (1991), il reconnaît que faire comparaître la science tout entière à chaque épreuve allait au-delà de ce qu'exigeait sa critique du réductionnisme. Il parle désormais d'un holisme modéré. Ce qui affronte l'expérience, ce ne sont pas des énoncés isolés ; mais ce n'est pas non plus la totalité de nos croyances : ce sont des ensembles d'énoncés assez vastes pour impliquer des prédictions observables, ce qu'il nomme des « masses sémantiques critiques ». Le principe demeure, intact : aucun énoncé n'est en droit à l'abri d'une révision. En fait, pourtant, l'épreuve porte sur des fragments de théorie, non sur le système entier à chaque instant. Quine en tire même une explication de la nécessité mathématique qui se passe d'analyticité : si l'énoncé mis en cause est purement mathématique, nous nous gardons de le réviser, car y toucher ébranlerait trop le reste de la science. C'est ce qu'il appelle la maxime de mutilation minimale. Dans ce cadre, la nécessité mathématique tient à la position centrale des mathématiques dans notre système et à notre politique rationnelle de porter ailleurs les révisions, sauf coût théorique exceptionnel.<ref>W. V. O. Quine, « Two Dogmas in Retrospect », ''Canadian Journal of Philosophy'', vol. 21, 1991, p. 265-274 (ici p. 269-270) ; voir aussi ''La poursuite de la vérité'', éd. citée, chap. 1. Sur ce holisme modéré et la « masse sémantique critique », voir Roger F. Gibson (dir.), ''The Cambridge Companion to Quine'', Cambridge University Press, 2004, p. 12-13.</ref>
== La traduction radicale et l'indétermination de la signification ==
Le holisme atteignait la théorie de la confirmation. Quine va l'étendre à la théorie de la signification, et c'est l'objet central du ''Mot et la chose'' (1960). Le fil conducteur en est une exigence naturaliste : si le langage est un comportement public, appris par l'enfant au contact d'autrui dans des situations observables, alors tout ce qu'il y a à savoir sur la signification doit pouvoir se lire dans ce comportement et dans les circonstances qui l'accompagnent. Il n'y a pas, dans l'apprentissage et l'usage d'une langue, de matière cachée à laquelle le sujet aurait un accès privé. Cette contrainte, Quine la met à l'épreuve par une expérience de pensée qu'il a rendue fameuse : la traduction radicale.
=== Le linguiste de terrain ===
[[Fichier:European Rabbit 09 05 2025 02.jpg|vignette|upright=1.15|« Gavagai. » Un lapin détale, l'indigène prononce ce mot, le linguiste note « Lapin ». Mais rien dans la scène ne décide si le terme indigène vise un lapin entier, un segment temporel de lapin, ou un agrégat de parties non détachées de lapin.]]
Imaginons un linguiste qui aborde une langue jusqu'alors inconnue, sans interprète, sans dictionnaire, sans la moindre passerelle avec une langue déjà comprise. Tout ce dont il dispose, ce sont les sons que prononcent les indigènes et les circonstances visibles où ils les prononcent. C'est la situation de la traduction radicale, où l'on doit tout reconstruire à partir du seul comportement. Un lapin détale, l'indigène dit « Gavagai », et le linguiste inscrit provisoirement « Lapin » comme traduction. Pour étayer cette conjecture, il guette les occasions : il prononce lui-même « Gavagai ? » dans diverses situations et note si l'indigène marque son assentiment, son refus, ou ni l'un ni l'autre. À force d'observations, il accumule des indices et finit par tenir « Gavagai » pour synonyme de « Lapin ».
Ce que le linguiste peut établir ainsi, Quine le nomme la signification stimulante (stimulus meaning) d'une phrase d'occasion : l'ensemble des stimulations sensorielles qui disposeraient l'indigène à donner son assentiment, et l'ensemble de celles qui provoqueraient son refus. Il importe de penser ce qui déclenche l'assentiment comme une stimulation, non comme le lapin lui-même : la stimulation reste la même si l'on remplace l'animal par un leurre habile, et elle change si l'on bouche les yeux de l'indigène. Sur cette base étroite, Quine reconnaît que certains énoncés se laissent traduire avec une assurance suffisante. Ce sont les énoncés d'observation, dont l'assentiment est étroitement commandé par la stimulation présente, et qui constituent le point d'ancrage de la langue dans le monde. « Gavagai » et « Voici un lapin » sont, en ce sens limité, synonymes stimulants : ils commandent l'assentiment dans les mêmes circonstances.
=== Le lapin, ses parties et sa lapinité ===
Il faut ici dissiper une confusion fréquente, car l'exemple du lapin sert en réalité deux thèses voisines mais distinctes. Comme phrase d'observation, « Gavagai » se laisse traduire avec assurance : sa signification stimulante est déterminée, et « Voici un lapin » en est un bon équivalent. La difficulté surgit au niveau du terme. La première thèse, l'inscrutabilité de la référence, porte précisément sur les termes, sur ce que désigne le mot « gavagai » pris à part. La seconde, l'indétermination de la traduction proprement dite, est plus large : elle porte sur les phrases, et surtout sur les énoncés éloignés de l'observation, dont rien ne fixe la traduction même lorsque celle des termes serait arrêtée. Le doute entre le lapin, ses parties et ses phases relève de la première ; il en offre l'image la plus parlante, mais on aurait tort d'y réduire la seconde.
Voici le ressort de l'argument. L'accord sur la signification stimulante de « Gavagai » comme phrase ne garantit nullement que « gavagai » et « lapin » soient des termes coextensifs, vrais des mêmes choses. Car que désigne au juste « gavagai » ? Peut-être des lapins ; mais peut-être de simples segments temporels de lapins, de brèves tranches de leur durée ; ou encore l'ensemble des parties non détachées de lapins ; ou même la fusion de tous les lapins en une seule portion discontinue de l'espace-temps ; ou enfin la lapinité, ce trait universel partout où un lapin se manifeste. Dans tous ces cas, la signification stimulante serait la même. Pointer un lapin, c'est aussi bien pointer une de ses parties, un de ses instants, la fusion à laquelle il appartient, le lieu où la lapinité s'incarne. Aucune ostension, aucune désignation par le doigt ne tranche entre ces lectures, car ce qui les distingue n'est pas dans la ressemblance des stimulations, mais dans l'anatomie des phrases : dans la manière dont la langue manie l'identité, la pluralité, les articles, ce que Quine appelle l'appareil de la référence.
Or cet appareil, le linguiste ne peut le mettre en évidence qu'en posant des hypothèses sur la façon dont la langue indigène rend nos propres procédés : nos pronoms, notre copule, notre « est le même que ». Ces hypothèses, que Quine nomme hypothèses analytiques, vont au-delà de tout ce que la signification stimulante autorise. Elles sont indispensables pour passer de la traduction des phrases d'occasion à celle des termes, mais rien dans le comportement ne les impose. Le linguiste peut équivaloir « gavagai » à « lapin », ou à « segment de lapin », ou à « partie non détachée de lapin », et compenser ce choix en ajustant la traduction de l'identité et des particules associées, sans jamais entrer en conflit avec les significations stimulantes. La référence des termes étrangers reste, selon le mot de Quine, inscrutable. Les phrases d'occasion et la signification stimulante sont une monnaie commune ; les termes et la référence, eux, sont propres à notre schème conceptuel.<ref>W. V. O. Quine, ''Le mot et la chose'', § 12, trad. Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977 (''Word and Object'', Cambridge (Mass.), The MIT Press, 1960). Le lapin, ses segments, ses parties non détachées et la lapinité, ainsi que la remarque selon laquelle « l'inscrutabilité tient non à la ressemblance, mais à l'anatomie des phrases », occupent le § 12 (p. 51-53 de l'éd. de 1960).</ref>
=== Le mythe du musée ===
Derrière cet argument, Quine vise une certaine image de la signification, qu'il appelle le mythe du musée. Selon cette image, les significations seraient à nos expressions ce que les tableaux exposés dans un musée sont à leurs étiquettes : des objets fixes, indépendants des langues, que les mots se borneraient à désigner. Deux expressions seraient synonymes lorsqu'elles renvoient à une même signification, comme deux étiquettes pour un seul tableau ; et traduire un mot, ce serait lui trouver, dans une autre langue, l'étiquette qui pend au même tableau, c'est-à-dire à la même signification interlinguistique. Ce que cet argument établit, c'est qu'aucune signification de ce genre, antérieure aux langues et commune à elles, ne vient fixer la traduction. Il n'existe pas de signification de « Gavagai » qui dirait, par-delà tout comportement, s'il faut le rendre par « lapin » ou par « segment de lapin ». La signification n'est pas un objet logé dans un musée mental : elle se réduit à ce que le comportement linguistique, dans ses circonstances, peut exhiber, c'est-à-dire à la signification stimulante, bien plus pauvre que la synonymie pleine que les philosophes lui prêtaient.<ref>Le « mythe du musée », où « les pièces exposées sont des significations et les mots, des étiquettes », ouvre « La relativité de l'ontologie », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Ontological Relativity », ''OR'', p. 27).</ref>
=== L'indétermination de la traduction ===
De là procède la thèse de l'indétermination de la traduction. Deux linguistes, travaillant indépendamment sur la même langue, pourraient produire deux manuels de traduction, chacun cohérent avec la totalité du comportement verbal observable, et pourtant inconciliables entre eux : là où l'un rendrait une phrase d'une certaine façon, l'autre la rendrait d'une façon que le premier rejetterait. Aucun fait, pas même la totalité des dispositions verbales des locuteurs, ne permettrait de dire lequel a raison, car il n'y a pas, en ce domaine, de fait de l'affaire qui excède le comportement. La traduction n'est pas seulement difficile ou faillible : elle est, en un sens précis, sous-déterminée par tout ce qui pourrait en décider.
Quine insiste sur un point qu'on néglige souvent. S'il a choisi pour théâtre une langue exotique, c'est pour rendre la thèse plausible, à la manière des ''Voyages de Gulliver'' qui éclairent nos mœurs en les transposant dans des contrées étranges. Mais la leçon vaut aussi pour notre propre langue. Étant donné deux manuels rivaux entre la langue de la jungle et la nôtre, nous pouvons traduire perversement notre langue en elle-même, en la faisant passer par la jungle au moyen d'un manuel, puis revenir au moyen de l'autre. L'indétermination n'est pas un accident de l'éloignement ; elle tient à la nature même de la signification. Ce qui se donnait pour un objet bien défini, le sens d'une phrase ou d'un mot, se révèle un mythe dès qu'on exige qu'il rende compte de plus que ce que le comportement public peut porter.
Un écueil guette ici, qu'il faut écarter : confondre cette indétermination avec la sous-détermination des théories physiques rencontrée à propos du holisme. Une théorie de la nature est sous-déterminée parce que les données laissent ouvertes plusieurs descriptions du monde ; mais il y a, sous ces descriptions, un monde à décrire : les théories rivales diffèrent par ce qu'elles disent de la réalité, même si les observations disponibles, voire toutes les observations possibles, ne suffisent pas à les départager. Dans le cas de la traduction, soutient Quine, il n'en va pas ainsi : ce n'est pas que le fait de la signification nous échappe, c'est qu'il n'existe aucun fait à atteindre. L'indétermination n'est pas une ignorance, mais une absence. C'est en ce point précis que la thèse heurte le sens commun, et que ses adversaires la jugent tantôt triviale, tantôt incroyable.<ref>Sur l'idée qu'il n'y a, en matière de signification, aucun fait à connaître, voir « Parler d'objets » (''OR'', éd. citée, p. 5) et ''Le mot et la chose'', § 16. Quine précisera la distinction d'avec la sous-détermination dans ''La poursuite de la vérité'', éd. citée, chap. 1.</ref>
== L'inscrutabilité de la référence et la relativité de l'ontologie ==
L'indétermination de la traduction se rapporte aux phrases et à leur sens. Quine isole un autre phénomène, voisin mais distinct, qui touche cette fois la référence des termes : l'inscrutabilité de la référence. Il l'avait déjà rencontré avec « gavagai », où rien ne fixait si le terme renvoyait au lapin, à ses parties ou à sa fusion. Il en donne dans « La relativité de l'ontologie » (1968) une formulation générale, à l'aide de ce qu'il appelle des fonctions de substitution. Soit une théorie quelconque ; remplaçons systématiquement chacun de ses objets par un autre, au moyen d'une correspondance terme à terme. À chaque objet, faisons par exemple correspondre son singleton, c'est-à-dire la classe qui n'a que lui pour élément ; ou bien son complément spatio-temporel, c'est-à-dire tout le reste du monde, lui excepté. Si l'on réinterprète en même temps tous les prédicats de la théorie de manière concertée, l'ensemble des énoncés vrais reste exactement le même, et avec lui la totalité de la matière probante. Du dehors, rien ne distingue la théorie qui parle de lapins de celle qui parle de singletons de lapins. La référence de chaque terme est, en ce sens, indéterminée : on peut faire tourner l'univers des objets sans que la trame des vérités s'en ressente.<ref>W. V. O. Quine, « La relativité de l'ontologie » (''Relativité de l'ontologie et autres essais'', éd. citée). Les fonctions de substitution, qui établissent l'inscrutabilité de la référence, sont introduites ''OR'', p. 47 et suiv.</ref>
Quine en tire une conséquence sur le sens même des questions d'ontologie. Demander, dans l'absolu, quels sont les objets d'une théorie n'a pas de sens. La question ne devient sensée que relativement à un manuel de traduction dans une théorie d'arrière-plan. C'est seulement en rapportant une langue à une autre, prise pour cadre, que l'on peut dire ce dont parle la première ; et cette théorie d'arrière-plan demande à son tour, si on l'interroge, d'être rapportée à une autre. La référence est ainsi relative, comme la position d'un point est relative à un système de coordonnées. Il est vain de demander où se trouve un objet dans l'espace absolu ; on ne peut indiquer sa place que par rapport à un repère. De même, il est vain de demander quels objets une théorie pose en elle-même ; on ne peut le dire que par rapport à un cadre que l'on adopte sans le mettre lui-même en question. Telle est la relativité de l'ontologie.
On évitera un contresens. Quine ne soutient pas que les objets seraient des illusions, ni que tout se vaut. Resté à l'intérieur de notre langue, sans la mettre en balance avec une autre, je parle bel et bien de lapins, de tables et de nombres, et la question « combien de lapins ? » a une réponse déterminée. C'est l'image qu'il propose en disant qu'il faut « rester à bord de son propre langage » et ne pas faire tanguer la barque : tant qu'on n'entreprend pas de traduire son langage en un autre, ou de le permuter sur lui-même, la référence va de soi.<ref>Sur l'image de rester « à bord de son propre langage » sans « faire tanguer la barque », et sur la traduction perverse de l'anglais en anglais, voir « La relativité de l'ontologie » (''OR'', p. 30 et p. 47-48) et ''La poursuite de la vérité'', trad. Maurice Clavelin, Paris, Seuil, 1993.</ref> Elle ne devient inscrutable que lorsqu'on prend du recul, qu'on contemple une réinterprétation globale ou qu'on traduit. Ce que Quine appelle dans ses derniers textes son structuralisme global tient en ceci : ce que nos théories saisissent du monde, c'est une structure, le réseau des rôles imbriqués que remplissent les objets, et non l'identité propre de ces objets pris un à un. « La structure est ce qui importe à la science, écrit-il, non le choix de ses objets. » Ceux-ci ne sont plus alors que des « points neutres » dans l'armature logique de notre théorie, et leur nature intime reste hors d'atteinte. Il faut pourtant se garder d'un dernier malentendu : ce structuralisme n'est pas une thèse sur ce qui existe. Quine ne soutient pas que seules les structures seraient réelles, ni que tout se réduirait à des relations sans termes ; il continue d'admettre des objets, corps et classes. Il soutient seulement qu'aucun fait ne décide lesquels, parmi des objets que l'on peut mettre en correspondance terme à terme, portent vraiment la structure. Sauver la structure, en somme, c'est tout sauver.<ref>« La structure est ce qui importe à la science, non le choix de ses objets » : W. V. O. Quine, « Things and Their Place in Theories », dans ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981, p. 20. Les objets réduits à des « points neutres » dans la structure logique de la théorie : ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995, p. 74-75. Sur le caractère non ontologique de ce structuralisme, qui n'infère pas que seules les structures existent, voir Frederique Janssen-Lauret (dir.), ''Quine, Structure, and Ontology'', Oxford University Press, 2020, notamment l'introduction et le chapitre de Michael Resnik.</ref>
== L'épistémologie naturalisée ==
Le dernier grand déplacement opéré par Quine concerne l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] elle-même. Exposé surtout dans « L'épistémologie naturalisée » (1969)<ref>W. V. O. Quine, « L'épistémologie naturalisée », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Epistemology Naturalized », ''OR'', p. 69-90). L'épistémologie « comme chapitre de la psychologie », la « contenance réciproque » et le rapport entre « l'entrée maigre et la sortie torrentielle » se trouvent p. 83.</ref>, il consiste à ranger la théorie de la connaissance parmi les sciences de la nature, au rebours d'une tradition qui voulait qu'elle les précède et les fonde.
=== La fin de la philosophie première ===
Depuis [[Dictionnaire de philosophie/René Descartes|Descartes]], l'épistémologie se voulait une philosophie première : une discipline antérieure à la science, chargée d'en assurer les fondements depuis un point d'appui que la science ne fournirait pas. Le projet avait deux versants. Sur le versant doctrinal, il s'agissait de déduire les vérités sur le monde à partir de l'expérience immédiate, avec la certitude de la logique ; c'était la quête cartésienne de la [[Dictionnaire de philosophie/Certitude|certitude]]. Sur le versant conceptuel, il s'agissait de définir les notions de la science à partir des seuls termes d'observation. L'aboutissement le plus accompli de ce second versant est l{{'}}''Aufbau'' de Carnap (1928), qui entreprend de construire le monde comme un édifice logique élevé sur la base des données sensibles.
Quine tient ce projet pour irrémédiablement échoué, et il s'y connaît, lui qui admirait Carnap. Sur le versant doctrinal, l'échec était reconnu de longue date : on ne peut déduire la science de l'expérience, car la plus modeste des généralisations sur l'observable porte sur plus de cas que son auteur n'en a jamais pu observer. La quête de certitude était une cause perdue, héritée de Hume autant que de Descartes. Sur le versant conceptuel, l'entreprise de l{{'}}''Aufbau'' achoppe elle aussi. Carnap ne parvient pas à fournir une réduction par traduction, c'est-à-dire une recette permettant de réécrire chaque énoncé sur le monde en termes d'observation, de logique et de théorie des ensembles. Au point capital, là où il faut assigner des qualités sensibles à des positions dans l'espace et le temps, il ne donne qu'une consigne d'ajustement, révisable au fil de l'expérience, et non une définition. L'idéal d'une réduction du monde à l'expérience demeure hors d'atteinte.
L'échec du fondationnalisme ne signe pourtant pas la mort de l'empirisme. Deux thèses empiristes, souligne Quine, demeurent intactes. La première : toute la matière probante dont dispose la science est de nature sensorielle. La seconde : l'apprentissage du sens des mots repose en dernière instance sur l'expérience sensible. Ce qui s'effondre, c'est l'ambition de déduire la science de cette base ; ce qui subsiste, c'est que la science n'a pas d'autre source d'épreuve que l'irritation de nos surfaces sensorielles. Le naturalisme de Quine n'est donc pas un congé donné à l'empirisme, mais sa reformulation : un empirisme qui renonce au fondement sans renoncer à l'expérience.<ref>« L'épistémologie naturalisée » (''OR'', éd. citée, p. 75) : « toute matière probante de la science est sensorielle » et « l'inculcation du sens des mots repose en dernier ressort sur la matière probante sensorielle ».</ref>
=== Un chapitre de la psychologie ===
Devant cet échec, Quine propose un renversement. Puisque le rêve de déduire la science de l'observation est perdu, pourquoi ne pas se contenter de la psychologie ? Pourquoi ne pas étudier, simplement, comment l'édifice de nos croyances s'élève en fait sur la base des stimulations sensorielles ? On objectait jadis à cette idée un cercle vicieux : si l'épistémologue veut valider les fondements de la science, il se contredit en usant, pour cela, de la science elle-même. Mais ce scrupule, observe Quine, perd toute portée dès qu'on a cessé de vouloir déduire la science de l'observation. Si nous cherchons seulement à comprendre le lien entre l'observation et la théorie, nous avons tout intérêt à mobiliser toute l'information disponible, y compris celle que nous fournit la science même dont nous étudions le rapport à l'observation. La crainte de la circularité n'a de sens que pour qui poursuit encore une fondation ; elle s'évanouit pour qui cherche seulement à comprendre.
L'épistémologie trouve alors une place nouvelle : elle devient un chapitre de la psychologie, et par là de la science de la nature. Elle étudie un phénomène naturel, à savoir un sujet humain physique. On accorde à ce sujet une certaine entrée, contrôlée par l'expérimentateur, sous forme de schémas d'irradiation de ses surfaces sensorielles ; et, le temps venu, le sujet livre en sortie une description du monde extérieur à trois dimensions et de son histoire. La relation entre cette entrée maigre et cette sortie torrentielle est précisément ce que l'épistémologue est conduit à étudier, pour des raisons à peu près semblables à celles qui ont toujours animé sa discipline : voir comment la matière probante se rattache à la théorie, et en quoi notre théorie de la nature déborde toute donnée disponible.
Quine décrit le rapport ainsi obtenu entre l'épistémologie et la science par une formule en forme de boucle : il y a contenance réciproque. L'ancienne épistémologie aspirait à contenir la science, à la construire à partir des données sensibles ; la nouvelle, à l'inverse, est contenue dans la science, comme un chapitre de la psychologie. Mais l'ancienne contenance vaut aussi, à sa manière, car nous étudions comment notre sujet pose des corps et projette sa physique à partir de ses données, et nous comprenons que notre propre position dans le monde ne diffère en rien de la sienne. Notre étude de la connaissance, la psychologie où elle s'inscrit, la science tout entière qui contient cette psychologie : tout cela est notre propre construction, projetée à partir de stimulations semblables à celles que nous administrons au sujet observé. Nul cercle vicieux là-dedans, une fois renoncé au rêve de la déduction : nous cherchons à comprendre la science comme un processus dans le monde, et nous n'exigeons pas que cette compréhension soit plus assurée que la science qui en est l'objet.
Cette attitude, Quine la rattache à une image qu'il emprunte à Otto Neurath et qu'il affectionne : celle du [[Dictionnaire de philosophie/Bateau de Neurath|bateau de Neurath]].<ref>L'image du bateau est empruntée à Otto Neurath ; Quine la place en exergue du ''Mot et la chose'' et la reprend dans « L'épistémologie naturalisée » (''OR'', p. 84) ainsi que dans l'essai « Natural Kinds » (même volume, p. 127).</ref> Nous sommes comme des marins qui doivent réparer leur navire en pleine mer, sans pouvoir le mettre en cale sèche ni le reconstruire à neuf depuis la quille. Nous ne disposons d'aucun sol ferme extérieur à la science d'où la refonder ; nous travaillons toujours du dedans, remplaçant une planche après l'autre tout en restant à flot, en nous appuyant sur le reste de la coque. Il n'y a pas de point d'appui archimédien hors de nos croyances, pas de [[Dictionnaire de philosophie/A priori|donnée première]] soustraite à l'enquête. La philosophie ne surplombe pas la science : elle en fait partie, à la pointe la plus générale et la plus réflexive, mais sans privilège de juridiction. On objectera que naturaliser l'épistémologie, c'est la priver de sa fonction d'évaluation : si elle se borne à décrire comment nous formons nos croyances, que devient la question de savoir lesquelles sont justifiées ? Quine répond, on le verra, que la part normative n'est pas abolie, mais reconduite à l'intérieur de la science, sous la forme de recommandations sur les meilleurs moyens d'atteindre la vérité. Le naturalisme ne supprime pas la norme ; il cesse seulement de la chercher hors de la science.
== Logique, extensionnalisme et critique des modalités ==
Logicien de métier, Quine a soutenu en philosophie de la logique des positions cohérentes avec l'ensemble de son œuvre. La première est un extensionnalisme assumé. Un contexte est dit extensionnel lorsqu'on peut y remplacer un terme par un autre, vrai des mêmes objets, sans changer la valeur de vérité de l'énoncé, et lorsqu'on peut y substituer à une phrase toute phrase de même valeur de vérité. La logique classique des prédicats est extensionnelle ; elle ne connaît que les objets, leurs classes et la vérité ou la fausseté des énoncés. Quine y voit le langage le plus clair que nous ayons, et il refuse d'en sortir sans nécessité. Ce refus a une cible précise : les entités intensionnelles, c'est-à-dire les significations, les propositions et les propriétés, qui peuplent les contextes où la substitution échoue. On a vu pourquoi il les écarte : faute de critère d'identité, ces entités ne satisfont pas à la règle « pas d'entité sans identité ».
=== L'opacité des contextes modaux ===
C'est sur ce terrain que se joue la critique quinienne de la logique modale, celle qui ajoute à la logique les opérateurs « il est nécessaire que » et « il est possible que ». Quine ne conteste pas la logique modale comme calcul formel ; il conteste qu'on puisse l'interpréter de façon intelligible dès qu'on y fait entrer des quantificateurs. Son argument procède d'un exemple resté classique. Considérons les deux énoncés : « il est nécessaire que neuf soit plus grand que sept » et « il est nécessaire que le nombre des planètes soit plus grand que sept ». Le premier paraît vrai, les vérités de l'arithmétique passant pour les meilleures candidates à la nécessité. Le second paraît faux, car le nombre des planètes aurait pu être autre : le système solaire aurait pu se former avec moins d'astres. Or, à l'époque où Quine écrit, le nombre des planètes est neuf. On passe donc du premier énoncé au second en remplaçant un terme, « neuf », par un autre qui désigne le même objet, « le nombre des planètes » ; et cette substitution transforme un vrai en un faux. Le contexte modal est ainsi opaque à la référence : ce qui s'y dit ne dépend pas seulement de l'objet désigné, mais de la façon de le désigner.<ref>W. V. O. Quine, « Référence et modalité » (« Reference and Modality »), dans ''Du point de vue logique'', éd. citée : l'exemple du nombre des planètes est introduit ''FLPV'' p. 143, et l'« attitude discriminante » envers les façons de spécifier un objet, censée livrer son « essence », est dénoncée p. 155. Voir aussi « Les trois degrés de l'implication modale » (« Three Grades of Modal Involvement »), dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''The Ways of Paradox and Other Essays'', ci-après ''WP'', New York, Random House, 1966, p. 158 et p. 175).</ref>
Tant qu'on s'en tient à une modalité de dicto, qui porte sur des énoncés tout entiers, Quine concède qu'on peut donner un sens à ces tournures, en traitant la nécessité comme un prédicat attaché à des phrases plutôt qu'à des choses : « la phrase neuf est plus grand que sept est nécessaire ». La difficulté surgit quand on veut quantifier dans le contexte modal, c'est-à-dire affirmer une modalité de re, qui porte sur la chose elle-même : « il existe un objet qui est nécessairement plus grand que sept ». Une telle affirmation prétend qu'un objet possède une certaine propriété nécessairement, en lui-même, indépendamment de la manière dont on le spécifie. Or cela suppose, soutient Quine, ce qu'il nomme avec ironie l'essentialisme aristotélicien : la doctrine selon laquelle, parmi les propriétés vraies d'une chose, certaines lui appartiennent par essence et d'autres par accident, abstraction faite de toute description.
=== Le mathématicien cycliste ===
Pour faire sentir ce qu'il tient pour une perplexité légitime, Quine forge dans ''Le mot et la chose'' un exemple devenu un cas d'école. On dira peut-être que les mathématiciens sont nécessairement rationnels et non nécessairement bipèdes, tandis que les cyclistes sont nécessairement bipèdes et non nécessairement rationnels. Soit. Mais que dire d'un individu qui compte parmi ses occupations à la fois les mathématiques et la bicyclette ? Cet homme concret est-il nécessairement rationnel et accidentellement bipède, ou l'inverse ? La question, juge Quine, n'admet pas de réponse, et ne devrait pas en admettre.<ref>W. V. O. Quine, ''Le mot et la chose'', § 41 (''Word and Object'', éd. citée, p. 199).</ref> Car la rationalité ne lui revient nécessairement qu'en tant qu'on le considère comme mathématicien, et la bipédie qu'en tant qu'on le considère comme cycliste ; rapportées à l'objet nu, sans description privilégiée, ces nécessités s'évanouissent. L'essentialisme exige qu'on tienne pour mieux révélatrices de l'essence certaines manières de spécifier un objet, et pour trompeuses les autres. Cette préférence, Quine la trouve injustifiable, et la nécessité de re qui s'y appuie, à peine intelligible.
=== Attitudes propositionnelles et nécessité ===
La même opacité affecte les contextes de croyance, que Quine range parmi les attitudes propositionnelles. « Œdipe veut épouser Jocaste » peut être vrai quand « Œdipe veut épouser sa mère » est faux, alors même que Jocaste est sa mère. Là encore, la substitution de termes coréférents échoue, et pour la même raison : ce qui est en jeu n'est pas seulement l'objet, mais la façon dont il est présenté à l'esprit du croyant. Quine en conclut que ces tournures, indispensables à la vie ordinaire, résistent à une analyse extensionnelle et qu'il faut, en science rigoureuse, soit les paraphraser, soit s'en passer.
Il faut signaler que ces réserves n'ont pas eu le dernier mot. À partir de « La logique des noms propres » (''Naming and Necessity'') de Saul Kripke et de la sémantique des mondes possibles, une partie de la philosophie a réhabilité la nécessité de re, l'essentialisme et même la notion de vérité nécessaire connue a posteriori. Là où Quine voyait une notion à peine compréhensible, ces travaux ont vu un domaine cohérent et fécond. Le débat reste ouvert, et il oppose deux conceptions de la nécessité : pour Quine et l'empirisme logique, la nécessité, si elle a un sens, vient de nous, de notre langage ; pour la tradition issue de Kripke, elle est ancrée dans la nature des choses. Quine considérait cette seconde idée comme un retour à une métaphysique qu'il croyait dépassée.
=== La logique n'est pas vraie par convention ===
Reste la question du statut des vérités logiques elles-mêmes. L'empirisme logique tenait la logique et les mathématiques pour vraies en vertu de [[Dictionnaire de philosophie/Convention|conventions]] linguistiques. Quine, dès « Truth by Convention » (1936) puis dans « Carnap et la vérité logique », a démonté cette thèse par un argument de régression.<ref>W. V. O. Quine, « La vérité par convention » (« Truth by Convention », 1936) et « Carnap et la vérité logique » (« Carnap and Logical Truth »), repris dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''WP'', éd. citée, p. 89 et p. 113-114).</ref> Si les vérités logiques découlaient de conventions explicites, encore faudrait-il, pour en tirer les cas particuliers à partir des règles générales, user de la logique. On ne peut poser par convention l'infinité des vérités logiques qu'en les énonçant sous forme de quelques principes généraux, dont on déduirait les instances ; mais cette déduction présuppose déjà la logique qu'on prétendait fonder. La convention ne saurait donc engendrer la logique sans la supposer. Quine en conclut que les vérités logiques ne sont pas d'une autre nature que les autres : elles occupent simplement la position la plus centrale et la plus générale du réseau de nos croyances, là où nous touchons le moins volontiers, parce qu'y toucher bouleverserait tout le reste.
De là découle une dernière thèse, que résume une formule de sa ''Philosophie de la logique'' : changer de logique, c'est changer de sujet.<ref>W. V. O. Quine, ''Philosophie de la logique'', chap. 6, « Les logiques déviantes », trad. Jean Largeault, Paris, Aubier-Montaigne, 1975 (''Philosophy of Logic'', Cambridge (Mass.), Harvard University Press, 1970, p. 81 ; sur le « prix » d'une logique déviante, p. 86-87).</ref> Qui prétend réviser une loi logique, par exemple en rejetant le tiers exclu, ne réfute pas l'ancienne loi ; il donne un sens nouveau aux connecteurs, et parle désormais d'autre chose. La logique reste révisable en droit, comme tout le reste du tissu de la science, car aucun énoncé n'y est sacré ; mais sa centralité même fait qu'on ne la révise qu'en dernière extrémité, sous la pression d'une simplification d'ensemble assez forte pour le justifier. Le maintien de la logique classique n'est pas, chez Quine, un dogme : c'est le fruit du conservatisme et de la quête de simplicité qui gouvernent toutes nos révisions, sous la conduite de la maxime de mutilation minimale déjà rencontrée. Réviser une loi logique entraînerait une refonte de si grande ampleur du réseau théorique que le coût en serait, presque toujours, hors de proportion avec le gain. Aussi Quine n'a-t-il jamais recommandé les logiques déviantes : il en admet la possibilité de principe, mais sa maxime milite contre elles, sauf bénéfice théorique exceptionnel, comme celui qu'on a cru parfois entrevoir du côté de la mécanique quantique.
== Postérité et discussions ==
[[Fichier:Willard Van Orman Quine on Bluenose II in Halifax NS harbor 1980.jpg|vignette|upright=1|Quine à la barre du Bluenose II, dans le port de Halifax, en 1980. Le goût des cartes et des voyages, né dans l'enfance, ne le quitta jamais et colore son image de la connaissance comme exploration sans sol ferme.]]
L'œuvre de Quine a façonné le paysage de la philosophie analytique de la seconde moitié du XX{{e}} siècle, au point que ses adversaires eux-mêmes argumentent sur le terrain qu'il a déblayé. Son influence se mesure moins à une école constituée qu'à un climat : le naturalisme, devenu pour beaucoup l'atmosphère par défaut de la discipline.
=== Une influence diffuse ===
Donald Davidson a prolongé le projet quinien de la traduction radicale en une théorie de l'interprétation, posant qu'on ne peut comprendre autrui qu'en lui prêtant, par un principe de charité, une rationalité et des croyances pour l'essentiel vraies. Daniel Dennett a fait du naturalisme quinien un instrument pour la philosophie de l'esprit. En philosophie des mathématiques, l'argument dit d'indispensabilité, élaboré avec Hilary Putnam, soutient que nous devons admettre l'existence des objets abstraits, nombres et ensembles, parce que nos meilleures théories physiques en font un usage que l'on ne sait pas éliminer : c'est le critère de l'engagement ontologique appliqué à la science effective. Le programme d'une [[Dictionnaire de philosophie/Épistémologie|épistémologie]] naturalisée a nourri tout un courant de recherche, qui étudie la formation des croyances avec les ressources de la psychologie et des sciences cognitives, et qui a contribué à rapprocher la philosophie de la connaissance des sciences empiriques de l'esprit.
=== La défense de l'analyticité ===
La critique de la distinction analytique et synthétique n'a pas fait l'unanimité. Dans un article resté célèbre, « Pour la défense d'un dogme » (1956), Paul Grice et Peter Strawson objectent que l'exigence quinienne est trop forte.<ref>H. P. Grice et P. F. Strawson, « In Defense of a Dogma », ''The Philosophical Review'', vol. 65, 1956, p. 141-158.</ref> Que l'on ne sache pas définir « analytique » sans cercle ne prouve pas que la notion soit vide : bien des couples de notions s'éclairent mutuellement sans qu'aucune se laisse réduire à autre chose, et les locuteurs compétents s'accordent en fait, de manière stable, sur ce qui relève du sens des mots et sur ce qui relève des faits. Une distinction dont l'usage est partagé et régulier ne saurait être tenue pour illusoire au seul motif qu'elle résiste à la définition explicite. Carnap, de son côté, n'a jamais cédé sur l'analyticité, qu'il jugeait clarifiable pour les langages réglés. Plus tard, des philosophes comme Paul Boghossian ont cherché à reconstruire une notion défendable de vérité fondée sur la signification, et à rouvrir la question de l'a priori que Quine croyait close.
=== Le langage et l'esprit ===
Sur le terrain du langage, Noam Chomsky a opposé à Quine une linguistique d'inspiration tout autre. Là où Quine, héritier du behaviorisme, voulait expliquer l'acquisition du langage par le conditionnement de dispositions verbales observables, Chomsky fait valoir la pauvreté du stimulus : l'enfant maîtrise sa langue bien au-delà de ce que son exposition limitée pourrait lui apprendre, ce qui suppose des structures innées. Chomsky a de plus contesté le statut de l'indétermination de la traduction, y voyant non un phénomène singulier mais un simple cas de la sous-détermination ordinaire de toute théorie par ses données, sans portée philosophique particulière. Quine a maintenu que l'indétermination était d'une autre espèce : non pas notre ignorance d'un fait qui existerait, mais l'absence de tout fait à connaître. Le différend touche à la question de savoir s'il existe, en matière de signification, des faits que nos méthodes ne feraient qu'approcher, ou s'il n'y a là rien à approcher du tout.
=== Le retour de la nécessité et la question des normes ===
On a dit comment Saul Kripke et la nouvelle théorie de la référence ont rouvert, contre les interdits quiniens, le dossier de la nécessité et de l'essence. Une autre objection, plus interne, vise l'épistémologie naturalisée. Si la théorie de la connaissance se réduit à la description psychologique de la façon dont nous formons nos croyances, que devient sa dimension normative, sa fonction d'évaluer ce qui justifie une croyance et ce qui ne la justifie pas ? Jaegwon Kim a soutenu qu'une épistémologie purement descriptive cesse d'être une épistémologie, faute de pouvoir dire ce que nous devrions croire.<ref>Jaegwon Kim, « What is “Naturalized Epistemology”? », ''Philosophical Perspectives'', vol. 2, 1988, p. 381-405.</ref> Quine a répondu que la norme n'est pas abolie, mais reconduite à une visée pratique : l'épistémologie normative devient une sorte de technologie de la recherche de la [[Dictionnaire de philosophie/Vérité|vérité]], qui étudie, à l'intérieur de la science, par quels moyens on prédit le mieux l'expérience. Les règles de la bonne méthode sont des conseils d'ingénieur, ajustés à une fin, et non des décrets d'une raison souveraine antérieure à toute science. La question de savoir si cette réponse suffit demeure l'un des points vifs de la discussion contemporaine.
== Conclusion ==
L'unité de l'œuvre de Quine tient à une attitude plus qu'à un système. C'est l'attitude de qui refuse tout point d'appui extérieur à la science et travaille toujours du dedans, du sein de nos croyances, sans sol ferme ni certitude première. De ce parti pris découlent, par enchaînement, ses thèses les plus discutées : si nul énoncé n'affronte seul l'expérience, alors le partage de l'analytique et du synthétique s'efface, alors la logique perd son immunité, alors la signification se réduit à ce que le comportement public peut porter, alors la connaissance n'a d'autre juge qu'elle-même. La barbe de Platon tombée sous le rasoir, le mythe du musée dissipé, le rêve de la philosophie première abandonné, il ne reste qu'un univers sobre, des objets et des classes, et une science qui se reconstruit en pleine mer comme le bateau de Neurath, planche après planche. On peut tenir cette austérité pour une perte ou pour une libération. Mais on ne fait plus de l'[[Dictionnaire de philosophie/Métaphysique|ontologie]], de l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] ou de la philosophie du langage sans passer par les questions que Quine a posées, ni sans se situer, fût-ce pour s'en écarter, par rapport aux réponses qu'il a avancées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Quine traduites en français ===
* ''Le mot et la chose'' [''Word and Object'', 1960], traduction de Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977.
* ''Du point de vue logique. Neuf essais logico-philosophiques'' [''From a Logical Point of View'', 1953], traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.
* ''Relativité de l'ontologie et autres essais'' [''Ontological Relativity and Other Essays'', 1969], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1977.
* ''Philosophie de la logique'' [''Philosophy of Logic'', 1970], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1975.
* ''Méthodes de logique'' [''Methods of Logic'', 1950], traduction de Maurice Clavelin, Paris, Armand Colin, 1973.
* ''Les voies du paradoxe et autres essais'' [''The Ways of Paradox and Other Essays'', 1966], Paris, Vrin, 2011.
* ''La poursuite de la vérité'' [''Pursuit of Truth'', 1990], traduction de Maurice Clavelin, Paris, Seuil, 1993.
* ''Quiddités. Dictionnaire philosophique par intermittence'' [''Quiddities. An Intermittently Philosophical Dictionary'', 1987], traduction de Dominique Goy-Blanquet et Thierry Marchaisse, Paris, Seuil, 1992.
=== Principales œuvres non traduites en français ===
* ''Mathematical Logic'', Cambridge (Mass.), Harvard University Press, 1940.
* ''Set Theory and Its Logic'', Cambridge (Mass.), Harvard University Press, 1963.
* ''The Roots of Reference'', La Salle (Illinois), Open Court, 1974.
* ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981.
* ''The Time of My Life. An Autobiography'', Cambridge (Mass.), The MIT Press, 1985.
* ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995.
=== Études ===
* {{Ouvrage|langue=en|prénom1=Edward|nom1=Becker|titre=The Themes of Quine's Philosophy|sous-titre=Meaning, Reference, and Knowledge|lieu=Cambridge|éditeur=Cambridge University Press|année=2012}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=Quintessence|sous-titre=Basic Readings from the Philosophy of W. V. Quine|lieu=Cambridge (Mass.)|éditeur=The Belknap Press of Harvard University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Frederique|nom1=Janssen-Lauret|responsabilité1=dir.|titre=Quine, Structure, and Ontology|lieu=Oxford|éditeur=Oxford University Press|année=2020}}
* {{Ouvrage|prénom1=Paul|nom1=Gochet|titre=Quine en perspective|sous-titre=essai de philosophie comparée|lieu=Paris|éditeur=Flammarion|année=1978}}
* {{Ouvrage|prénom1=Sandra|nom1=Laugier|titre=L'anthropologie logique de Quine|sous-titre=l'apprentissage de l'obvie|lieu=Paris|éditeur=Vrin|année=1992}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=The Cambridge Companion to Quine|lieu=Cambridge|éditeur=Cambridge University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Peter|nom1=Hylton|titre=Quine|lieu=Londres|éditeur=Routledge|année=2007}}
* {{Ouvrage|langue=en|prénom1=Alex|nom1=Orenstein|titre=W. V. Quine|lieu=Chesham|éditeur=Acumen|année=2002}}
* {{Ouvrage|langue=en|prénom1=Christopher|nom1=Hookway|titre=Quine|sous-titre=Language, Experience and Reality|lieu=Cambridge|éditeur=Polity Press|année=1988}}
* {{Ouvrage|langue=en|prénom1=Gilbert|nom1=Harman|prénom2=Ernest|nom2=Lepore|responsabilité1=dir.|titre=A Companion to W. V. O. Quine|lieu=Chichester|éditeur=Wiley-Blackwell|année=2014}}
* {{Ouvrage|langue=en|prénom1=Eve|nom1=Gaudet|titre=Quine on Meaning|sous-titre=The Indeterminacy of Translation|lieu=Londres|éditeur=Continuum|année=2006}}
* {{Ouvrage|langue=en|prénom1=Lewis Edwin|nom1=Hahn|prénom2=Paul Arthur|nom2=Schilpp|responsabilité1=dir.|titre=The Philosophy of W. V. Quine|lieu=La Salle (Illinois)|éditeur=Open Court|année=1986|collection=The Library of Living Philosophers}}
== Voir aussi ==
* [[Dictionnaire de philosophie/Empirisme|Empirisme]]
* [[Dictionnaire de philosophie/Épistémologie|Épistémologie]]
* [[Dictionnaire de philosophie/Métaphysique|Métaphysique]]
* [[Dictionnaire de philosophie/Existence|Existence]]
* [[Dictionnaire de philosophie/Vérité|Vérité]]
* [[Dictionnaire de philosophie/Convention|Convention]]
* [[Dictionnaire de philosophie/A priori|A priori]]
* [[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
* [[Dictionnaire de philosophie/Moritz Schlick|Moritz Schlick]]
* [[Dictionnaire de philosophie/Scepticisme|Scepticisme]]
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Quine, Willard Van Orman}}
jv6cox0mhclxufmtiqut7o4djzpwbbe
768272
768271
2026-06-21T19:30:55Z
PandaMystique
119061
/* La barbe de Platon */
768272
wikitext
text/x-wiki
{{DicoPhilo|Willard Van Orman Quine}}
[[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]]
Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme logique lui-même les outils qu'il en avait reçus. Son nom reste attaché à quelques gestes critiques qui ont reconfiguré la discipline : la mise en cause de la distinction entre vérités analytiques et vérités synthétiques, l'abandon de l'idée d'une [[Dictionnaire de philosophie/Métaphysique|philosophie première]] antérieure à la science, et la thèse, longtemps reçue comme un paradoxe, selon laquelle la traduction d'une langue dans une autre demeure indéterminée. À ces gestes critiques répond une construction patiente : un naturalisme qui range l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] parmi les sciences de la nature, une conception holiste de la [[Dictionnaire de philosophie/Connaissance|connaissance]] où nos énoncés ne se mesurent pas isolément à l'expérience, mais à l'intérieur d'ensembles théoriques plus ou moins vastes, et un critère précis pour décider de ce qu'une théorie tient pour existant.
Quine écrit une prose dense, ironique, parsemée de formules qui se retiennent : « Être, c'est être la valeur d'une variable liée », « pas d'entité sans identité », « aucun énoncé n'est à l'abri d'une révision ». Cette élégance n'est pas un ornement. Elle traduit une exigence constante d'économie : se contenter des hypothèses les moins nombreuses et les plus claires qui suffisent à la tâche, comme un cartographe qui ne retient d'un territoire que les traits utiles au voyageur. Ce goût de la sobriété, Quine l'avouait volontiers en parlant de sa préférence pour « les paysages désertiques » : un monde ontologiquement maigre, mais net.
== Repères biographiques ==
=== Akron, Oberlin et la découverte de la logique ===
Quine naît le 25 juin 1908 à Akron, dans l'Ohio. Au lycée, il choisit la filière scientifique, manifeste un don pour les mathématiques, gagne un concours de poésie et, plusieurs étés de suite, dessine et vend des cartes des environs. Ce plaisir des cartes et cette passion du voyage ne le quitteront pas : des décennies plus tard, il rédigera pour la ''New York Review of Books'' des recensions d'atlas, et son ami Burton Dreben, devant le nombre de lieux mentionnés dans son autobiographie, suggérera de l'intituler non ''The Time of My Life'' mais « un camion de déménagement ». La lecture d{{'}}''Eureka'' d'Edgar Poe, qui transmet l'ivresse de comprendre l'univers, compte parmi ses premières émotions philosophiques, en même temps qu'un scepticisme précoce en matière religieuse. La dernière année de lycée éveille un intérêt durable pour le langage, la grammaire et l'étymologie.
Entré à l'Oberlin College en 1926, il hésite entre les mathématiques, la philosophie et les lettres classiques. Un compagnon de poker lui apprend qu'un certain Bertrand Russell aurait une « philosophie mathématique ». Quine y voit le moyen de réunir deux de ses penchants : il choisit les mathématiques, complétées par des lectures dirigées en philosophie des mathématiques. Personne, à Oberlin, ne connaît alors les travaux récents de Frege, de Russell ou de Whitehead ; son directeur lui compose, avec une aide extérieure, une liste de lectures qui inclut les ''Principia Mathematica'' de Whitehead et Russell. En 1929, son mémoire de fin d'études généralise une formule empruntée à Couturat et la démontre dans le formalisme strict des ''Principia''. Sa première publication savante, un compte rendu de l'ouvrage de Nicod sur les fondements de la géométrie et de l'induction, paraît dans l{{'}}''American Mathematical Monthly''.
=== Harvard et la renaissance européenne ===
[[Fichier:Russell1907-2.jpg|vignette|upright=1|Bertrand Russell vers 1907. Sa venue à Harvard en 1931 fut, selon Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell joua dans son œuvre le rôle d'un rival admiré dont les thèses appelaient des solutions de rechange.]]
Quine choisit Harvard pour ses études doctorales, parce que son département de philosophie est alors le plus fort en logique du pays : on y trouve Alfred North Whitehead, le coauteur des ''Principia''. Il y soutient en deux ans une thèse intitulée « The Logic of Sequences: A Generalization of Principia Mathematica ». Une préoccupation y affleure déjà, qui ne le quittera plus : celle de l'ontologie, de la question de savoir ce qu'il y a. Là où les ''Principia'' admettent des fonctions propositionnelles, c'est-à-dire des propriétés, donc des entités intensionnelles, Quine cherche à parvenir aux mêmes fins avec des objets extensionnels comme les classes. La même année 1931, Russell vient donner une conférence à Harvard : ce sera, dira Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell restera une présence centrale, à la manière d'un rival dont les positions appellent des solutions de rechange plus acceptables.
Vient ensuite ce que Quine nomme sa renaissance en Europe centrale. Titulaire en 1932-1933 d'une bourse de voyage, il séjourne à Vienne, à Prague et à Varsovie. À Vienne, il assiste aux réunions du Cercle de Vienne et fait la connaissance de Neurath, de [[Dictionnaire de philosophie/Moritz Schlick|Schlick]], de Gödel, de Hahn et de Menger. À Prague, il rencontre Rudolf Carnap, suit ses cours et lit en tapuscrit allemand sa ''Syntaxe logique du langage''. Carnap deviendra une influence aussi forte que Russell, et le débat qui les opposera durant des décennies comptera parmi les échanges majeurs du siècle. À Varsovie, Quine suit les leçons de Leśniewski, de Łukasiewicz et de Tarski, et noue avec l'école polonaise une sympathie durable pour son extensionnalisme et sa parcimonie ontologique. Il décrira ces semaines de Prague et de Varsovie comme « les mois les plus enrichissants » qu'il ait connus.
=== Le professeur de Harvard ===
De retour à Harvard en 1933, Quine est élu Junior Fellow de la Society of Fellows, ce qui le libère de toute charge d'enseignement pendant trois ans. C'est dans cette période qu'il met au point trois de ses positions distinctives : sa conception de l'engagement ontologique, ses systèmes de logique les plus connus, dont les « New Foundations for Mathematical Logic » de 1937, et la première phase de sa critique de la vérité dite analytique, esquissée dans « Truth by Convention » (1936). Son behaviorisme, soit dit en passant, ne date pas de sa fréquentation de B. F. Skinner, autre Junior Fellow, mais de ses lectures de Watson au temps du collège.
Sa facilité pour les langues se manifeste en 1942 : alors qu'il s'est déjà porté volontaire pour la marine, Quine ajourne son engagement afin d'enseigner quatre mois durant à São Paulo, en portugais, langue dont il avait pris les rudiments aux Açores, et il tire de ces leçons un manuel de logique rédigé dans cette langue. Il sert ensuite plus de trois ans dans la marine des États-Unis, où il travaille au déchiffrement des communications des sous-marins allemands et atteint le grade de capitaine de corvette. Professeur titulaire à Harvard à partir de 1948, puis titulaire de la chaire Edgar Pierce de philosophie, il y enseignera jusqu'à sa retraite, en 1978. Ses textes les plus discutés s'échelonnent sur ces décennies : « De ce qui est » (1948), « Deux dogmes de l'empirisme » (1951), le recueil ''Du point de vue logique'' (1953), puis l'ouvrage qui condense sa philosophie, ''Le mot et la chose'' (1960). Suivront « La relativité de l'ontologie » (1968) et « L'épistémologie naturalisée » (1969). La retraite ne ralentit ni sa production ni son influence : il publie encore ''Theories and Things'' (1981), son autobiographie ''The Time of My Life'' (1985), le dictionnaire ''Quiddités'' (1987), ''La poursuite de la vérité'' (1990) et ''From Stimulus to Science'' (1995). Il meurt le 25 décembre 2000.
== L'héritage de l'empirisme logique ==
On comprend mal Quine si on ne le situe pas dans la tradition qu'il prolonge et conteste à la fois. Cette tradition est celle de l'empirisme logique, né de la rencontre entre la nouvelle logique de Frege et de Russell et le programme du Cercle de Vienne. Carnap en avait donné l'exposé le plus soigné, autour de trois thèses. La première est le critère de vérifiabilité : une phrase n'a de signification empirique que si l'on peut indiquer les observations qui la confirmeraient ou l'infirmeraient. La deuxième fait du savoir a priori, celui des mathématiques et de la logique, un savoir purement linguistique : ces vérités seraient vraies en vertu des seules conventions de notre langage, non de quelque fait du monde. La troisième tient la métaphysique pour dépourvue de sens, simple jeu de mots sans portée cognitive. Ce résumé en trois points est une commodité d'exposition, non un portrait figé : la pensée de Carnap se déplace beaucoup, de l{{'}}''Aufbau'' à la syntaxe logique, puis à la sémantique et au principe de tolérance, et c'est avec chacune de ces étapes que Quine dialogue.
Quine partage le point de départ empiriste : toute la matière probante de la science est sensorielle, et l'apprentissage des mots repose en dernière instance sur l'expérience. Mais il va soumettre chacune des trois thèses à un examen qui en démonte les ressorts. Le réductionnisme attaché au critère de vérifiabilité supposait que chaque énoncé possède, pris isolément, un contenu empirique propre ; Quine y opposera le holisme. L'idée d'une vérité purement analytique, qui isolait le linguistique du factuel, lui paraîtra reposer sur un cercle. Quant à la métaphysique, Quine ne la réhabilite pas sous sa forme classique, mais il refuse qu'on tranche d'un trait les questions d'existence : la question « qu'y a-t-il ? » est pour lui sur le même plan que les questions de la science naturelle. Ce que Carnap croyait pouvoir séparer, Quine le tient pour un continuum. Tel est le ressort de son œuvre : un empirisme qui se retourne sur ses propres présupposés et en abandonne les deux dogmes.
== Qu'est-ce qui existe ? L'engagement ontologique ==
=== La barbe de Platon ===
<div style="float:right; width:118px; margin:0 0 12px 16px; position:relative;">
<div style="background:linear-gradient(180deg, #fdfcf9 0%, #f5f2ec 100%); border:1px solid #e0d8cb; border-radius:12px; box-shadow:0 2px 6px rgba(0,0,0,.04); text-align:center; padding:14px 10px;">
[[Fichier:Ambox question.svg|28px]]
<div style="margin-top:6px; font-size:84%; color:#6d5f4d;">La barbe de Platon</div>
</div>
[[Dictionnaire de philosophie/Willard Van Orman Quine/La barbe de Platon|<span style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:1;"></span>]]
</div>
« Qu'y a-t-il ? » Le problème de l'ontologie, observe Quine au seuil de « De ce qui est »<ref>W. V. O. Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', trad. sous la dir. de Sandra Laugier, Paris, Vrin, 2003 (éd. originale ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953). La « barbe de Platon » et l'énigme du non-être ouvrent l'essai (''From a Logical Point of View'', ci-après ''FLPV'', p. 2) ; le débat avec Wyman et le « bidonville des possibles » figurent p. 4.</ref>, a ceci de curieux qu'il s'énonce en trois mots et se résout en un seul : il y a tout ce qu'il y a. Chacun l'accordera. Le désaccord ne porte jamais sur cette formule vide, mais sur les cas. Or les cas suscitent une difficulté logique que Quine met en scène par une petite comédie philosophique. Supposons que deux penseurs, qu'il nomme McX et lui-même, divergent sur l'[[Dictionnaire de philosophie/Existence|existence]] de quelque chose. McX affirme qu'il y a une certaine entité ; Quine le nie. Comment Quine peut-il seulement formuler son désaccord ? S'il dit « il y a une chose que McX admet et que je rejette », il se contredit, car il vient d'admettre l'existence de ce qu'il prétendait refuser. Le partisan du non semble condamné à ne pouvoir dire ce qu'il nie.
C'est l'antique énigme du non-être : le non-être doit en quelque façon être, sinon qu'est-ce donc qui n'est pas ? Quine surnomme cette doctrine enchevêtrée « la barbe de Platon », tant elle a, dit-il, émoussé le rasoir d'Occam. Elle pousse certains à conférer une forme d'être à ce qui n'en a aucune. Prenons Pégase. Si Pégase n'était rien, raisonne McX, nous ne parlerions de rien en prononçant ce nom, et il serait absurde de dire même que Pégase n'est pas ; donc Pégase, en un sens, est. Pressé d'en dire davantage, McX se réfugie dans l'idée que Pégase est « une idée dans les esprits ». Mais c'est confondre le Parthénon avec l'idée du Parthénon. Le Parthénon est de pierre, visible ; l'idée du Parthénon est mentale, invisible. Nul ne les confond. Quand nous nions Pégase, ce n'est pas une image mentale que nous nions, c'est un cheval ailé de chair et de sang dont nous disons qu'il n'existe nulle part.
Un esprit plus subtil, que Quine appelle Wyman, soutient que Pégase « subsiste » comme un possible non actualisé. Dire que Pégase n'existe pas reviendrait seulement à dire qu'il n'a pas l'attribut d'actualité, comme on dirait que le Parthénon n'est pas rouge. Cette manœuvre peuple l'univers d'une foule d'êtres fantomatiques. Quine en montre l'incohérence par une série de questions désopilantes. Combien d'hommes possibles se tiennent dans cette embrasure de porte ? Le gros possible et le chauve possible sont-ils le même, ou deux ? Y a-t-il plus de minces possibles que de gros ? Sont-ils tous distincts, ou bien deux choses qui se ressemblent en tout ne font-elles qu'une ? À ces possibles inactuels, on ne sait même pas appliquer la notion d'identité. Et que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ? Le « bidonville des possibles » est, conclut Quine, un foyer d'éléments désordonnés. Mieux vaut le raser.
=== La leçon de Russell : décrire au lieu de nommer ===
La sortie de cette impasse, Quine la trouve dans la théorie russellienne des descriptions définies, qu'il tient pour un modèle d'analyse. Le piège tenait à ce que nous traitions « Pégase » comme un nom, un terme qui, pour avoir un sens, devrait désigner un objet. Russell avait montré comment se passer de cette supposition. Au lieu de « Pégase n'existe pas », qui paraît présupposer Pégase, paraphrasons : « il n'existe rien qui soit à la fois ailé, chevalin et unique en son genre. » L'énoncé devient une quantification existentielle niée : il n'y a aucun x tel que x soit Pégase. Le nom embarrassant a disparu, dissous dans un jeu de variables et de quantificateurs ; et il ne reste plus, pour porter un poids ontologique, que ce sur quoi nous quantifions. La phrase peut être fausse, c'est-à-dire nier l'existence de quelque chose, sans présupposer cette existence. L'énigme du non-être s'évanouit avec la grammaire qui l'avait engendrée.
De là résulte un déplacement capital. Ce ne sont pas les noms qui engagent une théorie à l'existence de quoi que ce soit, car tout nom peut être analysé à la façon de « Pégase ». Le poids ontologique se concentre dans les variables liées par les quantificateurs « il existe un… » et « pour tout… ». Dire « il existe quelque chose qui est un chien » suffit à s'engager sur les chiens, sans qu'on ait à les nommer. C'est pourquoi Quine peut soutenir que la prédication, plus que la dénomination, fait le fond de la référence : un prédicat comme « est humain » s'applique à Socrate, à Platon, à d'autres, et ce sont là précisément les valeurs que doivent prendre les variables pour que les énoncés où figure ce prédicat soient vrais.
=== « Être, c'est être la valeur d'une variable liée » ===
De ce constat naît le critère de l'engagement ontologique, ramassé dans une formule devenue célèbre : « Être, c'est être la valeur d'une variable liée. »<ref>La formule « être, c'est être la valeur d'une variable » (« To be is to be the value of a variable ») se trouve dans « De ce qui est » (''FLPV'', p. 15).</ref> L'univers des entités, écrit Quine, est l'étendue des valeurs des variables. Pour savoir à quels objets une théorie s'engage, il ne faut pas examiner les noms ni les prédicats qu'elle emploie, mais demander quelles entités doivent figurer parmi les valeurs de ses variables pour que ses énoncés soient vrais. Une variable, suggère-t-il par une image éclairante, est une sorte de pronom : « x » fonctionne comme le « il » d'une langue, terme provisoirement indéterminé qui attend, dans le champ d'un quantificateur, de se voir attribuer des valeurs.
Ce critère a une vertu de clarté. Il transforme une question métaphysique notoirement floue, « qu'est-ce qui existe ? », en une question précise sur la forme logique de nos théories, « sur quoi cette théorie quantifie-t-elle ? ». Encore faut-il, pour le mettre en œuvre, disposer d'une langue régimentée. Une phrase du langage ordinaire est souvent trop équivoque pour qu'on lise à même elle ses présuppositions. Quine propose donc de la reformuler dans une notation canonique : celle de la logique des prédicats du premier ordre, avec ses variables, ses quantificateurs et ses fonctions de vérité. Cette régimentation n'est pas une description de la langue naturelle, mais une réforme, entreprise au nom de la clarté et de l'économie. Une fois la théorie ainsi mise au net, ses engagements se lisent à livre ouvert : ce sont les objets sur lesquels portent ses variables liées. Il importe de ne pas se méprendre sur la portée de ce critère. Il ne tranche pas, par lui-même, ce qui existe ; il dit seulement à quoi une théorie s'engage lorsqu'on la tient pour vraie et qu'on l'a reformulée en langue logique. Le critère n'est pas un oracle métaphysique, mais une méthode pour lire les engagements d'une théorie déjà admise ou mise à l'examen. Reste ensuite la question, distincte, de savoir quelle théorie nous avons les meilleures raisons d'accepter.
Reste à savoir ce que Quine, pour sa part, accepte d'inscrire à l'inventaire du monde. Sa réponse penche vers la sobriété : des objets physiques, entendus largement comme les contenus matériels de régions de l'espace-temps, fussent-elles discontinues, et, parce que la science, et en particulier les mathématiques, ne peut s'en passer, des classes, c'est-à-dire des ensembles, admis pour leur puissance théorique autant que pour la netteté de leurs critères d'identité. Les premiers fournissent l'ameublement concret ; les secondes, l'ossature abstraite sans laquelle on ne peut formuler les lois quantitatives de la physique. Quine résiste en revanche aux propriétés, aux significations et aux propositions, qu'il tient pour des entités intensionnelles mal individuées. Sa raison est toujours la même, et elle a valeur de maxime : « pas d'entité sans identité. »<ref>La maxime « pas d'entité sans identité » (« No entity without identity ») est formulée dans « Parler d'objets » (« Speaking of Objects »), repris dans ''Relativité de l'ontologie et autres essais'', trad. Jean Largeault, Paris, Aubier-Montaigne, 1977 (''Ontological Relativity and Other Essays'', ci-après ''OR'', New York, Columbia University Press, 1969, p. 23).</ref> Une entité n'est admissible que si l'on peut dire à quelle condition elle est identique à une autre ou en diffère. Les classes satisfont à cette exigence, car deux classes sont identiques si et seulement si elles ont les mêmes éléments. Les propriétés n'y satisfont pas : nul critère ne dit quand « avoir un cœur » et « avoir des reins », vrais des mêmes êtres, expriment une seule propriété ou deux. Faute d'identité, point d'entité ; et c'est tout un pan de l'ontologie traditionnelle qui se trouve congédié au nom de cette discipline.
== Les deux dogmes de l'empirisme ==
Paru en 1951, « Deux dogmes de l'empirisme » est sans doute l'un des articles les plus lus et les plus discutés de la philosophie analytique.<ref>W. V. O. Quine, « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', éd. citée (« Two Dogmas of Empiricism », ''FLPV'', p. 20-46). L'article parut d'abord dans ''The Philosophical Review'' en janvier 1951.</ref> Quine y dénonce deux croyances que l'empirisme moderne partageait sans les interroger : la distinction entre énoncés analytiques et énoncés synthétiques, et le réductionnisme, c'est-à-dire l'idée que chaque énoncé, pris à part, possède un contenu empirique propre. Ces deux dogmes, montre-t-il, sont liés à la racine, et leur abandon transforme la figure de l'empirisme.
=== Le premier dogme : la distinction analytique et synthétique ===
L'opposition vient de loin. Kant distinguait les jugements analytiques, où le concept du prédicat est déjà contenu dans celui du sujet (« tous les corps sont étendus »), des jugements synthétiques, qui ajoutent au sujet une information nouvelle (« tous les corps sont pesants »). Les empiristes logiques avaient repris la distinction sous une forme linguistique : est analytique l'énoncé vrai en vertu des seules significations des mots qui le composent, indépendamment de tout fait du monde. « Aucun célibataire n'est marié » serait de ce type : il suffit de comprendre les mots pour en reconnaître la vérité. Cette catégorie était précieuse, car elle offrait un asile aux vérités de la logique et des mathématiques. Si ces vérités sont analytiques, on peut les tenir pour certaines et nécessaires sans renoncer au principe empiriste selon lequel tout savoir procède de l'expérience : elles ne disent rien sur le monde, elles explicitent notre langage.
Quine ne conteste pas qu'il existe des énoncés que tout le monde range spontanément du côté de l'analytique. Il conteste qu'on puisse rendre cette notion claire. Sa stratégie consiste à demander qu'on lui explique « analytique » sans tourner en rond. Une première classe d'énoncés analytiques, les vérités logiques au sens strict comme « aucun homme non marié n'est marié », ne pose pas de problème : elles restent vraies sous toute réinterprétation de leurs termes non logiques. La difficulté commence avec la seconde classe, celle de « aucun célibataire n'est marié », qui ne devient une vérité logique que si l'on remplace « célibataire » par son synonyme « homme non marié ». Tout repose alors sur la notion de synonymie, c'est-à-dire d'identité de signification. Or qu'est-ce que la synonymie ? Si l'on répond qu'elle se fonde sur les définitions, Quine objecte que les définitions du dictionnaire ne font que consigner des synonymies déjà admises : le lexicographe rapporte un usage, il ne le crée pas, sauf dans le cas particulier de la stipulation explicite. Si l'on répond que deux termes sont synonymes lorsqu'ils sont interchangeables partout sans changer la valeur de vérité, Quine montre que ce critère, dans un langage extensionnel, ne garantit que la coextensivité, non l'identité de signification ; et que, pour exclure les coïncidences accidentelles, on doit faire appel à une notion de nécessité, laquelle reconduit en sous-main à l'analyticité que l'on cherchait à définir. Le cercle se referme : analyticité, synonymie, définition, nécessité forment une famille de notions qui se renvoient les unes aux autres sans qu'aucune prenne pied hors du cercle.
On objectera qu'il suffit de poser des règles sémantiques, comme le proposait Carnap, qui spécifieraient pour un langage donné quels énoncés y sont analytiques. Quine répond que cela déplace la difficulté sans la résoudre. Une liste de règles nous apprend quels énoncés sont appelés analytiques dans tel langage artificiel ; elle ne nous apprend pas ce que signifie le mot « analytique » lui-même, ce que ces énoncés ont en commun qui justifierait l'étiquette. On nous explique « analytique-dans-le-langage-L », pour un L particulier, mais non l'adjectif « analytique » en général, qui seul nous intéresse. La notion demeure, selon le mot de Quine, un article de foi métaphysique au cœur même de l'empirisme.
Il faut se garder, sur ce point, d'une lecture trop tranchée. Quine ne nie pas qu'il existe des énoncés que l'usage range du côté de l'analytique, ni qu'on puisse, dans un langage construit, fixer par convention quels énoncés y seront tenus pour tels. Le Quine tardif va plus loin : dans ''Les racines de la référence'' (1974), il propose même un critère comportemental de l'analyticité, un énoncé étant analytique lorsque tout locuteur en apprend la vérité en même temps qu'il apprend les mots qui le composent. Selon ce critère, « aucun célibataire n'est marié » et l'essentiel de la logique élémentaire ressortissent bien à l'analytique. Ce que Quine combat n'est donc ni l'analyticité ordinaire ni l'analyticité réglée d'un langage formel, mais une troisième notion, plus ambitieuse : celle qui prétendrait fonder en raison la nécessité des mathématiques et tracer entre l'a priori et l'empirique la frontière étanche dont Carnap avait besoin. Cette analyticité forte, son critère ne la livre pas, car les mathématiques n'en relèvent pas. C'est elle, et elle seule, que « Deux dogmes » entreprend de dissoudre.<ref>Sur le critère tardif de l'analyticité, voir W. V. O. Quine, ''The Roots of Reference'', La Salle, Open Court, 1974, p. 78-80 (ouvrage non traduit en français), et l'analyse de Richard Creath, « Quine on the Intelligibility and Relevance of Analyticity », dans ''The Cambridge Companion to Quine'', éd. citée, p. 47-64.</ref>
=== Le second dogme : le réductionnisme ===
Le second dogme est le réductionnisme, sous sa forme moderne : la croyance que tout énoncé doué de sens est traduisible en un énoncé portant sur l'expérience immédiate, ou du moins qu'à chaque énoncé est associé un domaine d'expériences qui le confirmeraient et un autre qui l'infirmeraient. C'est la version de la théorie vérificationniste de la signification qui rattache le contenu d'une phrase aux observations qui la vérifient. Quine fait observer que ce dogme est le pendant du premier. Car si chaque énoncé avait son contenu empirique propre, on pourrait définir l'analyticité comme le cas limite : serait analytique l'énoncé dont le contenu empirique est vide, qui se confirme quoi qu'il arrive. Les deux dogmes sont, dit-il, identiques à la racine.
Or le réductionnisme ne résiste pas à l'examen. Quine y oppose un argument qu'il emprunte au physicien et historien des sciences Pierre Duhem : on ne peut pas soumettre à l'expérience une hypothèse isolée. Quand une prédiction tirée d'une théorie se trouve démentie, l'expérience ne nous dit pas quel énoncé est en faute. Elle frappe la théorie comme un tout, et c'est à nous de répartir le blâme. Nous pouvons abandonner l'hypothèse mise à l'épreuve, mais nous pouvons aussi mettre en cause une loi auxiliaire, une condition initiale, un principe de l'instrument de mesure, voire, en dernier recours, une règle de la logique. Aucun énoncé ne se présente seul devant le tribunal de l'expérience. Il n'y a donc pas de contenu empirique attaché à l'énoncé pris isolément ; ce contenu n'appartient qu'à des ensembles d'énoncés, et, à la limite, à la science tout entière. L'unité de signification empirique n'est pas la phrase, mais le système. Voilà qui prive le réductionnisme de son objet et, du même coup, ruine l'espoir de définir l'analyticité comme degré zéro du contenu empirique. En tombant, le second dogme entraîne le premier.
== Le holisme et la révision des croyances ==
Une fois les deux dogmes écartés, l'empirisme prend un autre visage, que Quine peint dans la dernière partie de « Deux dogmes » à l'aide d'une image souvent reprise. La totalité de notre savoir, des vérités les plus quotidiennes de la géographie aux lois de la physique atomique et jusqu'aux théorèmes de la logique, forme un tissu fait de main d'homme qui ne touche l'expérience que par ses bords. Ou, pour changer de figure, la science tout entière est comme un champ de forces dont les conditions aux limites sont l'expérience. Un conflit avec l'expérience, à la périphérie, oblige à des réajustements à l'intérieur du champ : il faut redistribuer des valeurs de vérité sur certains de nos énoncés. Mais le champ est si lâchement déterminé par ses bords que nous gardons une large latitude quant aux énoncés à réviser à la lumière d'une expérience contraire donnée. Aucune expérience particulière n'est liée à un énoncé particulier de l'intérieur du champ, sinon de façon indirecte, par les exigences d'équilibre qui affectent le champ comme un tout.<ref>« Deux dogmes de l'empirisme », sixième section, « L'empirisme sans les dogmes » : le « tissu fait de main d'homme » et le « champ de forces » sont décrits p. 42, « aucun énoncé n'est à l'abri d'une révision » p. 43, les « dieux d'Homère » p. 44 et le « pragmatisme plus poussé » p. 46 (''FLPV'', éd. citée).</ref>
De cette image se déduisent les deux formules les plus frappantes de l'article. Premièrement : tout énoncé peut être tenu pour vrai quoi qu'il arrive, pourvu que nous fassions des ajustements assez énergiques ailleurs dans le système. Même un énoncé proche de la périphérie peut être maintenu en dépit d'une expérience récalcitrante, en plaidant l'hallucination ou en retouchant certaines des lois dites logiques. Deuxièmement, et inversement : aucun énoncé n'est à l'abri d'une révision. On a même proposé de réviser la loi logique du tiers exclu pour simplifier la mécanique quantique ; et quelle différence de principe y a-t-il entre un tel changement et celui par lequel Kepler a supplanté Ptolémée, ou Einstein Newton, ou Darwin Aristote ? Les énoncés de la logique et des mathématiques ne jouissent d'aucune immunité spéciale ; ils occupent seulement une position centrale dans le réseau, loin des bords, là où peu de connexions avec une expérience particulière s'imposent. C'est pourquoi nous hésitons davantage à les abandonner : leur révision aurait des répercussions étendues. Cette résistance est affaire de degré, non de nature.
Ce holisme renverse la hiérarchie héritée. Il n'y a plus de partage tranché entre des [[Dictionnaire de philosophie/Croyance|croyances]] purement empiriques, qui affronteraient seules l'expérience, et des vérités purement formelles, qui en seraient à l'abri. Toutes nos croyances tiennent ensemble par leurs liens logiques, et c'est l'ensemble qui se confronte au monde. Les énoncés de la logique, des mathématiques, de l'ontologie, sont au cœur du réseau ; ceux de l'histoire et de la perception, à sa marge. Mais ce ne sont là que des positions relatives sur une même étoffe, non des espèces hétérogènes.
Pour rendre ces distances tangibles, Quine recourt à des exemples ordinaires. Qu'une expérience nous surprenne, et, selon les cas, nous y ferons face en corrigeant l'énoncé qu'il y a des maisons de brique dans telle rue, ou bien l'énoncé qu'il n'existe pas de centaures. De tels énoncés ont une référence empirique aiguë : ils touchent presque au bord du tissu. Les énoncés de la physique des particules, des mathématiques ou de l'ontologie, eux, gisent au centre, non parce qu'ils échapperaient à l'expérience, mais parce qu'aucune sensation particulière ne s'y noue de façon saillante. C'est pourquoi nous révisons d'abord les premiers : non par contrainte logique, mais par souci de troubler l'ensemble le moins possible.<ref>L'exemple des maisons de brique et des centaures illustre la « référence empirique aiguë » de certains énoncés (« Deux dogmes de l'empirisme », ''FLPV'', éd. citée, p. 43-44).</ref>
Quine en tire une conséquence sur le statut des objets eux-mêmes. Les objets physiques, écrit-il, sont introduits dans notre conception comme des intermédiaires commodes, non par définition à partir de l'expérience, mais à titre de simples postulats, comparables, sur le plan de la connaissance, aux dieux d'Homère. La comparaison est calculée pour choquer, et Quine en précise aussitôt la portée. Lui-même croit aux objets physiques et non aux dieux d'Homère, et il tient pour une erreur scientifique de croire le contraire. Mais quant à leur statut épistémologique, les uns et les autres ne diffèrent que par degré : tous deux entrent dans notre conception comme des entités posées par la culture. Le mythe des objets physiques l'emporte sur les autres en ceci qu'il s'est révélé plus efficace qu'eux pour ménager une structure maniable dans le flux de l'expérience. Postuler des corps, des atomes, des forces, des classes, c'est se donner des instruments d'organisation et de prédiction ; la science continue en cela le geste du sens commun, qui gonfle l'ontologie pour simplifier la théorie.
Deux notions complètent ce tableau et l'éloignent du relativisme facile auquel on le réduit parfois. La première est la sous-détermination des théories par l'expérience : pour un même corps de données possibles, plusieurs théories rivales, incompatibles entre elles, peuvent rendre compte également bien des observations. Les bords du champ ne fixent pas son intérieur. La seconde est que ce jeu n'est pas arbitraire. Quand l'expérience nous contraint à retoucher notre système, deux forces guident notre choix : un conservatisme qui nous porte à déranger le système le moins possible, et une quête de simplicité qui nous fait préférer les hypothèses les plus économiques. Carnap, Lewis et d'autres adoptaient une attitude pragmatique pour le choix entre formes de langage, mais leur pragmatisme s'arrêtait à la frontière supposée de l'analytique et du synthétique. En supprimant cette frontière, Quine étend le pragmatisme à toute la science : chacun reçoit un héritage scientifique et un flux continu de stimulations sensorielles, et les considérations qui le guident, lorsqu'il ajuste cet héritage à ces stimulations, sont, dans la mesure où elles sont rationnelles, pragmatiques. L'empirisme sans les dogmes devient un pragmatisme plus conséquent, attentif à la fois à l'expérience, qui contraint, et à la cohérence du système, qui oriente.
Quine a tempéré, avec le temps, la version forte de 1951. Dans « Two Dogmas in Retrospect » (1991), il reconnaît que faire comparaître la science tout entière à chaque épreuve allait au-delà de ce qu'exigeait sa critique du réductionnisme. Il parle désormais d'un holisme modéré. Ce qui affronte l'expérience, ce ne sont pas des énoncés isolés ; mais ce n'est pas non plus la totalité de nos croyances : ce sont des ensembles d'énoncés assez vastes pour impliquer des prédictions observables, ce qu'il nomme des « masses sémantiques critiques ». Le principe demeure, intact : aucun énoncé n'est en droit à l'abri d'une révision. En fait, pourtant, l'épreuve porte sur des fragments de théorie, non sur le système entier à chaque instant. Quine en tire même une explication de la nécessité mathématique qui se passe d'analyticité : si l'énoncé mis en cause est purement mathématique, nous nous gardons de le réviser, car y toucher ébranlerait trop le reste de la science. C'est ce qu'il appelle la maxime de mutilation minimale. Dans ce cadre, la nécessité mathématique tient à la position centrale des mathématiques dans notre système et à notre politique rationnelle de porter ailleurs les révisions, sauf coût théorique exceptionnel.<ref>W. V. O. Quine, « Two Dogmas in Retrospect », ''Canadian Journal of Philosophy'', vol. 21, 1991, p. 265-274 (ici p. 269-270) ; voir aussi ''La poursuite de la vérité'', éd. citée, chap. 1. Sur ce holisme modéré et la « masse sémantique critique », voir Roger F. Gibson (dir.), ''The Cambridge Companion to Quine'', Cambridge University Press, 2004, p. 12-13.</ref>
== La traduction radicale et l'indétermination de la signification ==
Le holisme atteignait la théorie de la confirmation. Quine va l'étendre à la théorie de la signification, et c'est l'objet central du ''Mot et la chose'' (1960). Le fil conducteur en est une exigence naturaliste : si le langage est un comportement public, appris par l'enfant au contact d'autrui dans des situations observables, alors tout ce qu'il y a à savoir sur la signification doit pouvoir se lire dans ce comportement et dans les circonstances qui l'accompagnent. Il n'y a pas, dans l'apprentissage et l'usage d'une langue, de matière cachée à laquelle le sujet aurait un accès privé. Cette contrainte, Quine la met à l'épreuve par une expérience de pensée qu'il a rendue fameuse : la traduction radicale.
=== Le linguiste de terrain ===
[[Fichier:European Rabbit 09 05 2025 02.jpg|vignette|upright=1.15|« Gavagai. » Un lapin détale, l'indigène prononce ce mot, le linguiste note « Lapin ». Mais rien dans la scène ne décide si le terme indigène vise un lapin entier, un segment temporel de lapin, ou un agrégat de parties non détachées de lapin.]]
Imaginons un linguiste qui aborde une langue jusqu'alors inconnue, sans interprète, sans dictionnaire, sans la moindre passerelle avec une langue déjà comprise. Tout ce dont il dispose, ce sont les sons que prononcent les indigènes et les circonstances visibles où ils les prononcent. C'est la situation de la traduction radicale, où l'on doit tout reconstruire à partir du seul comportement. Un lapin détale, l'indigène dit « Gavagai », et le linguiste inscrit provisoirement « Lapin » comme traduction. Pour étayer cette conjecture, il guette les occasions : il prononce lui-même « Gavagai ? » dans diverses situations et note si l'indigène marque son assentiment, son refus, ou ni l'un ni l'autre. À force d'observations, il accumule des indices et finit par tenir « Gavagai » pour synonyme de « Lapin ».
Ce que le linguiste peut établir ainsi, Quine le nomme la signification stimulante (stimulus meaning) d'une phrase d'occasion : l'ensemble des stimulations sensorielles qui disposeraient l'indigène à donner son assentiment, et l'ensemble de celles qui provoqueraient son refus. Il importe de penser ce qui déclenche l'assentiment comme une stimulation, non comme le lapin lui-même : la stimulation reste la même si l'on remplace l'animal par un leurre habile, et elle change si l'on bouche les yeux de l'indigène. Sur cette base étroite, Quine reconnaît que certains énoncés se laissent traduire avec une assurance suffisante. Ce sont les énoncés d'observation, dont l'assentiment est étroitement commandé par la stimulation présente, et qui constituent le point d'ancrage de la langue dans le monde. « Gavagai » et « Voici un lapin » sont, en ce sens limité, synonymes stimulants : ils commandent l'assentiment dans les mêmes circonstances.
=== Le lapin, ses parties et sa lapinité ===
Il faut ici dissiper une confusion fréquente, car l'exemple du lapin sert en réalité deux thèses voisines mais distinctes. Comme phrase d'observation, « Gavagai » se laisse traduire avec assurance : sa signification stimulante est déterminée, et « Voici un lapin » en est un bon équivalent. La difficulté surgit au niveau du terme. La première thèse, l'inscrutabilité de la référence, porte précisément sur les termes, sur ce que désigne le mot « gavagai » pris à part. La seconde, l'indétermination de la traduction proprement dite, est plus large : elle porte sur les phrases, et surtout sur les énoncés éloignés de l'observation, dont rien ne fixe la traduction même lorsque celle des termes serait arrêtée. Le doute entre le lapin, ses parties et ses phases relève de la première ; il en offre l'image la plus parlante, mais on aurait tort d'y réduire la seconde.
Voici le ressort de l'argument. L'accord sur la signification stimulante de « Gavagai » comme phrase ne garantit nullement que « gavagai » et « lapin » soient des termes coextensifs, vrais des mêmes choses. Car que désigne au juste « gavagai » ? Peut-être des lapins ; mais peut-être de simples segments temporels de lapins, de brèves tranches de leur durée ; ou encore l'ensemble des parties non détachées de lapins ; ou même la fusion de tous les lapins en une seule portion discontinue de l'espace-temps ; ou enfin la lapinité, ce trait universel partout où un lapin se manifeste. Dans tous ces cas, la signification stimulante serait la même. Pointer un lapin, c'est aussi bien pointer une de ses parties, un de ses instants, la fusion à laquelle il appartient, le lieu où la lapinité s'incarne. Aucune ostension, aucune désignation par le doigt ne tranche entre ces lectures, car ce qui les distingue n'est pas dans la ressemblance des stimulations, mais dans l'anatomie des phrases : dans la manière dont la langue manie l'identité, la pluralité, les articles, ce que Quine appelle l'appareil de la référence.
Or cet appareil, le linguiste ne peut le mettre en évidence qu'en posant des hypothèses sur la façon dont la langue indigène rend nos propres procédés : nos pronoms, notre copule, notre « est le même que ». Ces hypothèses, que Quine nomme hypothèses analytiques, vont au-delà de tout ce que la signification stimulante autorise. Elles sont indispensables pour passer de la traduction des phrases d'occasion à celle des termes, mais rien dans le comportement ne les impose. Le linguiste peut équivaloir « gavagai » à « lapin », ou à « segment de lapin », ou à « partie non détachée de lapin », et compenser ce choix en ajustant la traduction de l'identité et des particules associées, sans jamais entrer en conflit avec les significations stimulantes. La référence des termes étrangers reste, selon le mot de Quine, inscrutable. Les phrases d'occasion et la signification stimulante sont une monnaie commune ; les termes et la référence, eux, sont propres à notre schème conceptuel.<ref>W. V. O. Quine, ''Le mot et la chose'', § 12, trad. Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977 (''Word and Object'', Cambridge (Mass.), The MIT Press, 1960). Le lapin, ses segments, ses parties non détachées et la lapinité, ainsi que la remarque selon laquelle « l'inscrutabilité tient non à la ressemblance, mais à l'anatomie des phrases », occupent le § 12 (p. 51-53 de l'éd. de 1960).</ref>
=== Le mythe du musée ===
Derrière cet argument, Quine vise une certaine image de la signification, qu'il appelle le mythe du musée. Selon cette image, les significations seraient à nos expressions ce que les tableaux exposés dans un musée sont à leurs étiquettes : des objets fixes, indépendants des langues, que les mots se borneraient à désigner. Deux expressions seraient synonymes lorsqu'elles renvoient à une même signification, comme deux étiquettes pour un seul tableau ; et traduire un mot, ce serait lui trouver, dans une autre langue, l'étiquette qui pend au même tableau, c'est-à-dire à la même signification interlinguistique. Ce que cet argument établit, c'est qu'aucune signification de ce genre, antérieure aux langues et commune à elles, ne vient fixer la traduction. Il n'existe pas de signification de « Gavagai » qui dirait, par-delà tout comportement, s'il faut le rendre par « lapin » ou par « segment de lapin ». La signification n'est pas un objet logé dans un musée mental : elle se réduit à ce que le comportement linguistique, dans ses circonstances, peut exhiber, c'est-à-dire à la signification stimulante, bien plus pauvre que la synonymie pleine que les philosophes lui prêtaient.<ref>Le « mythe du musée », où « les pièces exposées sont des significations et les mots, des étiquettes », ouvre « La relativité de l'ontologie », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Ontological Relativity », ''OR'', p. 27).</ref>
=== L'indétermination de la traduction ===
De là procède la thèse de l'indétermination de la traduction. Deux linguistes, travaillant indépendamment sur la même langue, pourraient produire deux manuels de traduction, chacun cohérent avec la totalité du comportement verbal observable, et pourtant inconciliables entre eux : là où l'un rendrait une phrase d'une certaine façon, l'autre la rendrait d'une façon que le premier rejetterait. Aucun fait, pas même la totalité des dispositions verbales des locuteurs, ne permettrait de dire lequel a raison, car il n'y a pas, en ce domaine, de fait de l'affaire qui excède le comportement. La traduction n'est pas seulement difficile ou faillible : elle est, en un sens précis, sous-déterminée par tout ce qui pourrait en décider.
Quine insiste sur un point qu'on néglige souvent. S'il a choisi pour théâtre une langue exotique, c'est pour rendre la thèse plausible, à la manière des ''Voyages de Gulliver'' qui éclairent nos mœurs en les transposant dans des contrées étranges. Mais la leçon vaut aussi pour notre propre langue. Étant donné deux manuels rivaux entre la langue de la jungle et la nôtre, nous pouvons traduire perversement notre langue en elle-même, en la faisant passer par la jungle au moyen d'un manuel, puis revenir au moyen de l'autre. L'indétermination n'est pas un accident de l'éloignement ; elle tient à la nature même de la signification. Ce qui se donnait pour un objet bien défini, le sens d'une phrase ou d'un mot, se révèle un mythe dès qu'on exige qu'il rende compte de plus que ce que le comportement public peut porter.
Un écueil guette ici, qu'il faut écarter : confondre cette indétermination avec la sous-détermination des théories physiques rencontrée à propos du holisme. Une théorie de la nature est sous-déterminée parce que les données laissent ouvertes plusieurs descriptions du monde ; mais il y a, sous ces descriptions, un monde à décrire : les théories rivales diffèrent par ce qu'elles disent de la réalité, même si les observations disponibles, voire toutes les observations possibles, ne suffisent pas à les départager. Dans le cas de la traduction, soutient Quine, il n'en va pas ainsi : ce n'est pas que le fait de la signification nous échappe, c'est qu'il n'existe aucun fait à atteindre. L'indétermination n'est pas une ignorance, mais une absence. C'est en ce point précis que la thèse heurte le sens commun, et que ses adversaires la jugent tantôt triviale, tantôt incroyable.<ref>Sur l'idée qu'il n'y a, en matière de signification, aucun fait à connaître, voir « Parler d'objets » (''OR'', éd. citée, p. 5) et ''Le mot et la chose'', § 16. Quine précisera la distinction d'avec la sous-détermination dans ''La poursuite de la vérité'', éd. citée, chap. 1.</ref>
== L'inscrutabilité de la référence et la relativité de l'ontologie ==
L'indétermination de la traduction se rapporte aux phrases et à leur sens. Quine isole un autre phénomène, voisin mais distinct, qui touche cette fois la référence des termes : l'inscrutabilité de la référence. Il l'avait déjà rencontré avec « gavagai », où rien ne fixait si le terme renvoyait au lapin, à ses parties ou à sa fusion. Il en donne dans « La relativité de l'ontologie » (1968) une formulation générale, à l'aide de ce qu'il appelle des fonctions de substitution. Soit une théorie quelconque ; remplaçons systématiquement chacun de ses objets par un autre, au moyen d'une correspondance terme à terme. À chaque objet, faisons par exemple correspondre son singleton, c'est-à-dire la classe qui n'a que lui pour élément ; ou bien son complément spatio-temporel, c'est-à-dire tout le reste du monde, lui excepté. Si l'on réinterprète en même temps tous les prédicats de la théorie de manière concertée, l'ensemble des énoncés vrais reste exactement le même, et avec lui la totalité de la matière probante. Du dehors, rien ne distingue la théorie qui parle de lapins de celle qui parle de singletons de lapins. La référence de chaque terme est, en ce sens, indéterminée : on peut faire tourner l'univers des objets sans que la trame des vérités s'en ressente.<ref>W. V. O. Quine, « La relativité de l'ontologie » (''Relativité de l'ontologie et autres essais'', éd. citée). Les fonctions de substitution, qui établissent l'inscrutabilité de la référence, sont introduites ''OR'', p. 47 et suiv.</ref>
Quine en tire une conséquence sur le sens même des questions d'ontologie. Demander, dans l'absolu, quels sont les objets d'une théorie n'a pas de sens. La question ne devient sensée que relativement à un manuel de traduction dans une théorie d'arrière-plan. C'est seulement en rapportant une langue à une autre, prise pour cadre, que l'on peut dire ce dont parle la première ; et cette théorie d'arrière-plan demande à son tour, si on l'interroge, d'être rapportée à une autre. La référence est ainsi relative, comme la position d'un point est relative à un système de coordonnées. Il est vain de demander où se trouve un objet dans l'espace absolu ; on ne peut indiquer sa place que par rapport à un repère. De même, il est vain de demander quels objets une théorie pose en elle-même ; on ne peut le dire que par rapport à un cadre que l'on adopte sans le mettre lui-même en question. Telle est la relativité de l'ontologie.
On évitera un contresens. Quine ne soutient pas que les objets seraient des illusions, ni que tout se vaut. Resté à l'intérieur de notre langue, sans la mettre en balance avec une autre, je parle bel et bien de lapins, de tables et de nombres, et la question « combien de lapins ? » a une réponse déterminée. C'est l'image qu'il propose en disant qu'il faut « rester à bord de son propre langage » et ne pas faire tanguer la barque : tant qu'on n'entreprend pas de traduire son langage en un autre, ou de le permuter sur lui-même, la référence va de soi.<ref>Sur l'image de rester « à bord de son propre langage » sans « faire tanguer la barque », et sur la traduction perverse de l'anglais en anglais, voir « La relativité de l'ontologie » (''OR'', p. 30 et p. 47-48) et ''La poursuite de la vérité'', trad. Maurice Clavelin, Paris, Seuil, 1993.</ref> Elle ne devient inscrutable que lorsqu'on prend du recul, qu'on contemple une réinterprétation globale ou qu'on traduit. Ce que Quine appelle dans ses derniers textes son structuralisme global tient en ceci : ce que nos théories saisissent du monde, c'est une structure, le réseau des rôles imbriqués que remplissent les objets, et non l'identité propre de ces objets pris un à un. « La structure est ce qui importe à la science, écrit-il, non le choix de ses objets. » Ceux-ci ne sont plus alors que des « points neutres » dans l'armature logique de notre théorie, et leur nature intime reste hors d'atteinte. Il faut pourtant se garder d'un dernier malentendu : ce structuralisme n'est pas une thèse sur ce qui existe. Quine ne soutient pas que seules les structures seraient réelles, ni que tout se réduirait à des relations sans termes ; il continue d'admettre des objets, corps et classes. Il soutient seulement qu'aucun fait ne décide lesquels, parmi des objets que l'on peut mettre en correspondance terme à terme, portent vraiment la structure. Sauver la structure, en somme, c'est tout sauver.<ref>« La structure est ce qui importe à la science, non le choix de ses objets » : W. V. O. Quine, « Things and Their Place in Theories », dans ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981, p. 20. Les objets réduits à des « points neutres » dans la structure logique de la théorie : ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995, p. 74-75. Sur le caractère non ontologique de ce structuralisme, qui n'infère pas que seules les structures existent, voir Frederique Janssen-Lauret (dir.), ''Quine, Structure, and Ontology'', Oxford University Press, 2020, notamment l'introduction et le chapitre de Michael Resnik.</ref>
== L'épistémologie naturalisée ==
Le dernier grand déplacement opéré par Quine concerne l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] elle-même. Exposé surtout dans « L'épistémologie naturalisée » (1969)<ref>W. V. O. Quine, « L'épistémologie naturalisée », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Epistemology Naturalized », ''OR'', p. 69-90). L'épistémologie « comme chapitre de la psychologie », la « contenance réciproque » et le rapport entre « l'entrée maigre et la sortie torrentielle » se trouvent p. 83.</ref>, il consiste à ranger la théorie de la connaissance parmi les sciences de la nature, au rebours d'une tradition qui voulait qu'elle les précède et les fonde.
=== La fin de la philosophie première ===
Depuis [[Dictionnaire de philosophie/René Descartes|Descartes]], l'épistémologie se voulait une philosophie première : une discipline antérieure à la science, chargée d'en assurer les fondements depuis un point d'appui que la science ne fournirait pas. Le projet avait deux versants. Sur le versant doctrinal, il s'agissait de déduire les vérités sur le monde à partir de l'expérience immédiate, avec la certitude de la logique ; c'était la quête cartésienne de la [[Dictionnaire de philosophie/Certitude|certitude]]. Sur le versant conceptuel, il s'agissait de définir les notions de la science à partir des seuls termes d'observation. L'aboutissement le plus accompli de ce second versant est l{{'}}''Aufbau'' de Carnap (1928), qui entreprend de construire le monde comme un édifice logique élevé sur la base des données sensibles.
Quine tient ce projet pour irrémédiablement échoué, et il s'y connaît, lui qui admirait Carnap. Sur le versant doctrinal, l'échec était reconnu de longue date : on ne peut déduire la science de l'expérience, car la plus modeste des généralisations sur l'observable porte sur plus de cas que son auteur n'en a jamais pu observer. La quête de certitude était une cause perdue, héritée de Hume autant que de Descartes. Sur le versant conceptuel, l'entreprise de l{{'}}''Aufbau'' achoppe elle aussi. Carnap ne parvient pas à fournir une réduction par traduction, c'est-à-dire une recette permettant de réécrire chaque énoncé sur le monde en termes d'observation, de logique et de théorie des ensembles. Au point capital, là où il faut assigner des qualités sensibles à des positions dans l'espace et le temps, il ne donne qu'une consigne d'ajustement, révisable au fil de l'expérience, et non une définition. L'idéal d'une réduction du monde à l'expérience demeure hors d'atteinte.
L'échec du fondationnalisme ne signe pourtant pas la mort de l'empirisme. Deux thèses empiristes, souligne Quine, demeurent intactes. La première : toute la matière probante dont dispose la science est de nature sensorielle. La seconde : l'apprentissage du sens des mots repose en dernière instance sur l'expérience sensible. Ce qui s'effondre, c'est l'ambition de déduire la science de cette base ; ce qui subsiste, c'est que la science n'a pas d'autre source d'épreuve que l'irritation de nos surfaces sensorielles. Le naturalisme de Quine n'est donc pas un congé donné à l'empirisme, mais sa reformulation : un empirisme qui renonce au fondement sans renoncer à l'expérience.<ref>« L'épistémologie naturalisée » (''OR'', éd. citée, p. 75) : « toute matière probante de la science est sensorielle » et « l'inculcation du sens des mots repose en dernier ressort sur la matière probante sensorielle ».</ref>
=== Un chapitre de la psychologie ===
Devant cet échec, Quine propose un renversement. Puisque le rêve de déduire la science de l'observation est perdu, pourquoi ne pas se contenter de la psychologie ? Pourquoi ne pas étudier, simplement, comment l'édifice de nos croyances s'élève en fait sur la base des stimulations sensorielles ? On objectait jadis à cette idée un cercle vicieux : si l'épistémologue veut valider les fondements de la science, il se contredit en usant, pour cela, de la science elle-même. Mais ce scrupule, observe Quine, perd toute portée dès qu'on a cessé de vouloir déduire la science de l'observation. Si nous cherchons seulement à comprendre le lien entre l'observation et la théorie, nous avons tout intérêt à mobiliser toute l'information disponible, y compris celle que nous fournit la science même dont nous étudions le rapport à l'observation. La crainte de la circularité n'a de sens que pour qui poursuit encore une fondation ; elle s'évanouit pour qui cherche seulement à comprendre.
L'épistémologie trouve alors une place nouvelle : elle devient un chapitre de la psychologie, et par là de la science de la nature. Elle étudie un phénomène naturel, à savoir un sujet humain physique. On accorde à ce sujet une certaine entrée, contrôlée par l'expérimentateur, sous forme de schémas d'irradiation de ses surfaces sensorielles ; et, le temps venu, le sujet livre en sortie une description du monde extérieur à trois dimensions et de son histoire. La relation entre cette entrée maigre et cette sortie torrentielle est précisément ce que l'épistémologue est conduit à étudier, pour des raisons à peu près semblables à celles qui ont toujours animé sa discipline : voir comment la matière probante se rattache à la théorie, et en quoi notre théorie de la nature déborde toute donnée disponible.
Quine décrit le rapport ainsi obtenu entre l'épistémologie et la science par une formule en forme de boucle : il y a contenance réciproque. L'ancienne épistémologie aspirait à contenir la science, à la construire à partir des données sensibles ; la nouvelle, à l'inverse, est contenue dans la science, comme un chapitre de la psychologie. Mais l'ancienne contenance vaut aussi, à sa manière, car nous étudions comment notre sujet pose des corps et projette sa physique à partir de ses données, et nous comprenons que notre propre position dans le monde ne diffère en rien de la sienne. Notre étude de la connaissance, la psychologie où elle s'inscrit, la science tout entière qui contient cette psychologie : tout cela est notre propre construction, projetée à partir de stimulations semblables à celles que nous administrons au sujet observé. Nul cercle vicieux là-dedans, une fois renoncé au rêve de la déduction : nous cherchons à comprendre la science comme un processus dans le monde, et nous n'exigeons pas que cette compréhension soit plus assurée que la science qui en est l'objet.
Cette attitude, Quine la rattache à une image qu'il emprunte à Otto Neurath et qu'il affectionne : celle du [[Dictionnaire de philosophie/Bateau de Neurath|bateau de Neurath]].<ref>L'image du bateau est empruntée à Otto Neurath ; Quine la place en exergue du ''Mot et la chose'' et la reprend dans « L'épistémologie naturalisée » (''OR'', p. 84) ainsi que dans l'essai « Natural Kinds » (même volume, p. 127).</ref> Nous sommes comme des marins qui doivent réparer leur navire en pleine mer, sans pouvoir le mettre en cale sèche ni le reconstruire à neuf depuis la quille. Nous ne disposons d'aucun sol ferme extérieur à la science d'où la refonder ; nous travaillons toujours du dedans, remplaçant une planche après l'autre tout en restant à flot, en nous appuyant sur le reste de la coque. Il n'y a pas de point d'appui archimédien hors de nos croyances, pas de [[Dictionnaire de philosophie/A priori|donnée première]] soustraite à l'enquête. La philosophie ne surplombe pas la science : elle en fait partie, à la pointe la plus générale et la plus réflexive, mais sans privilège de juridiction. On objectera que naturaliser l'épistémologie, c'est la priver de sa fonction d'évaluation : si elle se borne à décrire comment nous formons nos croyances, que devient la question de savoir lesquelles sont justifiées ? Quine répond, on le verra, que la part normative n'est pas abolie, mais reconduite à l'intérieur de la science, sous la forme de recommandations sur les meilleurs moyens d'atteindre la vérité. Le naturalisme ne supprime pas la norme ; il cesse seulement de la chercher hors de la science.
== Logique, extensionnalisme et critique des modalités ==
Logicien de métier, Quine a soutenu en philosophie de la logique des positions cohérentes avec l'ensemble de son œuvre. La première est un extensionnalisme assumé. Un contexte est dit extensionnel lorsqu'on peut y remplacer un terme par un autre, vrai des mêmes objets, sans changer la valeur de vérité de l'énoncé, et lorsqu'on peut y substituer à une phrase toute phrase de même valeur de vérité. La logique classique des prédicats est extensionnelle ; elle ne connaît que les objets, leurs classes et la vérité ou la fausseté des énoncés. Quine y voit le langage le plus clair que nous ayons, et il refuse d'en sortir sans nécessité. Ce refus a une cible précise : les entités intensionnelles, c'est-à-dire les significations, les propositions et les propriétés, qui peuplent les contextes où la substitution échoue. On a vu pourquoi il les écarte : faute de critère d'identité, ces entités ne satisfont pas à la règle « pas d'entité sans identité ».
=== L'opacité des contextes modaux ===
C'est sur ce terrain que se joue la critique quinienne de la logique modale, celle qui ajoute à la logique les opérateurs « il est nécessaire que » et « il est possible que ». Quine ne conteste pas la logique modale comme calcul formel ; il conteste qu'on puisse l'interpréter de façon intelligible dès qu'on y fait entrer des quantificateurs. Son argument procède d'un exemple resté classique. Considérons les deux énoncés : « il est nécessaire que neuf soit plus grand que sept » et « il est nécessaire que le nombre des planètes soit plus grand que sept ». Le premier paraît vrai, les vérités de l'arithmétique passant pour les meilleures candidates à la nécessité. Le second paraît faux, car le nombre des planètes aurait pu être autre : le système solaire aurait pu se former avec moins d'astres. Or, à l'époque où Quine écrit, le nombre des planètes est neuf. On passe donc du premier énoncé au second en remplaçant un terme, « neuf », par un autre qui désigne le même objet, « le nombre des planètes » ; et cette substitution transforme un vrai en un faux. Le contexte modal est ainsi opaque à la référence : ce qui s'y dit ne dépend pas seulement de l'objet désigné, mais de la façon de le désigner.<ref>W. V. O. Quine, « Référence et modalité » (« Reference and Modality »), dans ''Du point de vue logique'', éd. citée : l'exemple du nombre des planètes est introduit ''FLPV'' p. 143, et l'« attitude discriminante » envers les façons de spécifier un objet, censée livrer son « essence », est dénoncée p. 155. Voir aussi « Les trois degrés de l'implication modale » (« Three Grades of Modal Involvement »), dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''The Ways of Paradox and Other Essays'', ci-après ''WP'', New York, Random House, 1966, p. 158 et p. 175).</ref>
Tant qu'on s'en tient à une modalité de dicto, qui porte sur des énoncés tout entiers, Quine concède qu'on peut donner un sens à ces tournures, en traitant la nécessité comme un prédicat attaché à des phrases plutôt qu'à des choses : « la phrase neuf est plus grand que sept est nécessaire ». La difficulté surgit quand on veut quantifier dans le contexte modal, c'est-à-dire affirmer une modalité de re, qui porte sur la chose elle-même : « il existe un objet qui est nécessairement plus grand que sept ». Une telle affirmation prétend qu'un objet possède une certaine propriété nécessairement, en lui-même, indépendamment de la manière dont on le spécifie. Or cela suppose, soutient Quine, ce qu'il nomme avec ironie l'essentialisme aristotélicien : la doctrine selon laquelle, parmi les propriétés vraies d'une chose, certaines lui appartiennent par essence et d'autres par accident, abstraction faite de toute description.
=== Le mathématicien cycliste ===
Pour faire sentir ce qu'il tient pour une perplexité légitime, Quine forge dans ''Le mot et la chose'' un exemple devenu un cas d'école. On dira peut-être que les mathématiciens sont nécessairement rationnels et non nécessairement bipèdes, tandis que les cyclistes sont nécessairement bipèdes et non nécessairement rationnels. Soit. Mais que dire d'un individu qui compte parmi ses occupations à la fois les mathématiques et la bicyclette ? Cet homme concret est-il nécessairement rationnel et accidentellement bipède, ou l'inverse ? La question, juge Quine, n'admet pas de réponse, et ne devrait pas en admettre.<ref>W. V. O. Quine, ''Le mot et la chose'', § 41 (''Word and Object'', éd. citée, p. 199).</ref> Car la rationalité ne lui revient nécessairement qu'en tant qu'on le considère comme mathématicien, et la bipédie qu'en tant qu'on le considère comme cycliste ; rapportées à l'objet nu, sans description privilégiée, ces nécessités s'évanouissent. L'essentialisme exige qu'on tienne pour mieux révélatrices de l'essence certaines manières de spécifier un objet, et pour trompeuses les autres. Cette préférence, Quine la trouve injustifiable, et la nécessité de re qui s'y appuie, à peine intelligible.
=== Attitudes propositionnelles et nécessité ===
La même opacité affecte les contextes de croyance, que Quine range parmi les attitudes propositionnelles. « Œdipe veut épouser Jocaste » peut être vrai quand « Œdipe veut épouser sa mère » est faux, alors même que Jocaste est sa mère. Là encore, la substitution de termes coréférents échoue, et pour la même raison : ce qui est en jeu n'est pas seulement l'objet, mais la façon dont il est présenté à l'esprit du croyant. Quine en conclut que ces tournures, indispensables à la vie ordinaire, résistent à une analyse extensionnelle et qu'il faut, en science rigoureuse, soit les paraphraser, soit s'en passer.
Il faut signaler que ces réserves n'ont pas eu le dernier mot. À partir de « La logique des noms propres » (''Naming and Necessity'') de Saul Kripke et de la sémantique des mondes possibles, une partie de la philosophie a réhabilité la nécessité de re, l'essentialisme et même la notion de vérité nécessaire connue a posteriori. Là où Quine voyait une notion à peine compréhensible, ces travaux ont vu un domaine cohérent et fécond. Le débat reste ouvert, et il oppose deux conceptions de la nécessité : pour Quine et l'empirisme logique, la nécessité, si elle a un sens, vient de nous, de notre langage ; pour la tradition issue de Kripke, elle est ancrée dans la nature des choses. Quine considérait cette seconde idée comme un retour à une métaphysique qu'il croyait dépassée.
=== La logique n'est pas vraie par convention ===
Reste la question du statut des vérités logiques elles-mêmes. L'empirisme logique tenait la logique et les mathématiques pour vraies en vertu de [[Dictionnaire de philosophie/Convention|conventions]] linguistiques. Quine, dès « Truth by Convention » (1936) puis dans « Carnap et la vérité logique », a démonté cette thèse par un argument de régression.<ref>W. V. O. Quine, « La vérité par convention » (« Truth by Convention », 1936) et « Carnap et la vérité logique » (« Carnap and Logical Truth »), repris dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''WP'', éd. citée, p. 89 et p. 113-114).</ref> Si les vérités logiques découlaient de conventions explicites, encore faudrait-il, pour en tirer les cas particuliers à partir des règles générales, user de la logique. On ne peut poser par convention l'infinité des vérités logiques qu'en les énonçant sous forme de quelques principes généraux, dont on déduirait les instances ; mais cette déduction présuppose déjà la logique qu'on prétendait fonder. La convention ne saurait donc engendrer la logique sans la supposer. Quine en conclut que les vérités logiques ne sont pas d'une autre nature que les autres : elles occupent simplement la position la plus centrale et la plus générale du réseau de nos croyances, là où nous touchons le moins volontiers, parce qu'y toucher bouleverserait tout le reste.
De là découle une dernière thèse, que résume une formule de sa ''Philosophie de la logique'' : changer de logique, c'est changer de sujet.<ref>W. V. O. Quine, ''Philosophie de la logique'', chap. 6, « Les logiques déviantes », trad. Jean Largeault, Paris, Aubier-Montaigne, 1975 (''Philosophy of Logic'', Cambridge (Mass.), Harvard University Press, 1970, p. 81 ; sur le « prix » d'une logique déviante, p. 86-87).</ref> Qui prétend réviser une loi logique, par exemple en rejetant le tiers exclu, ne réfute pas l'ancienne loi ; il donne un sens nouveau aux connecteurs, et parle désormais d'autre chose. La logique reste révisable en droit, comme tout le reste du tissu de la science, car aucun énoncé n'y est sacré ; mais sa centralité même fait qu'on ne la révise qu'en dernière extrémité, sous la pression d'une simplification d'ensemble assez forte pour le justifier. Le maintien de la logique classique n'est pas, chez Quine, un dogme : c'est le fruit du conservatisme et de la quête de simplicité qui gouvernent toutes nos révisions, sous la conduite de la maxime de mutilation minimale déjà rencontrée. Réviser une loi logique entraînerait une refonte de si grande ampleur du réseau théorique que le coût en serait, presque toujours, hors de proportion avec le gain. Aussi Quine n'a-t-il jamais recommandé les logiques déviantes : il en admet la possibilité de principe, mais sa maxime milite contre elles, sauf bénéfice théorique exceptionnel, comme celui qu'on a cru parfois entrevoir du côté de la mécanique quantique.
== Postérité et discussions ==
[[Fichier:Willard Van Orman Quine on Bluenose II in Halifax NS harbor 1980.jpg|vignette|upright=1|Quine à la barre du Bluenose II, dans le port de Halifax, en 1980. Le goût des cartes et des voyages, né dans l'enfance, ne le quitta jamais et colore son image de la connaissance comme exploration sans sol ferme.]]
L'œuvre de Quine a façonné le paysage de la philosophie analytique de la seconde moitié du XX{{e}} siècle, au point que ses adversaires eux-mêmes argumentent sur le terrain qu'il a déblayé. Son influence se mesure moins à une école constituée qu'à un climat : le naturalisme, devenu pour beaucoup l'atmosphère par défaut de la discipline.
=== Une influence diffuse ===
Donald Davidson a prolongé le projet quinien de la traduction radicale en une théorie de l'interprétation, posant qu'on ne peut comprendre autrui qu'en lui prêtant, par un principe de charité, une rationalité et des croyances pour l'essentiel vraies. Daniel Dennett a fait du naturalisme quinien un instrument pour la philosophie de l'esprit. En philosophie des mathématiques, l'argument dit d'indispensabilité, élaboré avec Hilary Putnam, soutient que nous devons admettre l'existence des objets abstraits, nombres et ensembles, parce que nos meilleures théories physiques en font un usage que l'on ne sait pas éliminer : c'est le critère de l'engagement ontologique appliqué à la science effective. Le programme d'une [[Dictionnaire de philosophie/Épistémologie|épistémologie]] naturalisée a nourri tout un courant de recherche, qui étudie la formation des croyances avec les ressources de la psychologie et des sciences cognitives, et qui a contribué à rapprocher la philosophie de la connaissance des sciences empiriques de l'esprit.
=== La défense de l'analyticité ===
La critique de la distinction analytique et synthétique n'a pas fait l'unanimité. Dans un article resté célèbre, « Pour la défense d'un dogme » (1956), Paul Grice et Peter Strawson objectent que l'exigence quinienne est trop forte.<ref>H. P. Grice et P. F. Strawson, « In Defense of a Dogma », ''The Philosophical Review'', vol. 65, 1956, p. 141-158.</ref> Que l'on ne sache pas définir « analytique » sans cercle ne prouve pas que la notion soit vide : bien des couples de notions s'éclairent mutuellement sans qu'aucune se laisse réduire à autre chose, et les locuteurs compétents s'accordent en fait, de manière stable, sur ce qui relève du sens des mots et sur ce qui relève des faits. Une distinction dont l'usage est partagé et régulier ne saurait être tenue pour illusoire au seul motif qu'elle résiste à la définition explicite. Carnap, de son côté, n'a jamais cédé sur l'analyticité, qu'il jugeait clarifiable pour les langages réglés. Plus tard, des philosophes comme Paul Boghossian ont cherché à reconstruire une notion défendable de vérité fondée sur la signification, et à rouvrir la question de l'a priori que Quine croyait close.
=== Le langage et l'esprit ===
Sur le terrain du langage, Noam Chomsky a opposé à Quine une linguistique d'inspiration tout autre. Là où Quine, héritier du behaviorisme, voulait expliquer l'acquisition du langage par le conditionnement de dispositions verbales observables, Chomsky fait valoir la pauvreté du stimulus : l'enfant maîtrise sa langue bien au-delà de ce que son exposition limitée pourrait lui apprendre, ce qui suppose des structures innées. Chomsky a de plus contesté le statut de l'indétermination de la traduction, y voyant non un phénomène singulier mais un simple cas de la sous-détermination ordinaire de toute théorie par ses données, sans portée philosophique particulière. Quine a maintenu que l'indétermination était d'une autre espèce : non pas notre ignorance d'un fait qui existerait, mais l'absence de tout fait à connaître. Le différend touche à la question de savoir s'il existe, en matière de signification, des faits que nos méthodes ne feraient qu'approcher, ou s'il n'y a là rien à approcher du tout.
=== Le retour de la nécessité et la question des normes ===
On a dit comment Saul Kripke et la nouvelle théorie de la référence ont rouvert, contre les interdits quiniens, le dossier de la nécessité et de l'essence. Une autre objection, plus interne, vise l'épistémologie naturalisée. Si la théorie de la connaissance se réduit à la description psychologique de la façon dont nous formons nos croyances, que devient sa dimension normative, sa fonction d'évaluer ce qui justifie une croyance et ce qui ne la justifie pas ? Jaegwon Kim a soutenu qu'une épistémologie purement descriptive cesse d'être une épistémologie, faute de pouvoir dire ce que nous devrions croire.<ref>Jaegwon Kim, « What is “Naturalized Epistemology”? », ''Philosophical Perspectives'', vol. 2, 1988, p. 381-405.</ref> Quine a répondu que la norme n'est pas abolie, mais reconduite à une visée pratique : l'épistémologie normative devient une sorte de technologie de la recherche de la [[Dictionnaire de philosophie/Vérité|vérité]], qui étudie, à l'intérieur de la science, par quels moyens on prédit le mieux l'expérience. Les règles de la bonne méthode sont des conseils d'ingénieur, ajustés à une fin, et non des décrets d'une raison souveraine antérieure à toute science. La question de savoir si cette réponse suffit demeure l'un des points vifs de la discussion contemporaine.
== Conclusion ==
L'unité de l'œuvre de Quine tient à une attitude plus qu'à un système. C'est l'attitude de qui refuse tout point d'appui extérieur à la science et travaille toujours du dedans, du sein de nos croyances, sans sol ferme ni certitude première. De ce parti pris découlent, par enchaînement, ses thèses les plus discutées : si nul énoncé n'affronte seul l'expérience, alors le partage de l'analytique et du synthétique s'efface, alors la logique perd son immunité, alors la signification se réduit à ce que le comportement public peut porter, alors la connaissance n'a d'autre juge qu'elle-même. La barbe de Platon tombée sous le rasoir, le mythe du musée dissipé, le rêve de la philosophie première abandonné, il ne reste qu'un univers sobre, des objets et des classes, et une science qui se reconstruit en pleine mer comme le bateau de Neurath, planche après planche. On peut tenir cette austérité pour une perte ou pour une libération. Mais on ne fait plus de l'[[Dictionnaire de philosophie/Métaphysique|ontologie]], de l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] ou de la philosophie du langage sans passer par les questions que Quine a posées, ni sans se situer, fût-ce pour s'en écarter, par rapport aux réponses qu'il a avancées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Quine traduites en français ===
* ''Le mot et la chose'' [''Word and Object'', 1960], traduction de Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977.
* ''Du point de vue logique. Neuf essais logico-philosophiques'' [''From a Logical Point of View'', 1953], traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.
* ''Relativité de l'ontologie et autres essais'' [''Ontological Relativity and Other Essays'', 1969], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1977.
* ''Philosophie de la logique'' [''Philosophy of Logic'', 1970], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1975.
* ''Méthodes de logique'' [''Methods of Logic'', 1950], traduction de Maurice Clavelin, Paris, Armand Colin, 1973.
* ''Les voies du paradoxe et autres essais'' [''The Ways of Paradox and Other Essays'', 1966], Paris, Vrin, 2011.
* ''La poursuite de la vérité'' [''Pursuit of Truth'', 1990], traduction de Maurice Clavelin, Paris, Seuil, 1993.
* ''Quiddités. Dictionnaire philosophique par intermittence'' [''Quiddities. An Intermittently Philosophical Dictionary'', 1987], traduction de Dominique Goy-Blanquet et Thierry Marchaisse, Paris, Seuil, 1992.
=== Principales œuvres non traduites en français ===
* ''Mathematical Logic'', Cambridge (Mass.), Harvard University Press, 1940.
* ''Set Theory and Its Logic'', Cambridge (Mass.), Harvard University Press, 1963.
* ''The Roots of Reference'', La Salle (Illinois), Open Court, 1974.
* ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981.
* ''The Time of My Life. An Autobiography'', Cambridge (Mass.), The MIT Press, 1985.
* ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995.
=== Études ===
* {{Ouvrage|langue=en|prénom1=Edward|nom1=Becker|titre=The Themes of Quine's Philosophy|sous-titre=Meaning, Reference, and Knowledge|lieu=Cambridge|éditeur=Cambridge University Press|année=2012}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=Quintessence|sous-titre=Basic Readings from the Philosophy of W. V. Quine|lieu=Cambridge (Mass.)|éditeur=The Belknap Press of Harvard University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Frederique|nom1=Janssen-Lauret|responsabilité1=dir.|titre=Quine, Structure, and Ontology|lieu=Oxford|éditeur=Oxford University Press|année=2020}}
* {{Ouvrage|prénom1=Paul|nom1=Gochet|titre=Quine en perspective|sous-titre=essai de philosophie comparée|lieu=Paris|éditeur=Flammarion|année=1978}}
* {{Ouvrage|prénom1=Sandra|nom1=Laugier|titre=L'anthropologie logique de Quine|sous-titre=l'apprentissage de l'obvie|lieu=Paris|éditeur=Vrin|année=1992}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=The Cambridge Companion to Quine|lieu=Cambridge|éditeur=Cambridge University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Peter|nom1=Hylton|titre=Quine|lieu=Londres|éditeur=Routledge|année=2007}}
* {{Ouvrage|langue=en|prénom1=Alex|nom1=Orenstein|titre=W. V. Quine|lieu=Chesham|éditeur=Acumen|année=2002}}
* {{Ouvrage|langue=en|prénom1=Christopher|nom1=Hookway|titre=Quine|sous-titre=Language, Experience and Reality|lieu=Cambridge|éditeur=Polity Press|année=1988}}
* {{Ouvrage|langue=en|prénom1=Gilbert|nom1=Harman|prénom2=Ernest|nom2=Lepore|responsabilité1=dir.|titre=A Companion to W. V. O. Quine|lieu=Chichester|éditeur=Wiley-Blackwell|année=2014}}
* {{Ouvrage|langue=en|prénom1=Eve|nom1=Gaudet|titre=Quine on Meaning|sous-titre=The Indeterminacy of Translation|lieu=Londres|éditeur=Continuum|année=2006}}
* {{Ouvrage|langue=en|prénom1=Lewis Edwin|nom1=Hahn|prénom2=Paul Arthur|nom2=Schilpp|responsabilité1=dir.|titre=The Philosophy of W. V. Quine|lieu=La Salle (Illinois)|éditeur=Open Court|année=1986|collection=The Library of Living Philosophers}}
== Voir aussi ==
* [[Dictionnaire de philosophie/Empirisme|Empirisme]]
* [[Dictionnaire de philosophie/Épistémologie|Épistémologie]]
* [[Dictionnaire de philosophie/Métaphysique|Métaphysique]]
* [[Dictionnaire de philosophie/Existence|Existence]]
* [[Dictionnaire de philosophie/Vérité|Vérité]]
* [[Dictionnaire de philosophie/Convention|Convention]]
* [[Dictionnaire de philosophie/A priori|A priori]]
* [[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
* [[Dictionnaire de philosophie/Moritz Schlick|Moritz Schlick]]
* [[Dictionnaire de philosophie/Scepticisme|Scepticisme]]
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Quine, Willard Van Orman}}
8x41x5iovmv3sguef6e9irw0sk06yc0
768274
768272
2026-06-22T03:22:26Z
PandaMystique
119061
768274
wikitext
text/x-wiki
{{DicoPhilo|Willard Van Orman Quine|lecture=oui}}
[[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]]
Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme logique lui-même les outils qu'il en avait reçus. Son nom reste attaché à quelques gestes critiques qui ont reconfiguré la discipline : la mise en cause de la distinction entre vérités analytiques et vérités synthétiques, l'abandon de l'idée d'une [[Dictionnaire de philosophie/Métaphysique|philosophie première]] antérieure à la science, et la thèse, longtemps reçue comme un paradoxe, selon laquelle la traduction d'une langue dans une autre demeure indéterminée. À ces gestes critiques répond une construction patiente : un naturalisme qui range l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] parmi les sciences de la nature, une conception holiste de la [[Dictionnaire de philosophie/Connaissance|connaissance]] où nos énoncés ne se mesurent pas isolément à l'expérience, mais à l'intérieur d'ensembles théoriques plus ou moins vastes, et un critère précis pour décider de ce qu'une théorie tient pour existant.
Quine écrit une prose dense, ironique, parsemée de formules qui se retiennent : « Être, c'est être la valeur d'une variable liée », « pas d'entité sans identité », « aucun énoncé n'est à l'abri d'une révision ». Cette élégance n'est pas un ornement. Elle traduit une exigence constante d'économie : se contenter des hypothèses les moins nombreuses et les plus claires qui suffisent à la tâche, comme un cartographe qui ne retient d'un territoire que les traits utiles au voyageur. Ce goût de la sobriété, Quine l'avouait volontiers en parlant de sa préférence pour « les paysages désertiques » : un monde ontologiquement maigre, mais net.
== Repères biographiques ==
=== Akron, Oberlin et la découverte de la logique ===
Quine naît le 25 juin 1908 à Akron, dans l'Ohio. Au lycée, il choisit la filière scientifique, manifeste un don pour les mathématiques, gagne un concours de poésie et, plusieurs étés de suite, dessine et vend des cartes des environs. Ce plaisir des cartes et cette passion du voyage ne le quitteront pas : des décennies plus tard, il rédigera pour la ''New York Review of Books'' des recensions d'atlas, et son ami Burton Dreben, devant le nombre de lieux mentionnés dans son autobiographie, suggérera de l'intituler non ''The Time of My Life'' mais « un camion de déménagement ». La lecture d{{'}}''Eureka'' d'Edgar Poe, qui transmet l'ivresse de comprendre l'univers, compte parmi ses premières émotions philosophiques, en même temps qu'un scepticisme précoce en matière religieuse. La dernière année de lycée éveille un intérêt durable pour le langage, la grammaire et l'étymologie.
Entré à l'Oberlin College en 1926, il hésite entre les mathématiques, la philosophie et les lettres classiques. Un compagnon de poker lui apprend qu'un certain Bertrand Russell aurait une « philosophie mathématique ». Quine y voit le moyen de réunir deux de ses penchants : il choisit les mathématiques, complétées par des lectures dirigées en philosophie des mathématiques. Personne, à Oberlin, ne connaît alors les travaux récents de Frege, de Russell ou de Whitehead ; son directeur lui compose, avec une aide extérieure, une liste de lectures qui inclut les ''Principia Mathematica'' de Whitehead et Russell. En 1929, son mémoire de fin d'études généralise une formule empruntée à Couturat et la démontre dans le formalisme strict des ''Principia''. Sa première publication savante, un compte rendu de l'ouvrage de Nicod sur les fondements de la géométrie et de l'induction, paraît dans l{{'}}''American Mathematical Monthly''.
=== Harvard et la renaissance européenne ===
[[Fichier:Russell1907-2.jpg|vignette|upright=1|Bertrand Russell vers 1907. Sa venue à Harvard en 1931 fut, selon Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell joua dans son œuvre le rôle d'un rival admiré dont les thèses appelaient des solutions de rechange.]]
Quine choisit Harvard pour ses études doctorales, parce que son département de philosophie est alors le plus fort en logique du pays : on y trouve Alfred North Whitehead, le coauteur des ''Principia''. Il y soutient en deux ans une thèse intitulée « The Logic of Sequences: A Generalization of Principia Mathematica ». Une préoccupation y affleure déjà, qui ne le quittera plus : celle de l'ontologie, de la question de savoir ce qu'il y a. Là où les ''Principia'' admettent des fonctions propositionnelles, c'est-à-dire des propriétés, donc des entités intensionnelles, Quine cherche à parvenir aux mêmes fins avec des objets extensionnels comme les classes. La même année 1931, Russell vient donner une conférence à Harvard : ce sera, dira Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell restera une présence centrale, à la manière d'un rival dont les positions appellent des solutions de rechange plus acceptables.
Vient ensuite ce que Quine nomme sa renaissance en Europe centrale. Titulaire en 1932-1933 d'une bourse de voyage, il séjourne à Vienne, à Prague et à Varsovie. À Vienne, il assiste aux réunions du Cercle de Vienne et fait la connaissance de Neurath, de [[Dictionnaire de philosophie/Moritz Schlick|Schlick]], de Gödel, de Hahn et de Menger. À Prague, il rencontre Rudolf Carnap, suit ses cours et lit en tapuscrit allemand sa ''Syntaxe logique du langage''. Carnap deviendra une influence aussi forte que Russell, et le débat qui les opposera durant des décennies comptera parmi les échanges majeurs du siècle. À Varsovie, Quine suit les leçons de Leśniewski, de Łukasiewicz et de Tarski, et noue avec l'école polonaise une sympathie durable pour son extensionnalisme et sa parcimonie ontologique. Il décrira ces semaines de Prague et de Varsovie comme « les mois les plus enrichissants » qu'il ait connus.
=== Le professeur de Harvard ===
De retour à Harvard en 1933, Quine est élu Junior Fellow de la Society of Fellows, ce qui le libère de toute charge d'enseignement pendant trois ans. C'est dans cette période qu'il met au point trois de ses positions distinctives : sa conception de l'engagement ontologique, ses systèmes de logique les plus connus, dont les « New Foundations for Mathematical Logic » de 1937, et la première phase de sa critique de la vérité dite analytique, esquissée dans « Truth by Convention » (1936). Son behaviorisme, soit dit en passant, ne date pas de sa fréquentation de B. F. Skinner, autre Junior Fellow, mais de ses lectures de Watson au temps du collège.
Sa facilité pour les langues se manifeste en 1942 : alors qu'il s'est déjà porté volontaire pour la marine, Quine ajourne son engagement afin d'enseigner quatre mois durant à São Paulo, en portugais, langue dont il avait pris les rudiments aux Açores, et il tire de ces leçons un manuel de logique rédigé dans cette langue. Il sert ensuite plus de trois ans dans la marine des États-Unis, où il travaille au déchiffrement des communications des sous-marins allemands et atteint le grade de capitaine de corvette. Professeur titulaire à Harvard à partir de 1948, puis titulaire de la chaire Edgar Pierce de philosophie, il y enseignera jusqu'à sa retraite, en 1978. Ses textes les plus discutés s'échelonnent sur ces décennies : « De ce qui est » (1948), « Deux dogmes de l'empirisme » (1951), le recueil ''Du point de vue logique'' (1953), puis l'ouvrage qui condense sa philosophie, ''Le mot et la chose'' (1960). Suivront « La relativité de l'ontologie » (1968) et « L'épistémologie naturalisée » (1969). La retraite ne ralentit ni sa production ni son influence : il publie encore ''Theories and Things'' (1981), son autobiographie ''The Time of My Life'' (1985), le dictionnaire ''Quiddités'' (1987), ''La poursuite de la vérité'' (1990) et ''From Stimulus to Science'' (1995). Il meurt le 25 décembre 2000.
== L'héritage de l'empirisme logique ==
On comprend mal Quine si on ne le situe pas dans la tradition qu'il prolonge et conteste à la fois. Cette tradition est celle de l'empirisme logique, né de la rencontre entre la nouvelle logique de Frege et de Russell et le programme du Cercle de Vienne. Carnap en avait donné l'exposé le plus soigné, autour de trois thèses. La première est le critère de vérifiabilité : une phrase n'a de signification empirique que si l'on peut indiquer les observations qui la confirmeraient ou l'infirmeraient. La deuxième fait du savoir a priori, celui des mathématiques et de la logique, un savoir purement linguistique : ces vérités seraient vraies en vertu des seules conventions de notre langage, non de quelque fait du monde. La troisième tient la métaphysique pour dépourvue de sens, simple jeu de mots sans portée cognitive. Ce résumé en trois points est une commodité d'exposition, non un portrait figé : la pensée de Carnap se déplace beaucoup, de l{{'}}''Aufbau'' à la syntaxe logique, puis à la sémantique et au principe de tolérance, et c'est avec chacune de ces étapes que Quine dialogue.
Quine partage le point de départ empiriste : toute la matière probante de la science est sensorielle, et l'apprentissage des mots repose en dernière instance sur l'expérience. Mais il va soumettre chacune des trois thèses à un examen qui en démonte les ressorts. Le réductionnisme attaché au critère de vérifiabilité supposait que chaque énoncé possède, pris isolément, un contenu empirique propre ; Quine y opposera le holisme. L'idée d'une vérité purement analytique, qui isolait le linguistique du factuel, lui paraîtra reposer sur un cercle. Quant à la métaphysique, Quine ne la réhabilite pas sous sa forme classique, mais il refuse qu'on tranche d'un trait les questions d'existence : la question « qu'y a-t-il ? » est pour lui sur le même plan que les questions de la science naturelle. Ce que Carnap croyait pouvoir séparer, Quine le tient pour un continuum. Tel est le ressort de son œuvre : un empirisme qui se retourne sur ses propres présupposés et en abandonne les deux dogmes.
== Qu'est-ce qui existe ? L'engagement ontologique ==
=== La barbe de Platon ===
<div style="float:right; width:118px; margin:0 0 12px 16px; position:relative;">
<div style="background:linear-gradient(180deg, #fdfcf9 0%, #f5f2ec 100%); border:1px solid #e0d8cb; border-radius:12px; box-shadow:0 2px 6px rgba(0,0,0,.04); text-align:center; padding:14px 10px;">
[[Fichier:Ambox question.svg|28px]]
<div style="margin-top:6px; font-size:84%; color:#6d5f4d;">La barbe de Platon</div>
</div>
[[Dictionnaire de philosophie/Willard Van Orman Quine/La barbe de Platon|<span style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:1;"></span>]]
</div>
« Qu'y a-t-il ? » Le problème de l'ontologie, observe Quine au seuil de « De ce qui est »<ref>W. V. O. Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', trad. sous la dir. de Sandra Laugier, Paris, Vrin, 2003 (éd. originale ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953). La « barbe de Platon » et l'énigme du non-être ouvrent l'essai (''From a Logical Point of View'', ci-après ''FLPV'', p. 2) ; le débat avec Wyman et le « bidonville des possibles » figurent p. 4.</ref>, a ceci de curieux qu'il s'énonce en trois mots et se résout en un seul : il y a tout ce qu'il y a. Chacun l'accordera. Le désaccord ne porte jamais sur cette formule vide, mais sur les cas. Or les cas suscitent une difficulté logique que Quine met en scène par une petite comédie philosophique. Supposons que deux penseurs, qu'il nomme McX et lui-même, divergent sur l'[[Dictionnaire de philosophie/Existence|existence]] de quelque chose. McX affirme qu'il y a une certaine entité ; Quine le nie. Comment Quine peut-il seulement formuler son désaccord ? S'il dit « il y a une chose que McX admet et que je rejette », il se contredit, car il vient d'admettre l'existence de ce qu'il prétendait refuser. Le partisan du non semble condamné à ne pouvoir dire ce qu'il nie.
C'est l'antique énigme du non-être : le non-être doit en quelque façon être, sinon qu'est-ce donc qui n'est pas ? Quine surnomme cette doctrine enchevêtrée « la barbe de Platon », tant elle a, dit-il, émoussé le rasoir d'Occam. Elle pousse certains à conférer une forme d'être à ce qui n'en a aucune. Prenons Pégase. Si Pégase n'était rien, raisonne McX, nous ne parlerions de rien en prononçant ce nom, et il serait absurde de dire même que Pégase n'est pas ; donc Pégase, en un sens, est. Pressé d'en dire davantage, McX se réfugie dans l'idée que Pégase est « une idée dans les esprits ». Mais c'est confondre le Parthénon avec l'idée du Parthénon. Le Parthénon est de pierre, visible ; l'idée du Parthénon est mentale, invisible. Nul ne les confond. Quand nous nions Pégase, ce n'est pas une image mentale que nous nions, c'est un cheval ailé de chair et de sang dont nous disons qu'il n'existe nulle part.
Un esprit plus subtil, que Quine appelle Wyman, soutient que Pégase « subsiste » comme un possible non actualisé. Dire que Pégase n'existe pas reviendrait seulement à dire qu'il n'a pas l'attribut d'actualité, comme on dirait que le Parthénon n'est pas rouge. Cette manœuvre peuple l'univers d'une foule d'êtres fantomatiques. Quine en montre l'incohérence par une série de questions désopilantes. Combien d'hommes possibles se tiennent dans cette embrasure de porte ? Le gros possible et le chauve possible sont-ils le même, ou deux ? Y a-t-il plus de minces possibles que de gros ? Sont-ils tous distincts, ou bien deux choses qui se ressemblent en tout ne font-elles qu'une ? À ces possibles inactuels, on ne sait même pas appliquer la notion d'identité. Et que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ? Le « bidonville des possibles » est, conclut Quine, un foyer d'éléments désordonnés. Mieux vaut le raser.
=== La leçon de Russell : décrire au lieu de nommer ===
La sortie de cette impasse, Quine la trouve dans la théorie russellienne des descriptions définies, qu'il tient pour un modèle d'analyse. Le piège tenait à ce que nous traitions « Pégase » comme un nom, un terme qui, pour avoir un sens, devrait désigner un objet. Russell avait montré comment se passer de cette supposition. Au lieu de « Pégase n'existe pas », qui paraît présupposer Pégase, paraphrasons : « il n'existe rien qui soit à la fois ailé, chevalin et unique en son genre. » L'énoncé devient une quantification existentielle niée : il n'y a aucun x tel que x soit Pégase. Le nom embarrassant a disparu, dissous dans un jeu de variables et de quantificateurs ; et il ne reste plus, pour porter un poids ontologique, que ce sur quoi nous quantifions. La phrase peut être fausse, c'est-à-dire nier l'existence de quelque chose, sans présupposer cette existence. L'énigme du non-être s'évanouit avec la grammaire qui l'avait engendrée.
De là résulte un déplacement capital. Ce ne sont pas les noms qui engagent une théorie à l'existence de quoi que ce soit, car tout nom peut être analysé à la façon de « Pégase ». Le poids ontologique se concentre dans les variables liées par les quantificateurs « il existe un… » et « pour tout… ». Dire « il existe quelque chose qui est un chien » suffit à s'engager sur les chiens, sans qu'on ait à les nommer. C'est pourquoi Quine peut soutenir que la prédication, plus que la dénomination, fait le fond de la référence : un prédicat comme « est humain » s'applique à Socrate, à Platon, à d'autres, et ce sont là précisément les valeurs que doivent prendre les variables pour que les énoncés où figure ce prédicat soient vrais.
=== « Être, c'est être la valeur d'une variable liée » ===
De ce constat naît le critère de l'engagement ontologique, ramassé dans une formule devenue célèbre : « Être, c'est être la valeur d'une variable liée. »<ref>La formule « être, c'est être la valeur d'une variable » (« To be is to be the value of a variable ») se trouve dans « De ce qui est » (''FLPV'', p. 15).</ref> L'univers des entités, écrit Quine, est l'étendue des valeurs des variables. Pour savoir à quels objets une théorie s'engage, il ne faut pas examiner les noms ni les prédicats qu'elle emploie, mais demander quelles entités doivent figurer parmi les valeurs de ses variables pour que ses énoncés soient vrais. Une variable, suggère-t-il par une image éclairante, est une sorte de pronom : « x » fonctionne comme le « il » d'une langue, terme provisoirement indéterminé qui attend, dans le champ d'un quantificateur, de se voir attribuer des valeurs.
Ce critère a une vertu de clarté. Il transforme une question métaphysique notoirement floue, « qu'est-ce qui existe ? », en une question précise sur la forme logique de nos théories, « sur quoi cette théorie quantifie-t-elle ? ». Encore faut-il, pour le mettre en œuvre, disposer d'une langue régimentée. Une phrase du langage ordinaire est souvent trop équivoque pour qu'on lise à même elle ses présuppositions. Quine propose donc de la reformuler dans une notation canonique : celle de la logique des prédicats du premier ordre, avec ses variables, ses quantificateurs et ses fonctions de vérité. Cette régimentation n'est pas une description de la langue naturelle, mais une réforme, entreprise au nom de la clarté et de l'économie. Une fois la théorie ainsi mise au net, ses engagements se lisent à livre ouvert : ce sont les objets sur lesquels portent ses variables liées. Il importe de ne pas se méprendre sur la portée de ce critère. Il ne tranche pas, par lui-même, ce qui existe ; il dit seulement à quoi une théorie s'engage lorsqu'on la tient pour vraie et qu'on l'a reformulée en langue logique. Le critère n'est pas un oracle métaphysique, mais une méthode pour lire les engagements d'une théorie déjà admise ou mise à l'examen. Reste ensuite la question, distincte, de savoir quelle théorie nous avons les meilleures raisons d'accepter.
Reste à savoir ce que Quine, pour sa part, accepte d'inscrire à l'inventaire du monde. Sa réponse penche vers la sobriété : des objets physiques, entendus largement comme les contenus matériels de régions de l'espace-temps, fussent-elles discontinues, et, parce que la science, et en particulier les mathématiques, ne peut s'en passer, des classes, c'est-à-dire des ensembles, admis pour leur puissance théorique autant que pour la netteté de leurs critères d'identité. Les premiers fournissent l'ameublement concret ; les secondes, l'ossature abstraite sans laquelle on ne peut formuler les lois quantitatives de la physique. Quine résiste en revanche aux propriétés, aux significations et aux propositions, qu'il tient pour des entités intensionnelles mal individuées. Sa raison est toujours la même, et elle a valeur de maxime : « pas d'entité sans identité. »<ref>La maxime « pas d'entité sans identité » (« No entity without identity ») est formulée dans « Parler d'objets » (« Speaking of Objects »), repris dans ''Relativité de l'ontologie et autres essais'', trad. Jean Largeault, Paris, Aubier-Montaigne, 1977 (''Ontological Relativity and Other Essays'', ci-après ''OR'', New York, Columbia University Press, 1969, p. 23).</ref> Une entité n'est admissible que si l'on peut dire à quelle condition elle est identique à une autre ou en diffère. Les classes satisfont à cette exigence, car deux classes sont identiques si et seulement si elles ont les mêmes éléments. Les propriétés n'y satisfont pas : nul critère ne dit quand « avoir un cœur » et « avoir des reins », vrais des mêmes êtres, expriment une seule propriété ou deux. Faute d'identité, point d'entité ; et c'est tout un pan de l'ontologie traditionnelle qui se trouve congédié au nom de cette discipline.
== Les deux dogmes de l'empirisme ==
Paru en 1951, « Deux dogmes de l'empirisme » est sans doute l'un des articles les plus lus et les plus discutés de la philosophie analytique.<ref>W. V. O. Quine, « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', éd. citée (« Two Dogmas of Empiricism », ''FLPV'', p. 20-46). L'article parut d'abord dans ''The Philosophical Review'' en janvier 1951.</ref> Quine y dénonce deux croyances que l'empirisme moderne partageait sans les interroger : la distinction entre énoncés analytiques et énoncés synthétiques, et le réductionnisme, c'est-à-dire l'idée que chaque énoncé, pris à part, possède un contenu empirique propre. Ces deux dogmes, montre-t-il, sont liés à la racine, et leur abandon transforme la figure de l'empirisme.
=== Le premier dogme : la distinction analytique et synthétique ===
L'opposition vient de loin. Kant distinguait les jugements analytiques, où le concept du prédicat est déjà contenu dans celui du sujet (« tous les corps sont étendus »), des jugements synthétiques, qui ajoutent au sujet une information nouvelle (« tous les corps sont pesants »). Les empiristes logiques avaient repris la distinction sous une forme linguistique : est analytique l'énoncé vrai en vertu des seules significations des mots qui le composent, indépendamment de tout fait du monde. « Aucun célibataire n'est marié » serait de ce type : il suffit de comprendre les mots pour en reconnaître la vérité. Cette catégorie était précieuse, car elle offrait un asile aux vérités de la logique et des mathématiques. Si ces vérités sont analytiques, on peut les tenir pour certaines et nécessaires sans renoncer au principe empiriste selon lequel tout savoir procède de l'expérience : elles ne disent rien sur le monde, elles explicitent notre langage.
Quine ne conteste pas qu'il existe des énoncés que tout le monde range spontanément du côté de l'analytique. Il conteste qu'on puisse rendre cette notion claire. Sa stratégie consiste à demander qu'on lui explique « analytique » sans tourner en rond. Une première classe d'énoncés analytiques, les vérités logiques au sens strict comme « aucun homme non marié n'est marié », ne pose pas de problème : elles restent vraies sous toute réinterprétation de leurs termes non logiques. La difficulté commence avec la seconde classe, celle de « aucun célibataire n'est marié », qui ne devient une vérité logique que si l'on remplace « célibataire » par son synonyme « homme non marié ». Tout repose alors sur la notion de synonymie, c'est-à-dire d'identité de signification. Or qu'est-ce que la synonymie ? Si l'on répond qu'elle se fonde sur les définitions, Quine objecte que les définitions du dictionnaire ne font que consigner des synonymies déjà admises : le lexicographe rapporte un usage, il ne le crée pas, sauf dans le cas particulier de la stipulation explicite. Si l'on répond que deux termes sont synonymes lorsqu'ils sont interchangeables partout sans changer la valeur de vérité, Quine montre que ce critère, dans un langage extensionnel, ne garantit que la coextensivité, non l'identité de signification ; et que, pour exclure les coïncidences accidentelles, on doit faire appel à une notion de nécessité, laquelle reconduit en sous-main à l'analyticité que l'on cherchait à définir. Le cercle se referme : analyticité, synonymie, définition, nécessité forment une famille de notions qui se renvoient les unes aux autres sans qu'aucune prenne pied hors du cercle.
On objectera qu'il suffit de poser des règles sémantiques, comme le proposait Carnap, qui spécifieraient pour un langage donné quels énoncés y sont analytiques. Quine répond que cela déplace la difficulté sans la résoudre. Une liste de règles nous apprend quels énoncés sont appelés analytiques dans tel langage artificiel ; elle ne nous apprend pas ce que signifie le mot « analytique » lui-même, ce que ces énoncés ont en commun qui justifierait l'étiquette. On nous explique « analytique-dans-le-langage-L », pour un L particulier, mais non l'adjectif « analytique » en général, qui seul nous intéresse. La notion demeure, selon le mot de Quine, un article de foi métaphysique au cœur même de l'empirisme.
Il faut se garder, sur ce point, d'une lecture trop tranchée. Quine ne nie pas qu'il existe des énoncés que l'usage range du côté de l'analytique, ni qu'on puisse, dans un langage construit, fixer par convention quels énoncés y seront tenus pour tels. Le Quine tardif va plus loin : dans ''Les racines de la référence'' (1974), il propose même un critère comportemental de l'analyticité, un énoncé étant analytique lorsque tout locuteur en apprend la vérité en même temps qu'il apprend les mots qui le composent. Selon ce critère, « aucun célibataire n'est marié » et l'essentiel de la logique élémentaire ressortissent bien à l'analytique. Ce que Quine combat n'est donc ni l'analyticité ordinaire ni l'analyticité réglée d'un langage formel, mais une troisième notion, plus ambitieuse : celle qui prétendrait fonder en raison la nécessité des mathématiques et tracer entre l'a priori et l'empirique la frontière étanche dont Carnap avait besoin. Cette analyticité forte, son critère ne la livre pas, car les mathématiques n'en relèvent pas. C'est elle, et elle seule, que « Deux dogmes » entreprend de dissoudre.<ref>Sur le critère tardif de l'analyticité, voir W. V. O. Quine, ''The Roots of Reference'', La Salle, Open Court, 1974, p. 78-80 (ouvrage non traduit en français), et l'analyse de Richard Creath, « Quine on the Intelligibility and Relevance of Analyticity », dans ''The Cambridge Companion to Quine'', éd. citée, p. 47-64.</ref>
=== Le second dogme : le réductionnisme ===
Le second dogme est le réductionnisme, sous sa forme moderne : la croyance que tout énoncé doué de sens est traduisible en un énoncé portant sur l'expérience immédiate, ou du moins qu'à chaque énoncé est associé un domaine d'expériences qui le confirmeraient et un autre qui l'infirmeraient. C'est la version de la théorie vérificationniste de la signification qui rattache le contenu d'une phrase aux observations qui la vérifient. Quine fait observer que ce dogme est le pendant du premier. Car si chaque énoncé avait son contenu empirique propre, on pourrait définir l'analyticité comme le cas limite : serait analytique l'énoncé dont le contenu empirique est vide, qui se confirme quoi qu'il arrive. Les deux dogmes sont, dit-il, identiques à la racine.
Or le réductionnisme ne résiste pas à l'examen. Quine y oppose un argument qu'il emprunte au physicien et historien des sciences Pierre Duhem : on ne peut pas soumettre à l'expérience une hypothèse isolée. Quand une prédiction tirée d'une théorie se trouve démentie, l'expérience ne nous dit pas quel énoncé est en faute. Elle frappe la théorie comme un tout, et c'est à nous de répartir le blâme. Nous pouvons abandonner l'hypothèse mise à l'épreuve, mais nous pouvons aussi mettre en cause une loi auxiliaire, une condition initiale, un principe de l'instrument de mesure, voire, en dernier recours, une règle de la logique. Aucun énoncé ne se présente seul devant le tribunal de l'expérience. Il n'y a donc pas de contenu empirique attaché à l'énoncé pris isolément ; ce contenu n'appartient qu'à des ensembles d'énoncés, et, à la limite, à la science tout entière. L'unité de signification empirique n'est pas la phrase, mais le système. Voilà qui prive le réductionnisme de son objet et, du même coup, ruine l'espoir de définir l'analyticité comme degré zéro du contenu empirique. En tombant, le second dogme entraîne le premier.
== Le holisme et la révision des croyances ==
Une fois les deux dogmes écartés, l'empirisme prend un autre visage, que Quine peint dans la dernière partie de « Deux dogmes » à l'aide d'une image souvent reprise. La totalité de notre savoir, des vérités les plus quotidiennes de la géographie aux lois de la physique atomique et jusqu'aux théorèmes de la logique, forme un tissu fait de main d'homme qui ne touche l'expérience que par ses bords. Ou, pour changer de figure, la science tout entière est comme un champ de forces dont les conditions aux limites sont l'expérience. Un conflit avec l'expérience, à la périphérie, oblige à des réajustements à l'intérieur du champ : il faut redistribuer des valeurs de vérité sur certains de nos énoncés. Mais le champ est si lâchement déterminé par ses bords que nous gardons une large latitude quant aux énoncés à réviser à la lumière d'une expérience contraire donnée. Aucune expérience particulière n'est liée à un énoncé particulier de l'intérieur du champ, sinon de façon indirecte, par les exigences d'équilibre qui affectent le champ comme un tout.<ref>« Deux dogmes de l'empirisme », sixième section, « L'empirisme sans les dogmes » : le « tissu fait de main d'homme » et le « champ de forces » sont décrits p. 42, « aucun énoncé n'est à l'abri d'une révision » p. 43, les « dieux d'Homère » p. 44 et le « pragmatisme plus poussé » p. 46 (''FLPV'', éd. citée).</ref>
De cette image se déduisent les deux formules les plus frappantes de l'article. Premièrement : tout énoncé peut être tenu pour vrai quoi qu'il arrive, pourvu que nous fassions des ajustements assez énergiques ailleurs dans le système. Même un énoncé proche de la périphérie peut être maintenu en dépit d'une expérience récalcitrante, en plaidant l'hallucination ou en retouchant certaines des lois dites logiques. Deuxièmement, et inversement : aucun énoncé n'est à l'abri d'une révision. On a même proposé de réviser la loi logique du tiers exclu pour simplifier la mécanique quantique ; et quelle différence de principe y a-t-il entre un tel changement et celui par lequel Kepler a supplanté Ptolémée, ou Einstein Newton, ou Darwin Aristote ? Les énoncés de la logique et des mathématiques ne jouissent d'aucune immunité spéciale ; ils occupent seulement une position centrale dans le réseau, loin des bords, là où peu de connexions avec une expérience particulière s'imposent. C'est pourquoi nous hésitons davantage à les abandonner : leur révision aurait des répercussions étendues. Cette résistance est affaire de degré, non de nature.
Ce holisme renverse la hiérarchie héritée. Il n'y a plus de partage tranché entre des [[Dictionnaire de philosophie/Croyance|croyances]] purement empiriques, qui affronteraient seules l'expérience, et des vérités purement formelles, qui en seraient à l'abri. Toutes nos croyances tiennent ensemble par leurs liens logiques, et c'est l'ensemble qui se confronte au monde. Les énoncés de la logique, des mathématiques, de l'ontologie, sont au cœur du réseau ; ceux de l'histoire et de la perception, à sa marge. Mais ce ne sont là que des positions relatives sur une même étoffe, non des espèces hétérogènes.
Pour rendre ces distances tangibles, Quine recourt à des exemples ordinaires. Qu'une expérience nous surprenne, et, selon les cas, nous y ferons face en corrigeant l'énoncé qu'il y a des maisons de brique dans telle rue, ou bien l'énoncé qu'il n'existe pas de centaures. De tels énoncés ont une référence empirique aiguë : ils touchent presque au bord du tissu. Les énoncés de la physique des particules, des mathématiques ou de l'ontologie, eux, gisent au centre, non parce qu'ils échapperaient à l'expérience, mais parce qu'aucune sensation particulière ne s'y noue de façon saillante. C'est pourquoi nous révisons d'abord les premiers : non par contrainte logique, mais par souci de troubler l'ensemble le moins possible.<ref>L'exemple des maisons de brique et des centaures illustre la « référence empirique aiguë » de certains énoncés (« Deux dogmes de l'empirisme », ''FLPV'', éd. citée, p. 43-44).</ref>
Quine en tire une conséquence sur le statut des objets eux-mêmes. Les objets physiques, écrit-il, sont introduits dans notre conception comme des intermédiaires commodes, non par définition à partir de l'expérience, mais à titre de simples postulats, comparables, sur le plan de la connaissance, aux dieux d'Homère. La comparaison est calculée pour choquer, et Quine en précise aussitôt la portée. Lui-même croit aux objets physiques et non aux dieux d'Homère, et il tient pour une erreur scientifique de croire le contraire. Mais quant à leur statut épistémologique, les uns et les autres ne diffèrent que par degré : tous deux entrent dans notre conception comme des entités posées par la culture. Le mythe des objets physiques l'emporte sur les autres en ceci qu'il s'est révélé plus efficace qu'eux pour ménager une structure maniable dans le flux de l'expérience. Postuler des corps, des atomes, des forces, des classes, c'est se donner des instruments d'organisation et de prédiction ; la science continue en cela le geste du sens commun, qui gonfle l'ontologie pour simplifier la théorie.
Deux notions complètent ce tableau et l'éloignent du relativisme facile auquel on le réduit parfois. La première est la sous-détermination des théories par l'expérience : pour un même corps de données possibles, plusieurs théories rivales, incompatibles entre elles, peuvent rendre compte également bien des observations. Les bords du champ ne fixent pas son intérieur. La seconde est que ce jeu n'est pas arbitraire. Quand l'expérience nous contraint à retoucher notre système, deux forces guident notre choix : un conservatisme qui nous porte à déranger le système le moins possible, et une quête de simplicité qui nous fait préférer les hypothèses les plus économiques. Carnap, Lewis et d'autres adoptaient une attitude pragmatique pour le choix entre formes de langage, mais leur pragmatisme s'arrêtait à la frontière supposée de l'analytique et du synthétique. En supprimant cette frontière, Quine étend le pragmatisme à toute la science : chacun reçoit un héritage scientifique et un flux continu de stimulations sensorielles, et les considérations qui le guident, lorsqu'il ajuste cet héritage à ces stimulations, sont, dans la mesure où elles sont rationnelles, pragmatiques. L'empirisme sans les dogmes devient un pragmatisme plus conséquent, attentif à la fois à l'expérience, qui contraint, et à la cohérence du système, qui oriente.
Quine a tempéré, avec le temps, la version forte de 1951. Dans « Two Dogmas in Retrospect » (1991), il reconnaît que faire comparaître la science tout entière à chaque épreuve allait au-delà de ce qu'exigeait sa critique du réductionnisme. Il parle désormais d'un holisme modéré. Ce qui affronte l'expérience, ce ne sont pas des énoncés isolés ; mais ce n'est pas non plus la totalité de nos croyances : ce sont des ensembles d'énoncés assez vastes pour impliquer des prédictions observables, ce qu'il nomme des « masses sémantiques critiques ». Le principe demeure, intact : aucun énoncé n'est en droit à l'abri d'une révision. En fait, pourtant, l'épreuve porte sur des fragments de théorie, non sur le système entier à chaque instant. Quine en tire même une explication de la nécessité mathématique qui se passe d'analyticité : si l'énoncé mis en cause est purement mathématique, nous nous gardons de le réviser, car y toucher ébranlerait trop le reste de la science. C'est ce qu'il appelle la maxime de mutilation minimale. Dans ce cadre, la nécessité mathématique tient à la position centrale des mathématiques dans notre système et à notre politique rationnelle de porter ailleurs les révisions, sauf coût théorique exceptionnel.<ref>W. V. O. Quine, « Two Dogmas in Retrospect », ''Canadian Journal of Philosophy'', vol. 21, 1991, p. 265-274 (ici p. 269-270) ; voir aussi ''La poursuite de la vérité'', éd. citée, chap. 1. Sur ce holisme modéré et la « masse sémantique critique », voir Roger F. Gibson (dir.), ''The Cambridge Companion to Quine'', Cambridge University Press, 2004, p. 12-13.</ref>
== La traduction radicale et l'indétermination de la signification ==
Le holisme atteignait la théorie de la confirmation. Quine va l'étendre à la théorie de la signification, et c'est l'objet central du ''Mot et la chose'' (1960). Le fil conducteur en est une exigence naturaliste : si le langage est un comportement public, appris par l'enfant au contact d'autrui dans des situations observables, alors tout ce qu'il y a à savoir sur la signification doit pouvoir se lire dans ce comportement et dans les circonstances qui l'accompagnent. Il n'y a pas, dans l'apprentissage et l'usage d'une langue, de matière cachée à laquelle le sujet aurait un accès privé. Cette contrainte, Quine la met à l'épreuve par une expérience de pensée qu'il a rendue fameuse : la traduction radicale.
=== Le linguiste de terrain ===
[[Fichier:European Rabbit 09 05 2025 02.jpg|vignette|upright=1.15|« Gavagai. » Un lapin détale, l'indigène prononce ce mot, le linguiste note « Lapin ». Mais rien dans la scène ne décide si le terme indigène vise un lapin entier, un segment temporel de lapin, ou un agrégat de parties non détachées de lapin.]]
Imaginons un linguiste qui aborde une langue jusqu'alors inconnue, sans interprète, sans dictionnaire, sans la moindre passerelle avec une langue déjà comprise. Tout ce dont il dispose, ce sont les sons que prononcent les indigènes et les circonstances visibles où ils les prononcent. C'est la situation de la traduction radicale, où l'on doit tout reconstruire à partir du seul comportement. Un lapin détale, l'indigène dit « Gavagai », et le linguiste inscrit provisoirement « Lapin » comme traduction. Pour étayer cette conjecture, il guette les occasions : il prononce lui-même « Gavagai ? » dans diverses situations et note si l'indigène marque son assentiment, son refus, ou ni l'un ni l'autre. À force d'observations, il accumule des indices et finit par tenir « Gavagai » pour synonyme de « Lapin ».
Ce que le linguiste peut établir ainsi, Quine le nomme la signification stimulante (stimulus meaning) d'une phrase d'occasion : l'ensemble des stimulations sensorielles qui disposeraient l'indigène à donner son assentiment, et l'ensemble de celles qui provoqueraient son refus. Il importe de penser ce qui déclenche l'assentiment comme une stimulation, non comme le lapin lui-même : la stimulation reste la même si l'on remplace l'animal par un leurre habile, et elle change si l'on bouche les yeux de l'indigène. Sur cette base étroite, Quine reconnaît que certains énoncés se laissent traduire avec une assurance suffisante. Ce sont les énoncés d'observation, dont l'assentiment est étroitement commandé par la stimulation présente, et qui constituent le point d'ancrage de la langue dans le monde. « Gavagai » et « Voici un lapin » sont, en ce sens limité, synonymes stimulants : ils commandent l'assentiment dans les mêmes circonstances.
=== Le lapin, ses parties et sa lapinité ===
Il faut ici dissiper une confusion fréquente, car l'exemple du lapin sert en réalité deux thèses voisines mais distinctes. Comme phrase d'observation, « Gavagai » se laisse traduire avec assurance : sa signification stimulante est déterminée, et « Voici un lapin » en est un bon équivalent. La difficulté surgit au niveau du terme. La première thèse, l'inscrutabilité de la référence, porte précisément sur les termes, sur ce que désigne le mot « gavagai » pris à part. La seconde, l'indétermination de la traduction proprement dite, est plus large : elle porte sur les phrases, et surtout sur les énoncés éloignés de l'observation, dont rien ne fixe la traduction même lorsque celle des termes serait arrêtée. Le doute entre le lapin, ses parties et ses phases relève de la première ; il en offre l'image la plus parlante, mais on aurait tort d'y réduire la seconde.
Voici le ressort de l'argument. L'accord sur la signification stimulante de « Gavagai » comme phrase ne garantit nullement que « gavagai » et « lapin » soient des termes coextensifs, vrais des mêmes choses. Car que désigne au juste « gavagai » ? Peut-être des lapins ; mais peut-être de simples segments temporels de lapins, de brèves tranches de leur durée ; ou encore l'ensemble des parties non détachées de lapins ; ou même la fusion de tous les lapins en une seule portion discontinue de l'espace-temps ; ou enfin la lapinité, ce trait universel partout où un lapin se manifeste. Dans tous ces cas, la signification stimulante serait la même. Pointer un lapin, c'est aussi bien pointer une de ses parties, un de ses instants, la fusion à laquelle il appartient, le lieu où la lapinité s'incarne. Aucune ostension, aucune désignation par le doigt ne tranche entre ces lectures, car ce qui les distingue n'est pas dans la ressemblance des stimulations, mais dans l'anatomie des phrases : dans la manière dont la langue manie l'identité, la pluralité, les articles, ce que Quine appelle l'appareil de la référence.
Or cet appareil, le linguiste ne peut le mettre en évidence qu'en posant des hypothèses sur la façon dont la langue indigène rend nos propres procédés : nos pronoms, notre copule, notre « est le même que ». Ces hypothèses, que Quine nomme hypothèses analytiques, vont au-delà de tout ce que la signification stimulante autorise. Elles sont indispensables pour passer de la traduction des phrases d'occasion à celle des termes, mais rien dans le comportement ne les impose. Le linguiste peut équivaloir « gavagai » à « lapin », ou à « segment de lapin », ou à « partie non détachée de lapin », et compenser ce choix en ajustant la traduction de l'identité et des particules associées, sans jamais entrer en conflit avec les significations stimulantes. La référence des termes étrangers reste, selon le mot de Quine, inscrutable. Les phrases d'occasion et la signification stimulante sont une monnaie commune ; les termes et la référence, eux, sont propres à notre schème conceptuel.<ref>W. V. O. Quine, ''Le mot et la chose'', § 12, trad. Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977 (''Word and Object'', Cambridge (Mass.), The MIT Press, 1960). Le lapin, ses segments, ses parties non détachées et la lapinité, ainsi que la remarque selon laquelle « l'inscrutabilité tient non à la ressemblance, mais à l'anatomie des phrases », occupent le § 12 (p. 51-53 de l'éd. de 1960).</ref>
=== Le mythe du musée ===
Derrière cet argument, Quine vise une certaine image de la signification, qu'il appelle le mythe du musée. Selon cette image, les significations seraient à nos expressions ce que les tableaux exposés dans un musée sont à leurs étiquettes : des objets fixes, indépendants des langues, que les mots se borneraient à désigner. Deux expressions seraient synonymes lorsqu'elles renvoient à une même signification, comme deux étiquettes pour un seul tableau ; et traduire un mot, ce serait lui trouver, dans une autre langue, l'étiquette qui pend au même tableau, c'est-à-dire à la même signification interlinguistique. Ce que cet argument établit, c'est qu'aucune signification de ce genre, antérieure aux langues et commune à elles, ne vient fixer la traduction. Il n'existe pas de signification de « Gavagai » qui dirait, par-delà tout comportement, s'il faut le rendre par « lapin » ou par « segment de lapin ». La signification n'est pas un objet logé dans un musée mental : elle se réduit à ce que le comportement linguistique, dans ses circonstances, peut exhiber, c'est-à-dire à la signification stimulante, bien plus pauvre que la synonymie pleine que les philosophes lui prêtaient.<ref>Le « mythe du musée », où « les pièces exposées sont des significations et les mots, des étiquettes », ouvre « La relativité de l'ontologie », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Ontological Relativity », ''OR'', p. 27).</ref>
=== L'indétermination de la traduction ===
De là procède la thèse de l'indétermination de la traduction. Deux linguistes, travaillant indépendamment sur la même langue, pourraient produire deux manuels de traduction, chacun cohérent avec la totalité du comportement verbal observable, et pourtant inconciliables entre eux : là où l'un rendrait une phrase d'une certaine façon, l'autre la rendrait d'une façon que le premier rejetterait. Aucun fait, pas même la totalité des dispositions verbales des locuteurs, ne permettrait de dire lequel a raison, car il n'y a pas, en ce domaine, de fait de l'affaire qui excède le comportement. La traduction n'est pas seulement difficile ou faillible : elle est, en un sens précis, sous-déterminée par tout ce qui pourrait en décider.
Quine insiste sur un point qu'on néglige souvent. S'il a choisi pour théâtre une langue exotique, c'est pour rendre la thèse plausible, à la manière des ''Voyages de Gulliver'' qui éclairent nos mœurs en les transposant dans des contrées étranges. Mais la leçon vaut aussi pour notre propre langue. Étant donné deux manuels rivaux entre la langue de la jungle et la nôtre, nous pouvons traduire perversement notre langue en elle-même, en la faisant passer par la jungle au moyen d'un manuel, puis revenir au moyen de l'autre. L'indétermination n'est pas un accident de l'éloignement ; elle tient à la nature même de la signification. Ce qui se donnait pour un objet bien défini, le sens d'une phrase ou d'un mot, se révèle un mythe dès qu'on exige qu'il rende compte de plus que ce que le comportement public peut porter.
Un écueil guette ici, qu'il faut écarter : confondre cette indétermination avec la sous-détermination des théories physiques rencontrée à propos du holisme. Une théorie de la nature est sous-déterminée parce que les données laissent ouvertes plusieurs descriptions du monde ; mais il y a, sous ces descriptions, un monde à décrire : les théories rivales diffèrent par ce qu'elles disent de la réalité, même si les observations disponibles, voire toutes les observations possibles, ne suffisent pas à les départager. Dans le cas de la traduction, soutient Quine, il n'en va pas ainsi : ce n'est pas que le fait de la signification nous échappe, c'est qu'il n'existe aucun fait à atteindre. L'indétermination n'est pas une ignorance, mais une absence. C'est en ce point précis que la thèse heurte le sens commun, et que ses adversaires la jugent tantôt triviale, tantôt incroyable.<ref>Sur l'idée qu'il n'y a, en matière de signification, aucun fait à connaître, voir « Parler d'objets » (''OR'', éd. citée, p. 5) et ''Le mot et la chose'', § 16. Quine précisera la distinction d'avec la sous-détermination dans ''La poursuite de la vérité'', éd. citée, chap. 1.</ref>
== L'inscrutabilité de la référence et la relativité de l'ontologie ==
L'indétermination de la traduction se rapporte aux phrases et à leur sens. Quine isole un autre phénomène, voisin mais distinct, qui touche cette fois la référence des termes : l'inscrutabilité de la référence. Il l'avait déjà rencontré avec « gavagai », où rien ne fixait si le terme renvoyait au lapin, à ses parties ou à sa fusion. Il en donne dans « La relativité de l'ontologie » (1968) une formulation générale, à l'aide de ce qu'il appelle des fonctions de substitution. Soit une théorie quelconque ; remplaçons systématiquement chacun de ses objets par un autre, au moyen d'une correspondance terme à terme. À chaque objet, faisons par exemple correspondre son singleton, c'est-à-dire la classe qui n'a que lui pour élément ; ou bien son complément spatio-temporel, c'est-à-dire tout le reste du monde, lui excepté. Si l'on réinterprète en même temps tous les prédicats de la théorie de manière concertée, l'ensemble des énoncés vrais reste exactement le même, et avec lui la totalité de la matière probante. Du dehors, rien ne distingue la théorie qui parle de lapins de celle qui parle de singletons de lapins. La référence de chaque terme est, en ce sens, indéterminée : on peut faire tourner l'univers des objets sans que la trame des vérités s'en ressente.<ref>W. V. O. Quine, « La relativité de l'ontologie » (''Relativité de l'ontologie et autres essais'', éd. citée). Les fonctions de substitution, qui établissent l'inscrutabilité de la référence, sont introduites ''OR'', p. 47 et suiv.</ref>
Quine en tire une conséquence sur le sens même des questions d'ontologie. Demander, dans l'absolu, quels sont les objets d'une théorie n'a pas de sens. La question ne devient sensée que relativement à un manuel de traduction dans une théorie d'arrière-plan. C'est seulement en rapportant une langue à une autre, prise pour cadre, que l'on peut dire ce dont parle la première ; et cette théorie d'arrière-plan demande à son tour, si on l'interroge, d'être rapportée à une autre. La référence est ainsi relative, comme la position d'un point est relative à un système de coordonnées. Il est vain de demander où se trouve un objet dans l'espace absolu ; on ne peut indiquer sa place que par rapport à un repère. De même, il est vain de demander quels objets une théorie pose en elle-même ; on ne peut le dire que par rapport à un cadre que l'on adopte sans le mettre lui-même en question. Telle est la relativité de l'ontologie.
On évitera un contresens. Quine ne soutient pas que les objets seraient des illusions, ni que tout se vaut. Resté à l'intérieur de notre langue, sans la mettre en balance avec une autre, je parle bel et bien de lapins, de tables et de nombres, et la question « combien de lapins ? » a une réponse déterminée. C'est l'image qu'il propose en disant qu'il faut « rester à bord de son propre langage » et ne pas faire tanguer la barque : tant qu'on n'entreprend pas de traduire son langage en un autre, ou de le permuter sur lui-même, la référence va de soi.<ref>Sur l'image de rester « à bord de son propre langage » sans « faire tanguer la barque », et sur la traduction perverse de l'anglais en anglais, voir « La relativité de l'ontologie » (''OR'', p. 30 et p. 47-48) et ''La poursuite de la vérité'', trad. Maurice Clavelin, Paris, Seuil, 1993.</ref> Elle ne devient inscrutable que lorsqu'on prend du recul, qu'on contemple une réinterprétation globale ou qu'on traduit. Ce que Quine appelle dans ses derniers textes son structuralisme global tient en ceci : ce que nos théories saisissent du monde, c'est une structure, le réseau des rôles imbriqués que remplissent les objets, et non l'identité propre de ces objets pris un à un. « La structure est ce qui importe à la science, écrit-il, non le choix de ses objets. » Ceux-ci ne sont plus alors que des « points neutres » dans l'armature logique de notre théorie, et leur nature intime reste hors d'atteinte. Il faut pourtant se garder d'un dernier malentendu : ce structuralisme n'est pas une thèse sur ce qui existe. Quine ne soutient pas que seules les structures seraient réelles, ni que tout se réduirait à des relations sans termes ; il continue d'admettre des objets, corps et classes. Il soutient seulement qu'aucun fait ne décide lesquels, parmi des objets que l'on peut mettre en correspondance terme à terme, portent vraiment la structure. Sauver la structure, en somme, c'est tout sauver.<ref>« La structure est ce qui importe à la science, non le choix de ses objets » : W. V. O. Quine, « Things and Their Place in Theories », dans ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981, p. 20. Les objets réduits à des « points neutres » dans la structure logique de la théorie : ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995, p. 74-75. Sur le caractère non ontologique de ce structuralisme, qui n'infère pas que seules les structures existent, voir Frederique Janssen-Lauret (dir.), ''Quine, Structure, and Ontology'', Oxford University Press, 2020, notamment l'introduction et le chapitre de Michael Resnik.</ref>
== L'épistémologie naturalisée ==
Le dernier grand déplacement opéré par Quine concerne l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] elle-même. Exposé surtout dans « L'épistémologie naturalisée » (1969)<ref>W. V. O. Quine, « L'épistémologie naturalisée », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Epistemology Naturalized », ''OR'', p. 69-90). L'épistémologie « comme chapitre de la psychologie », la « contenance réciproque » et le rapport entre « l'entrée maigre et la sortie torrentielle » se trouvent p. 83.</ref>, il consiste à ranger la théorie de la connaissance parmi les sciences de la nature, au rebours d'une tradition qui voulait qu'elle les précède et les fonde.
=== La fin de la philosophie première ===
Depuis [[Dictionnaire de philosophie/René Descartes|Descartes]], l'épistémologie se voulait une philosophie première : une discipline antérieure à la science, chargée d'en assurer les fondements depuis un point d'appui que la science ne fournirait pas. Le projet avait deux versants. Sur le versant doctrinal, il s'agissait de déduire les vérités sur le monde à partir de l'expérience immédiate, avec la certitude de la logique ; c'était la quête cartésienne de la [[Dictionnaire de philosophie/Certitude|certitude]]. Sur le versant conceptuel, il s'agissait de définir les notions de la science à partir des seuls termes d'observation. L'aboutissement le plus accompli de ce second versant est l{{'}}''Aufbau'' de Carnap (1928), qui entreprend de construire le monde comme un édifice logique élevé sur la base des données sensibles.
Quine tient ce projet pour irrémédiablement échoué, et il s'y connaît, lui qui admirait Carnap. Sur le versant doctrinal, l'échec était reconnu de longue date : on ne peut déduire la science de l'expérience, car la plus modeste des généralisations sur l'observable porte sur plus de cas que son auteur n'en a jamais pu observer. La quête de certitude était une cause perdue, héritée de Hume autant que de Descartes. Sur le versant conceptuel, l'entreprise de l{{'}}''Aufbau'' achoppe elle aussi. Carnap ne parvient pas à fournir une réduction par traduction, c'est-à-dire une recette permettant de réécrire chaque énoncé sur le monde en termes d'observation, de logique et de théorie des ensembles. Au point capital, là où il faut assigner des qualités sensibles à des positions dans l'espace et le temps, il ne donne qu'une consigne d'ajustement, révisable au fil de l'expérience, et non une définition. L'idéal d'une réduction du monde à l'expérience demeure hors d'atteinte.
L'échec du fondationnalisme ne signe pourtant pas la mort de l'empirisme. Deux thèses empiristes, souligne Quine, demeurent intactes. La première : toute la matière probante dont dispose la science est de nature sensorielle. La seconde : l'apprentissage du sens des mots repose en dernière instance sur l'expérience sensible. Ce qui s'effondre, c'est l'ambition de déduire la science de cette base ; ce qui subsiste, c'est que la science n'a pas d'autre source d'épreuve que l'irritation de nos surfaces sensorielles. Le naturalisme de Quine n'est donc pas un congé donné à l'empirisme, mais sa reformulation : un empirisme qui renonce au fondement sans renoncer à l'expérience.<ref>« L'épistémologie naturalisée » (''OR'', éd. citée, p. 75) : « toute matière probante de la science est sensorielle » et « l'inculcation du sens des mots repose en dernier ressort sur la matière probante sensorielle ».</ref>
=== Un chapitre de la psychologie ===
Devant cet échec, Quine propose un renversement. Puisque le rêve de déduire la science de l'observation est perdu, pourquoi ne pas se contenter de la psychologie ? Pourquoi ne pas étudier, simplement, comment l'édifice de nos croyances s'élève en fait sur la base des stimulations sensorielles ? On objectait jadis à cette idée un cercle vicieux : si l'épistémologue veut valider les fondements de la science, il se contredit en usant, pour cela, de la science elle-même. Mais ce scrupule, observe Quine, perd toute portée dès qu'on a cessé de vouloir déduire la science de l'observation. Si nous cherchons seulement à comprendre le lien entre l'observation et la théorie, nous avons tout intérêt à mobiliser toute l'information disponible, y compris celle que nous fournit la science même dont nous étudions le rapport à l'observation. La crainte de la circularité n'a de sens que pour qui poursuit encore une fondation ; elle s'évanouit pour qui cherche seulement à comprendre.
L'épistémologie trouve alors une place nouvelle : elle devient un chapitre de la psychologie, et par là de la science de la nature. Elle étudie un phénomène naturel, à savoir un sujet humain physique. On accorde à ce sujet une certaine entrée, contrôlée par l'expérimentateur, sous forme de schémas d'irradiation de ses surfaces sensorielles ; et, le temps venu, le sujet livre en sortie une description du monde extérieur à trois dimensions et de son histoire. La relation entre cette entrée maigre et cette sortie torrentielle est précisément ce que l'épistémologue est conduit à étudier, pour des raisons à peu près semblables à celles qui ont toujours animé sa discipline : voir comment la matière probante se rattache à la théorie, et en quoi notre théorie de la nature déborde toute donnée disponible.
Quine décrit le rapport ainsi obtenu entre l'épistémologie et la science par une formule en forme de boucle : il y a contenance réciproque. L'ancienne épistémologie aspirait à contenir la science, à la construire à partir des données sensibles ; la nouvelle, à l'inverse, est contenue dans la science, comme un chapitre de la psychologie. Mais l'ancienne contenance vaut aussi, à sa manière, car nous étudions comment notre sujet pose des corps et projette sa physique à partir de ses données, et nous comprenons que notre propre position dans le monde ne diffère en rien de la sienne. Notre étude de la connaissance, la psychologie où elle s'inscrit, la science tout entière qui contient cette psychologie : tout cela est notre propre construction, projetée à partir de stimulations semblables à celles que nous administrons au sujet observé. Nul cercle vicieux là-dedans, une fois renoncé au rêve de la déduction : nous cherchons à comprendre la science comme un processus dans le monde, et nous n'exigeons pas que cette compréhension soit plus assurée que la science qui en est l'objet.
Cette attitude, Quine la rattache à une image qu'il emprunte à Otto Neurath et qu'il affectionne : celle du [[Dictionnaire de philosophie/Bateau de Neurath|bateau de Neurath]].<ref>L'image du bateau est empruntée à Otto Neurath ; Quine la place en exergue du ''Mot et la chose'' et la reprend dans « L'épistémologie naturalisée » (''OR'', p. 84) ainsi que dans l'essai « Natural Kinds » (même volume, p. 127).</ref> Nous sommes comme des marins qui doivent réparer leur navire en pleine mer, sans pouvoir le mettre en cale sèche ni le reconstruire à neuf depuis la quille. Nous ne disposons d'aucun sol ferme extérieur à la science d'où la refonder ; nous travaillons toujours du dedans, remplaçant une planche après l'autre tout en restant à flot, en nous appuyant sur le reste de la coque. Il n'y a pas de point d'appui archimédien hors de nos croyances, pas de [[Dictionnaire de philosophie/A priori|donnée première]] soustraite à l'enquête. La philosophie ne surplombe pas la science : elle en fait partie, à la pointe la plus générale et la plus réflexive, mais sans privilège de juridiction. On objectera que naturaliser l'épistémologie, c'est la priver de sa fonction d'évaluation : si elle se borne à décrire comment nous formons nos croyances, que devient la question de savoir lesquelles sont justifiées ? Quine répond, on le verra, que la part normative n'est pas abolie, mais reconduite à l'intérieur de la science, sous la forme de recommandations sur les meilleurs moyens d'atteindre la vérité. Le naturalisme ne supprime pas la norme ; il cesse seulement de la chercher hors de la science.
== Logique, extensionnalisme et critique des modalités ==
Logicien de métier, Quine a soutenu en philosophie de la logique des positions cohérentes avec l'ensemble de son œuvre. La première est un extensionnalisme assumé. Un contexte est dit extensionnel lorsqu'on peut y remplacer un terme par un autre, vrai des mêmes objets, sans changer la valeur de vérité de l'énoncé, et lorsqu'on peut y substituer à une phrase toute phrase de même valeur de vérité. La logique classique des prédicats est extensionnelle ; elle ne connaît que les objets, leurs classes et la vérité ou la fausseté des énoncés. Quine y voit le langage le plus clair que nous ayons, et il refuse d'en sortir sans nécessité. Ce refus a une cible précise : les entités intensionnelles, c'est-à-dire les significations, les propositions et les propriétés, qui peuplent les contextes où la substitution échoue. On a vu pourquoi il les écarte : faute de critère d'identité, ces entités ne satisfont pas à la règle « pas d'entité sans identité ».
=== L'opacité des contextes modaux ===
C'est sur ce terrain que se joue la critique quinienne de la logique modale, celle qui ajoute à la logique les opérateurs « il est nécessaire que » et « il est possible que ». Quine ne conteste pas la logique modale comme calcul formel ; il conteste qu'on puisse l'interpréter de façon intelligible dès qu'on y fait entrer des quantificateurs. Son argument procède d'un exemple resté classique. Considérons les deux énoncés : « il est nécessaire que neuf soit plus grand que sept » et « il est nécessaire que le nombre des planètes soit plus grand que sept ». Le premier paraît vrai, les vérités de l'arithmétique passant pour les meilleures candidates à la nécessité. Le second paraît faux, car le nombre des planètes aurait pu être autre : le système solaire aurait pu se former avec moins d'astres. Or, à l'époque où Quine écrit, le nombre des planètes est neuf. On passe donc du premier énoncé au second en remplaçant un terme, « neuf », par un autre qui désigne le même objet, « le nombre des planètes » ; et cette substitution transforme un vrai en un faux. Le contexte modal est ainsi opaque à la référence : ce qui s'y dit ne dépend pas seulement de l'objet désigné, mais de la façon de le désigner.<ref>W. V. O. Quine, « Référence et modalité » (« Reference and Modality »), dans ''Du point de vue logique'', éd. citée : l'exemple du nombre des planètes est introduit ''FLPV'' p. 143, et l'« attitude discriminante » envers les façons de spécifier un objet, censée livrer son « essence », est dénoncée p. 155. Voir aussi « Les trois degrés de l'implication modale » (« Three Grades of Modal Involvement »), dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''The Ways of Paradox and Other Essays'', ci-après ''WP'', New York, Random House, 1966, p. 158 et p. 175).</ref>
Tant qu'on s'en tient à une modalité de dicto, qui porte sur des énoncés tout entiers, Quine concède qu'on peut donner un sens à ces tournures, en traitant la nécessité comme un prédicat attaché à des phrases plutôt qu'à des choses : « la phrase neuf est plus grand que sept est nécessaire ». La difficulté surgit quand on veut quantifier dans le contexte modal, c'est-à-dire affirmer une modalité de re, qui porte sur la chose elle-même : « il existe un objet qui est nécessairement plus grand que sept ». Une telle affirmation prétend qu'un objet possède une certaine propriété nécessairement, en lui-même, indépendamment de la manière dont on le spécifie. Or cela suppose, soutient Quine, ce qu'il nomme avec ironie l'essentialisme aristotélicien : la doctrine selon laquelle, parmi les propriétés vraies d'une chose, certaines lui appartiennent par essence et d'autres par accident, abstraction faite de toute description.
=== Le mathématicien cycliste ===
Pour faire sentir ce qu'il tient pour une perplexité légitime, Quine forge dans ''Le mot et la chose'' un exemple devenu un cas d'école. On dira peut-être que les mathématiciens sont nécessairement rationnels et non nécessairement bipèdes, tandis que les cyclistes sont nécessairement bipèdes et non nécessairement rationnels. Soit. Mais que dire d'un individu qui compte parmi ses occupations à la fois les mathématiques et la bicyclette ? Cet homme concret est-il nécessairement rationnel et accidentellement bipède, ou l'inverse ? La question, juge Quine, n'admet pas de réponse, et ne devrait pas en admettre.<ref>W. V. O. Quine, ''Le mot et la chose'', § 41 (''Word and Object'', éd. citée, p. 199).</ref> Car la rationalité ne lui revient nécessairement qu'en tant qu'on le considère comme mathématicien, et la bipédie qu'en tant qu'on le considère comme cycliste ; rapportées à l'objet nu, sans description privilégiée, ces nécessités s'évanouissent. L'essentialisme exige qu'on tienne pour mieux révélatrices de l'essence certaines manières de spécifier un objet, et pour trompeuses les autres. Cette préférence, Quine la trouve injustifiable, et la nécessité de re qui s'y appuie, à peine intelligible.
=== Attitudes propositionnelles et nécessité ===
La même opacité affecte les contextes de croyance, que Quine range parmi les attitudes propositionnelles. « Œdipe veut épouser Jocaste » peut être vrai quand « Œdipe veut épouser sa mère » est faux, alors même que Jocaste est sa mère. Là encore, la substitution de termes coréférents échoue, et pour la même raison : ce qui est en jeu n'est pas seulement l'objet, mais la façon dont il est présenté à l'esprit du croyant. Quine en conclut que ces tournures, indispensables à la vie ordinaire, résistent à une analyse extensionnelle et qu'il faut, en science rigoureuse, soit les paraphraser, soit s'en passer.
Il faut signaler que ces réserves n'ont pas eu le dernier mot. À partir de « La logique des noms propres » (''Naming and Necessity'') de Saul Kripke et de la sémantique des mondes possibles, une partie de la philosophie a réhabilité la nécessité de re, l'essentialisme et même la notion de vérité nécessaire connue a posteriori. Là où Quine voyait une notion à peine compréhensible, ces travaux ont vu un domaine cohérent et fécond. Le débat reste ouvert, et il oppose deux conceptions de la nécessité : pour Quine et l'empirisme logique, la nécessité, si elle a un sens, vient de nous, de notre langage ; pour la tradition issue de Kripke, elle est ancrée dans la nature des choses. Quine considérait cette seconde idée comme un retour à une métaphysique qu'il croyait dépassée.
=== La logique n'est pas vraie par convention ===
Reste la question du statut des vérités logiques elles-mêmes. L'empirisme logique tenait la logique et les mathématiques pour vraies en vertu de [[Dictionnaire de philosophie/Convention|conventions]] linguistiques. Quine, dès « Truth by Convention » (1936) puis dans « Carnap et la vérité logique », a démonté cette thèse par un argument de régression.<ref>W. V. O. Quine, « La vérité par convention » (« Truth by Convention », 1936) et « Carnap et la vérité logique » (« Carnap and Logical Truth »), repris dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''WP'', éd. citée, p. 89 et p. 113-114).</ref> Si les vérités logiques découlaient de conventions explicites, encore faudrait-il, pour en tirer les cas particuliers à partir des règles générales, user de la logique. On ne peut poser par convention l'infinité des vérités logiques qu'en les énonçant sous forme de quelques principes généraux, dont on déduirait les instances ; mais cette déduction présuppose déjà la logique qu'on prétendait fonder. La convention ne saurait donc engendrer la logique sans la supposer. Quine en conclut que les vérités logiques ne sont pas d'une autre nature que les autres : elles occupent simplement la position la plus centrale et la plus générale du réseau de nos croyances, là où nous touchons le moins volontiers, parce qu'y toucher bouleverserait tout le reste.
De là découle une dernière thèse, que résume une formule de sa ''Philosophie de la logique'' : changer de logique, c'est changer de sujet.<ref>W. V. O. Quine, ''Philosophie de la logique'', chap. 6, « Les logiques déviantes », trad. Jean Largeault, Paris, Aubier-Montaigne, 1975 (''Philosophy of Logic'', Cambridge (Mass.), Harvard University Press, 1970, p. 81 ; sur le « prix » d'une logique déviante, p. 86-87).</ref> Qui prétend réviser une loi logique, par exemple en rejetant le tiers exclu, ne réfute pas l'ancienne loi ; il donne un sens nouveau aux connecteurs, et parle désormais d'autre chose. La logique reste révisable en droit, comme tout le reste du tissu de la science, car aucun énoncé n'y est sacré ; mais sa centralité même fait qu'on ne la révise qu'en dernière extrémité, sous la pression d'une simplification d'ensemble assez forte pour le justifier. Le maintien de la logique classique n'est pas, chez Quine, un dogme : c'est le fruit du conservatisme et de la quête de simplicité qui gouvernent toutes nos révisions, sous la conduite de la maxime de mutilation minimale déjà rencontrée. Réviser une loi logique entraînerait une refonte de si grande ampleur du réseau théorique que le coût en serait, presque toujours, hors de proportion avec le gain. Aussi Quine n'a-t-il jamais recommandé les logiques déviantes : il en admet la possibilité de principe, mais sa maxime milite contre elles, sauf bénéfice théorique exceptionnel, comme celui qu'on a cru parfois entrevoir du côté de la mécanique quantique.
== Postérité et discussions ==
[[Fichier:Willard Van Orman Quine on Bluenose II in Halifax NS harbor 1980.jpg|vignette|upright=1|Quine à la barre du Bluenose II, dans le port de Halifax, en 1980. Le goût des cartes et des voyages, né dans l'enfance, ne le quitta jamais et colore son image de la connaissance comme exploration sans sol ferme.]]
L'œuvre de Quine a façonné le paysage de la philosophie analytique de la seconde moitié du XX{{e}} siècle, au point que ses adversaires eux-mêmes argumentent sur le terrain qu'il a déblayé. Son influence se mesure moins à une école constituée qu'à un climat : le naturalisme, devenu pour beaucoup l'atmosphère par défaut de la discipline.
=== Une influence diffuse ===
Donald Davidson a prolongé le projet quinien de la traduction radicale en une théorie de l'interprétation, posant qu'on ne peut comprendre autrui qu'en lui prêtant, par un principe de charité, une rationalité et des croyances pour l'essentiel vraies. Daniel Dennett a fait du naturalisme quinien un instrument pour la philosophie de l'esprit. En philosophie des mathématiques, l'argument dit d'indispensabilité, élaboré avec Hilary Putnam, soutient que nous devons admettre l'existence des objets abstraits, nombres et ensembles, parce que nos meilleures théories physiques en font un usage que l'on ne sait pas éliminer : c'est le critère de l'engagement ontologique appliqué à la science effective. Le programme d'une [[Dictionnaire de philosophie/Épistémologie|épistémologie]] naturalisée a nourri tout un courant de recherche, qui étudie la formation des croyances avec les ressources de la psychologie et des sciences cognitives, et qui a contribué à rapprocher la philosophie de la connaissance des sciences empiriques de l'esprit.
=== La défense de l'analyticité ===
La critique de la distinction analytique et synthétique n'a pas fait l'unanimité. Dans un article resté célèbre, « Pour la défense d'un dogme » (1956), Paul Grice et Peter Strawson objectent que l'exigence quinienne est trop forte.<ref>H. P. Grice et P. F. Strawson, « In Defense of a Dogma », ''The Philosophical Review'', vol. 65, 1956, p. 141-158.</ref> Que l'on ne sache pas définir « analytique » sans cercle ne prouve pas que la notion soit vide : bien des couples de notions s'éclairent mutuellement sans qu'aucune se laisse réduire à autre chose, et les locuteurs compétents s'accordent en fait, de manière stable, sur ce qui relève du sens des mots et sur ce qui relève des faits. Une distinction dont l'usage est partagé et régulier ne saurait être tenue pour illusoire au seul motif qu'elle résiste à la définition explicite. Carnap, de son côté, n'a jamais cédé sur l'analyticité, qu'il jugeait clarifiable pour les langages réglés. Plus tard, des philosophes comme Paul Boghossian ont cherché à reconstruire une notion défendable de vérité fondée sur la signification, et à rouvrir la question de l'a priori que Quine croyait close.
=== Le langage et l'esprit ===
Sur le terrain du langage, Noam Chomsky a opposé à Quine une linguistique d'inspiration tout autre. Là où Quine, héritier du behaviorisme, voulait expliquer l'acquisition du langage par le conditionnement de dispositions verbales observables, Chomsky fait valoir la pauvreté du stimulus : l'enfant maîtrise sa langue bien au-delà de ce que son exposition limitée pourrait lui apprendre, ce qui suppose des structures innées. Chomsky a de plus contesté le statut de l'indétermination de la traduction, y voyant non un phénomène singulier mais un simple cas de la sous-détermination ordinaire de toute théorie par ses données, sans portée philosophique particulière. Quine a maintenu que l'indétermination était d'une autre espèce : non pas notre ignorance d'un fait qui existerait, mais l'absence de tout fait à connaître. Le différend touche à la question de savoir s'il existe, en matière de signification, des faits que nos méthodes ne feraient qu'approcher, ou s'il n'y a là rien à approcher du tout.
=== Le retour de la nécessité et la question des normes ===
On a dit comment Saul Kripke et la nouvelle théorie de la référence ont rouvert, contre les interdits quiniens, le dossier de la nécessité et de l'essence. Une autre objection, plus interne, vise l'épistémologie naturalisée. Si la théorie de la connaissance se réduit à la description psychologique de la façon dont nous formons nos croyances, que devient sa dimension normative, sa fonction d'évaluer ce qui justifie une croyance et ce qui ne la justifie pas ? Jaegwon Kim a soutenu qu'une épistémologie purement descriptive cesse d'être une épistémologie, faute de pouvoir dire ce que nous devrions croire.<ref>Jaegwon Kim, « What is “Naturalized Epistemology”? », ''Philosophical Perspectives'', vol. 2, 1988, p. 381-405.</ref> Quine a répondu que la norme n'est pas abolie, mais reconduite à une visée pratique : l'épistémologie normative devient une sorte de technologie de la recherche de la [[Dictionnaire de philosophie/Vérité|vérité]], qui étudie, à l'intérieur de la science, par quels moyens on prédit le mieux l'expérience. Les règles de la bonne méthode sont des conseils d'ingénieur, ajustés à une fin, et non des décrets d'une raison souveraine antérieure à toute science. La question de savoir si cette réponse suffit demeure l'un des points vifs de la discussion contemporaine.
== Conclusion ==
L'unité de l'œuvre de Quine tient à une attitude plus qu'à un système. C'est l'attitude de qui refuse tout point d'appui extérieur à la science et travaille toujours du dedans, du sein de nos croyances, sans sol ferme ni certitude première. De ce parti pris découlent, par enchaînement, ses thèses les plus discutées : si nul énoncé n'affronte seul l'expérience, alors le partage de l'analytique et du synthétique s'efface, alors la logique perd son immunité, alors la signification se réduit à ce que le comportement public peut porter, alors la connaissance n'a d'autre juge qu'elle-même. La barbe de Platon tombée sous le rasoir, le mythe du musée dissipé, le rêve de la philosophie première abandonné, il ne reste qu'un univers sobre, des objets et des classes, et une science qui se reconstruit en pleine mer comme le bateau de Neurath, planche après planche. On peut tenir cette austérité pour une perte ou pour une libération. Mais on ne fait plus de l'[[Dictionnaire de philosophie/Métaphysique|ontologie]], de l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] ou de la philosophie du langage sans passer par les questions que Quine a posées, ni sans se situer, fût-ce pour s'en écarter, par rapport aux réponses qu'il a avancées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Quine traduites en français ===
* ''Le mot et la chose'' [''Word and Object'', 1960], traduction de Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977.
* ''Du point de vue logique. Neuf essais logico-philosophiques'' [''From a Logical Point of View'', 1953], traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.
* ''Relativité de l'ontologie et autres essais'' [''Ontological Relativity and Other Essays'', 1969], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1977.
* ''Philosophie de la logique'' [''Philosophy of Logic'', 1970], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1975.
* ''Méthodes de logique'' [''Methods of Logic'', 1950], traduction de Maurice Clavelin, Paris, Armand Colin, 1973.
* ''Les voies du paradoxe et autres essais'' [''The Ways of Paradox and Other Essays'', 1966], Paris, Vrin, 2011.
* ''La poursuite de la vérité'' [''Pursuit of Truth'', 1990], traduction de Maurice Clavelin, Paris, Seuil, 1993.
* ''Quiddités. Dictionnaire philosophique par intermittence'' [''Quiddities. An Intermittently Philosophical Dictionary'', 1987], traduction de Dominique Goy-Blanquet et Thierry Marchaisse, Paris, Seuil, 1992.
=== Principales œuvres non traduites en français ===
* ''Mathematical Logic'', Cambridge (Mass.), Harvard University Press, 1940.
* ''Set Theory and Its Logic'', Cambridge (Mass.), Harvard University Press, 1963.
* ''The Roots of Reference'', La Salle (Illinois), Open Court, 1974.
* ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981.
* ''The Time of My Life. An Autobiography'', Cambridge (Mass.), The MIT Press, 1985.
* ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995.
=== Études ===
* {{Ouvrage|langue=en|prénom1=Edward|nom1=Becker|titre=The Themes of Quine's Philosophy|sous-titre=Meaning, Reference, and Knowledge|lieu=Cambridge|éditeur=Cambridge University Press|année=2012}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=Quintessence|sous-titre=Basic Readings from the Philosophy of W. V. Quine|lieu=Cambridge (Mass.)|éditeur=The Belknap Press of Harvard University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Frederique|nom1=Janssen-Lauret|responsabilité1=dir.|titre=Quine, Structure, and Ontology|lieu=Oxford|éditeur=Oxford University Press|année=2020}}
* {{Ouvrage|prénom1=Paul|nom1=Gochet|titre=Quine en perspective|sous-titre=essai de philosophie comparée|lieu=Paris|éditeur=Flammarion|année=1978}}
* {{Ouvrage|prénom1=Sandra|nom1=Laugier|titre=L'anthropologie logique de Quine|sous-titre=l'apprentissage de l'obvie|lieu=Paris|éditeur=Vrin|année=1992}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=The Cambridge Companion to Quine|lieu=Cambridge|éditeur=Cambridge University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Peter|nom1=Hylton|titre=Quine|lieu=Londres|éditeur=Routledge|année=2007}}
* {{Ouvrage|langue=en|prénom1=Alex|nom1=Orenstein|titre=W. V. Quine|lieu=Chesham|éditeur=Acumen|année=2002}}
* {{Ouvrage|langue=en|prénom1=Christopher|nom1=Hookway|titre=Quine|sous-titre=Language, Experience and Reality|lieu=Cambridge|éditeur=Polity Press|année=1988}}
* {{Ouvrage|langue=en|prénom1=Gilbert|nom1=Harman|prénom2=Ernest|nom2=Lepore|responsabilité1=dir.|titre=A Companion to W. V. O. Quine|lieu=Chichester|éditeur=Wiley-Blackwell|année=2014}}
* {{Ouvrage|langue=en|prénom1=Eve|nom1=Gaudet|titre=Quine on Meaning|sous-titre=The Indeterminacy of Translation|lieu=Londres|éditeur=Continuum|année=2006}}
* {{Ouvrage|langue=en|prénom1=Lewis Edwin|nom1=Hahn|prénom2=Paul Arthur|nom2=Schilpp|responsabilité1=dir.|titre=The Philosophy of W. V. Quine|lieu=La Salle (Illinois)|éditeur=Open Court|année=1986|collection=The Library of Living Philosophers}}
== Voir aussi ==
* [[Dictionnaire de philosophie/Empirisme|Empirisme]]
* [[Dictionnaire de philosophie/Épistémologie|Épistémologie]]
* [[Dictionnaire de philosophie/Métaphysique|Métaphysique]]
* [[Dictionnaire de philosophie/Existence|Existence]]
* [[Dictionnaire de philosophie/Vérité|Vérité]]
* [[Dictionnaire de philosophie/Convention|Convention]]
* [[Dictionnaire de philosophie/A priori|A priori]]
* [[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
* [[Dictionnaire de philosophie/Moritz Schlick|Moritz Schlick]]
* [[Dictionnaire de philosophie/Scepticisme|Scepticisme]]
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Quine, Willard Van Orman}}
42fuknybsgxh3hssm65unp5xb1p5azv
768291
768274
2026-06-22T04:29:26Z
PandaMystique
119061
/* La barbe de Platon */
768291
wikitext
text/x-wiki
{{DicoPhilo|Willard Van Orman Quine|lecture=oui}}
[[Fichier:Willard Van Orman Quine 1935.jpg|vignette|upright=1.1|Willard Van Orman Quine en 1935, à l'époque où il est Junior Fellow à Harvard.]]
Willard Van Orman Quine (1908-2000) est l'une des figures centrales de la philosophie analytique américaine de la seconde moitié du XX{{e}} siècle. Formé dans l'orbite de Bertrand Russell et au contact du Cercle de Vienne, il a pourtant retourné contre l'empirisme logique lui-même les outils qu'il en avait reçus. Son nom reste attaché à quelques gestes critiques qui ont reconfiguré la discipline : la mise en cause de la distinction entre vérités analytiques et vérités synthétiques, l'abandon de l'idée d'une [[Dictionnaire de philosophie/Métaphysique|philosophie première]] antérieure à la science, et la thèse, longtemps reçue comme un paradoxe, selon laquelle la traduction d'une langue dans une autre demeure indéterminée. À ces gestes critiques répond une construction patiente : un naturalisme qui range l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] parmi les sciences de la nature, une conception holiste de la [[Dictionnaire de philosophie/Connaissance|connaissance]] où nos énoncés ne se mesurent pas isolément à l'expérience, mais à l'intérieur d'ensembles théoriques plus ou moins vastes, et un critère précis pour décider de ce qu'une théorie tient pour existant.
Quine écrit une prose dense, ironique, parsemée de formules qui se retiennent : « Être, c'est être la valeur d'une variable liée », « pas d'entité sans identité », « aucun énoncé n'est à l'abri d'une révision ». Cette élégance n'est pas un ornement. Elle traduit une exigence constante d'économie : se contenter des hypothèses les moins nombreuses et les plus claires qui suffisent à la tâche, comme un cartographe qui ne retient d'un territoire que les traits utiles au voyageur. Ce goût de la sobriété, Quine l'avouait volontiers en parlant de sa préférence pour « les paysages désertiques » : un monde ontologiquement maigre, mais net.
== Repères biographiques ==
=== Akron, Oberlin et la découverte de la logique ===
Quine naît le 25 juin 1908 à Akron, dans l'Ohio. Au lycée, il choisit la filière scientifique, manifeste un don pour les mathématiques, gagne un concours de poésie et, plusieurs étés de suite, dessine et vend des cartes des environs. Ce plaisir des cartes et cette passion du voyage ne le quitteront pas : des décennies plus tard, il rédigera pour la ''New York Review of Books'' des recensions d'atlas, et son ami Burton Dreben, devant le nombre de lieux mentionnés dans son autobiographie, suggérera de l'intituler non ''The Time of My Life'' mais « un camion de déménagement ». La lecture d{{'}}''Eureka'' d'Edgar Poe, qui transmet l'ivresse de comprendre l'univers, compte parmi ses premières émotions philosophiques, en même temps qu'un scepticisme précoce en matière religieuse. La dernière année de lycée éveille un intérêt durable pour le langage, la grammaire et l'étymologie.
Entré à l'Oberlin College en 1926, il hésite entre les mathématiques, la philosophie et les lettres classiques. Un compagnon de poker lui apprend qu'un certain Bertrand Russell aurait une « philosophie mathématique ». Quine y voit le moyen de réunir deux de ses penchants : il choisit les mathématiques, complétées par des lectures dirigées en philosophie des mathématiques. Personne, à Oberlin, ne connaît alors les travaux récents de Frege, de Russell ou de Whitehead ; son directeur lui compose, avec une aide extérieure, une liste de lectures qui inclut les ''Principia Mathematica'' de Whitehead et Russell. En 1929, son mémoire de fin d'études généralise une formule empruntée à Couturat et la démontre dans le formalisme strict des ''Principia''. Sa première publication savante, un compte rendu de l'ouvrage de Nicod sur les fondements de la géométrie et de l'induction, paraît dans l{{'}}''American Mathematical Monthly''.
=== Harvard et la renaissance européenne ===
[[Fichier:Russell1907-2.jpg|vignette|upright=1|Bertrand Russell vers 1907. Sa venue à Harvard en 1931 fut, selon Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell joua dans son œuvre le rôle d'un rival admiré dont les thèses appelaient des solutions de rechange.]]
Quine choisit Harvard pour ses études doctorales, parce que son département de philosophie est alors le plus fort en logique du pays : on y trouve Alfred North Whitehead, le coauteur des ''Principia''. Il y soutient en deux ans une thèse intitulée « The Logic of Sequences: A Generalization of Principia Mathematica ». Une préoccupation y affleure déjà, qui ne le quittera plus : celle de l'ontologie, de la question de savoir ce qu'il y a. Là où les ''Principia'' admettent des fonctions propositionnelles, c'est-à-dire des propriétés, donc des entités intensionnelles, Quine cherche à parvenir aux mêmes fins avec des objets extensionnels comme les classes. La même année 1931, Russell vient donner une conférence à Harvard : ce sera, dira Quine, sa « plus éblouissante rencontre avec la grandeur ». Russell restera une présence centrale, à la manière d'un rival dont les positions appellent des solutions de rechange plus acceptables.
Vient ensuite ce que Quine nomme sa renaissance en Europe centrale. Titulaire en 1932-1933 d'une bourse de voyage, il séjourne à Vienne, à Prague et à Varsovie. À Vienne, il assiste aux réunions du Cercle de Vienne et fait la connaissance de Neurath, de [[Dictionnaire de philosophie/Moritz Schlick|Schlick]], de Gödel, de Hahn et de Menger. À Prague, il rencontre Rudolf Carnap, suit ses cours et lit en tapuscrit allemand sa ''Syntaxe logique du langage''. Carnap deviendra une influence aussi forte que Russell, et le débat qui les opposera durant des décennies comptera parmi les échanges majeurs du siècle. À Varsovie, Quine suit les leçons de Leśniewski, de Łukasiewicz et de Tarski, et noue avec l'école polonaise une sympathie durable pour son extensionnalisme et sa parcimonie ontologique. Il décrira ces semaines de Prague et de Varsovie comme « les mois les plus enrichissants » qu'il ait connus.
=== Le professeur de Harvard ===
De retour à Harvard en 1933, Quine est élu Junior Fellow de la Society of Fellows, ce qui le libère de toute charge d'enseignement pendant trois ans. C'est dans cette période qu'il met au point trois de ses positions distinctives : sa conception de l'engagement ontologique, ses systèmes de logique les plus connus, dont les « New Foundations for Mathematical Logic » de 1937, et la première phase de sa critique de la vérité dite analytique, esquissée dans « Truth by Convention » (1936). Son behaviorisme, soit dit en passant, ne date pas de sa fréquentation de B. F. Skinner, autre Junior Fellow, mais de ses lectures de Watson au temps du collège.
Sa facilité pour les langues se manifeste en 1942 : alors qu'il s'est déjà porté volontaire pour la marine, Quine ajourne son engagement afin d'enseigner quatre mois durant à São Paulo, en portugais, langue dont il avait pris les rudiments aux Açores, et il tire de ces leçons un manuel de logique rédigé dans cette langue. Il sert ensuite plus de trois ans dans la marine des États-Unis, où il travaille au déchiffrement des communications des sous-marins allemands et atteint le grade de capitaine de corvette. Professeur titulaire à Harvard à partir de 1948, puis titulaire de la chaire Edgar Pierce de philosophie, il y enseignera jusqu'à sa retraite, en 1978. Ses textes les plus discutés s'échelonnent sur ces décennies : « De ce qui est » (1948), « Deux dogmes de l'empirisme » (1951), le recueil ''Du point de vue logique'' (1953), puis l'ouvrage qui condense sa philosophie, ''Le mot et la chose'' (1960). Suivront « La relativité de l'ontologie » (1968) et « L'épistémologie naturalisée » (1969). La retraite ne ralentit ni sa production ni son influence : il publie encore ''Theories and Things'' (1981), son autobiographie ''The Time of My Life'' (1985), le dictionnaire ''Quiddités'' (1987), ''La poursuite de la vérité'' (1990) et ''From Stimulus to Science'' (1995). Il meurt le 25 décembre 2000.
== L'héritage de l'empirisme logique ==
On comprend mal Quine si on ne le situe pas dans la tradition qu'il prolonge et conteste à la fois. Cette tradition est celle de l'empirisme logique, né de la rencontre entre la nouvelle logique de Frege et de Russell et le programme du Cercle de Vienne. Carnap en avait donné l'exposé le plus soigné, autour de trois thèses. La première est le critère de vérifiabilité : une phrase n'a de signification empirique que si l'on peut indiquer les observations qui la confirmeraient ou l'infirmeraient. La deuxième fait du savoir a priori, celui des mathématiques et de la logique, un savoir purement linguistique : ces vérités seraient vraies en vertu des seules conventions de notre langage, non de quelque fait du monde. La troisième tient la métaphysique pour dépourvue de sens, simple jeu de mots sans portée cognitive. Ce résumé en trois points est une commodité d'exposition, non un portrait figé : la pensée de Carnap se déplace beaucoup, de l{{'}}''Aufbau'' à la syntaxe logique, puis à la sémantique et au principe de tolérance, et c'est avec chacune de ces étapes que Quine dialogue.
Quine partage le point de départ empiriste : toute la matière probante de la science est sensorielle, et l'apprentissage des mots repose en dernière instance sur l'expérience. Mais il va soumettre chacune des trois thèses à un examen qui en démonte les ressorts. Le réductionnisme attaché au critère de vérifiabilité supposait que chaque énoncé possède, pris isolément, un contenu empirique propre ; Quine y opposera le holisme. L'idée d'une vérité purement analytique, qui isolait le linguistique du factuel, lui paraîtra reposer sur un cercle. Quant à la métaphysique, Quine ne la réhabilite pas sous sa forme classique, mais il refuse qu'on tranche d'un trait les questions d'existence : la question « qu'y a-t-il ? » est pour lui sur le même plan que les questions de la science naturelle. Ce que Carnap croyait pouvoir séparer, Quine le tient pour un continuum. Tel est le ressort de son œuvre : un empirisme qui se retourne sur ses propres présupposés et en abandonne les deux dogmes.
== Qu'est-ce qui existe ? L'engagement ontologique ==
=== La barbe de Platon ===
<div style="float:right; width:118px; margin:0 0 12px 16px; position:relative;">
<div style="background:linear-gradient(180deg, #fdfcf9 0%, #f5f2ec 100%); border:1px solid #e0d8cb; border-radius:12px; box-shadow:0 2px 6px rgba(0,0,0,.04); text-align:center; padding:14px 10px;">
[[Fichier:Ambox question.svg|28px]]
<div style="margin-top:6px; font-size:84%; color:#6d5f4d;">La barbe de Platon</div>
</div>
[[Dictionnaire de philosophie/Willard Van Orman Quine/Barbe de Platon|<span style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:1;"></span>]]
</div>
« Qu'y a-t-il ? » Le problème de l'ontologie, observe Quine au seuil de « De ce qui est »<ref>W. V. O. Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', trad. sous la dir. de Sandra Laugier, Paris, Vrin, 2003 (éd. originale ''From a Logical Point of View'', Cambridge (Mass.), Harvard University Press, 1953). La « barbe de Platon » et l'énigme du non-être ouvrent l'essai (''From a Logical Point of View'', ci-après ''FLPV'', p. 2) ; le débat avec Wyman et le « bidonville des possibles » figurent p. 4.</ref>, a ceci de curieux qu'il s'énonce en trois mots et se résout en un seul : il y a tout ce qu'il y a. Chacun l'accordera. Le désaccord ne porte jamais sur cette formule vide, mais sur les cas. Or les cas suscitent une difficulté logique que Quine met en scène par une petite comédie philosophique. Supposons que deux penseurs, qu'il nomme McX et lui-même, divergent sur l'[[Dictionnaire de philosophie/Existence|existence]] de quelque chose. McX affirme qu'il y a une certaine entité ; Quine le nie. Comment Quine peut-il seulement formuler son désaccord ? S'il dit « il y a une chose que McX admet et que je rejette », il se contredit, car il vient d'admettre l'existence de ce qu'il prétendait refuser. Le partisan du non semble condamné à ne pouvoir dire ce qu'il nie.
C'est l'antique énigme du non-être : le non-être doit en quelque façon être, sinon qu'est-ce donc qui n'est pas ? Quine surnomme cette doctrine enchevêtrée « la barbe de Platon », tant elle a, dit-il, émoussé le rasoir d'Occam. Elle pousse certains à conférer une forme d'être à ce qui n'en a aucune. Prenons Pégase. Si Pégase n'était rien, raisonne McX, nous ne parlerions de rien en prononçant ce nom, et il serait absurde de dire même que Pégase n'est pas ; donc Pégase, en un sens, est. Pressé d'en dire davantage, McX se réfugie dans l'idée que Pégase est « une idée dans les esprits ». Mais c'est confondre le Parthénon avec l'idée du Parthénon. Le Parthénon est de pierre, visible ; l'idée du Parthénon est mentale, invisible. Nul ne les confond. Quand nous nions Pégase, ce n'est pas une image mentale que nous nions, c'est un cheval ailé de chair et de sang dont nous disons qu'il n'existe nulle part.
Un esprit plus subtil, que Quine appelle Wyman, soutient que Pégase « subsiste » comme un possible non actualisé. Dire que Pégase n'existe pas reviendrait seulement à dire qu'il n'a pas l'attribut d'actualité, comme on dirait que le Parthénon n'est pas rouge. Cette manœuvre peuple l'univers d'une foule d'êtres fantomatiques. Quine en montre l'incohérence par une série de questions désopilantes. Combien d'hommes possibles se tiennent dans cette embrasure de porte ? Le gros possible et le chauve possible sont-ils le même, ou deux ? Y a-t-il plus de minces possibles que de gros ? Sont-ils tous distincts, ou bien deux choses qui se ressemblent en tout ne font-elles qu'une ? À ces possibles inactuels, on ne sait même pas appliquer la notion d'identité. Et que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ? Le « bidonville des possibles » est, conclut Quine, un foyer d'éléments désordonnés. Mieux vaut le raser.
=== La leçon de Russell : décrire au lieu de nommer ===
La sortie de cette impasse, Quine la trouve dans la théorie russellienne des descriptions définies, qu'il tient pour un modèle d'analyse. Le piège tenait à ce que nous traitions « Pégase » comme un nom, un terme qui, pour avoir un sens, devrait désigner un objet. Russell avait montré comment se passer de cette supposition. Au lieu de « Pégase n'existe pas », qui paraît présupposer Pégase, paraphrasons : « il n'existe rien qui soit à la fois ailé, chevalin et unique en son genre. » L'énoncé devient une quantification existentielle niée : il n'y a aucun x tel que x soit Pégase. Le nom embarrassant a disparu, dissous dans un jeu de variables et de quantificateurs ; et il ne reste plus, pour porter un poids ontologique, que ce sur quoi nous quantifions. La phrase peut être fausse, c'est-à-dire nier l'existence de quelque chose, sans présupposer cette existence. L'énigme du non-être s'évanouit avec la grammaire qui l'avait engendrée.
De là résulte un déplacement capital. Ce ne sont pas les noms qui engagent une théorie à l'existence de quoi que ce soit, car tout nom peut être analysé à la façon de « Pégase ». Le poids ontologique se concentre dans les variables liées par les quantificateurs « il existe un… » et « pour tout… ». Dire « il existe quelque chose qui est un chien » suffit à s'engager sur les chiens, sans qu'on ait à les nommer. C'est pourquoi Quine peut soutenir que la prédication, plus que la dénomination, fait le fond de la référence : un prédicat comme « est humain » s'applique à Socrate, à Platon, à d'autres, et ce sont là précisément les valeurs que doivent prendre les variables pour que les énoncés où figure ce prédicat soient vrais.
=== « Être, c'est être la valeur d'une variable liée » ===
De ce constat naît le critère de l'engagement ontologique, ramassé dans une formule devenue célèbre : « Être, c'est être la valeur d'une variable liée. »<ref>La formule « être, c'est être la valeur d'une variable » (« To be is to be the value of a variable ») se trouve dans « De ce qui est » (''FLPV'', p. 15).</ref> L'univers des entités, écrit Quine, est l'étendue des valeurs des variables. Pour savoir à quels objets une théorie s'engage, il ne faut pas examiner les noms ni les prédicats qu'elle emploie, mais demander quelles entités doivent figurer parmi les valeurs de ses variables pour que ses énoncés soient vrais. Une variable, suggère-t-il par une image éclairante, est une sorte de pronom : « x » fonctionne comme le « il » d'une langue, terme provisoirement indéterminé qui attend, dans le champ d'un quantificateur, de se voir attribuer des valeurs.
Ce critère a une vertu de clarté. Il transforme une question métaphysique notoirement floue, « qu'est-ce qui existe ? », en une question précise sur la forme logique de nos théories, « sur quoi cette théorie quantifie-t-elle ? ». Encore faut-il, pour le mettre en œuvre, disposer d'une langue régimentée. Une phrase du langage ordinaire est souvent trop équivoque pour qu'on lise à même elle ses présuppositions. Quine propose donc de la reformuler dans une notation canonique : celle de la logique des prédicats du premier ordre, avec ses variables, ses quantificateurs et ses fonctions de vérité. Cette régimentation n'est pas une description de la langue naturelle, mais une réforme, entreprise au nom de la clarté et de l'économie. Une fois la théorie ainsi mise au net, ses engagements se lisent à livre ouvert : ce sont les objets sur lesquels portent ses variables liées. Il importe de ne pas se méprendre sur la portée de ce critère. Il ne tranche pas, par lui-même, ce qui existe ; il dit seulement à quoi une théorie s'engage lorsqu'on la tient pour vraie et qu'on l'a reformulée en langue logique. Le critère n'est pas un oracle métaphysique, mais une méthode pour lire les engagements d'une théorie déjà admise ou mise à l'examen. Reste ensuite la question, distincte, de savoir quelle théorie nous avons les meilleures raisons d'accepter.
Reste à savoir ce que Quine, pour sa part, accepte d'inscrire à l'inventaire du monde. Sa réponse penche vers la sobriété : des objets physiques, entendus largement comme les contenus matériels de régions de l'espace-temps, fussent-elles discontinues, et, parce que la science, et en particulier les mathématiques, ne peut s'en passer, des classes, c'est-à-dire des ensembles, admis pour leur puissance théorique autant que pour la netteté de leurs critères d'identité. Les premiers fournissent l'ameublement concret ; les secondes, l'ossature abstraite sans laquelle on ne peut formuler les lois quantitatives de la physique. Quine résiste en revanche aux propriétés, aux significations et aux propositions, qu'il tient pour des entités intensionnelles mal individuées. Sa raison est toujours la même, et elle a valeur de maxime : « pas d'entité sans identité. »<ref>La maxime « pas d'entité sans identité » (« No entity without identity ») est formulée dans « Parler d'objets » (« Speaking of Objects »), repris dans ''Relativité de l'ontologie et autres essais'', trad. Jean Largeault, Paris, Aubier-Montaigne, 1977 (''Ontological Relativity and Other Essays'', ci-après ''OR'', New York, Columbia University Press, 1969, p. 23).</ref> Une entité n'est admissible que si l'on peut dire à quelle condition elle est identique à une autre ou en diffère. Les classes satisfont à cette exigence, car deux classes sont identiques si et seulement si elles ont les mêmes éléments. Les propriétés n'y satisfont pas : nul critère ne dit quand « avoir un cœur » et « avoir des reins », vrais des mêmes êtres, expriment une seule propriété ou deux. Faute d'identité, point d'entité ; et c'est tout un pan de l'ontologie traditionnelle qui se trouve congédié au nom de cette discipline.
== Les deux dogmes de l'empirisme ==
Paru en 1951, « Deux dogmes de l'empirisme » est sans doute l'un des articles les plus lus et les plus discutés de la philosophie analytique.<ref>W. V. O. Quine, « Deux dogmes de l'empirisme », dans ''Du point de vue logique'', éd. citée (« Two Dogmas of Empiricism », ''FLPV'', p. 20-46). L'article parut d'abord dans ''The Philosophical Review'' en janvier 1951.</ref> Quine y dénonce deux croyances que l'empirisme moderne partageait sans les interroger : la distinction entre énoncés analytiques et énoncés synthétiques, et le réductionnisme, c'est-à-dire l'idée que chaque énoncé, pris à part, possède un contenu empirique propre. Ces deux dogmes, montre-t-il, sont liés à la racine, et leur abandon transforme la figure de l'empirisme.
=== Le premier dogme : la distinction analytique et synthétique ===
L'opposition vient de loin. Kant distinguait les jugements analytiques, où le concept du prédicat est déjà contenu dans celui du sujet (« tous les corps sont étendus »), des jugements synthétiques, qui ajoutent au sujet une information nouvelle (« tous les corps sont pesants »). Les empiristes logiques avaient repris la distinction sous une forme linguistique : est analytique l'énoncé vrai en vertu des seules significations des mots qui le composent, indépendamment de tout fait du monde. « Aucun célibataire n'est marié » serait de ce type : il suffit de comprendre les mots pour en reconnaître la vérité. Cette catégorie était précieuse, car elle offrait un asile aux vérités de la logique et des mathématiques. Si ces vérités sont analytiques, on peut les tenir pour certaines et nécessaires sans renoncer au principe empiriste selon lequel tout savoir procède de l'expérience : elles ne disent rien sur le monde, elles explicitent notre langage.
Quine ne conteste pas qu'il existe des énoncés que tout le monde range spontanément du côté de l'analytique. Il conteste qu'on puisse rendre cette notion claire. Sa stratégie consiste à demander qu'on lui explique « analytique » sans tourner en rond. Une première classe d'énoncés analytiques, les vérités logiques au sens strict comme « aucun homme non marié n'est marié », ne pose pas de problème : elles restent vraies sous toute réinterprétation de leurs termes non logiques. La difficulté commence avec la seconde classe, celle de « aucun célibataire n'est marié », qui ne devient une vérité logique que si l'on remplace « célibataire » par son synonyme « homme non marié ». Tout repose alors sur la notion de synonymie, c'est-à-dire d'identité de signification. Or qu'est-ce que la synonymie ? Si l'on répond qu'elle se fonde sur les définitions, Quine objecte que les définitions du dictionnaire ne font que consigner des synonymies déjà admises : le lexicographe rapporte un usage, il ne le crée pas, sauf dans le cas particulier de la stipulation explicite. Si l'on répond que deux termes sont synonymes lorsqu'ils sont interchangeables partout sans changer la valeur de vérité, Quine montre que ce critère, dans un langage extensionnel, ne garantit que la coextensivité, non l'identité de signification ; et que, pour exclure les coïncidences accidentelles, on doit faire appel à une notion de nécessité, laquelle reconduit en sous-main à l'analyticité que l'on cherchait à définir. Le cercle se referme : analyticité, synonymie, définition, nécessité forment une famille de notions qui se renvoient les unes aux autres sans qu'aucune prenne pied hors du cercle.
On objectera qu'il suffit de poser des règles sémantiques, comme le proposait Carnap, qui spécifieraient pour un langage donné quels énoncés y sont analytiques. Quine répond que cela déplace la difficulté sans la résoudre. Une liste de règles nous apprend quels énoncés sont appelés analytiques dans tel langage artificiel ; elle ne nous apprend pas ce que signifie le mot « analytique » lui-même, ce que ces énoncés ont en commun qui justifierait l'étiquette. On nous explique « analytique-dans-le-langage-L », pour un L particulier, mais non l'adjectif « analytique » en général, qui seul nous intéresse. La notion demeure, selon le mot de Quine, un article de foi métaphysique au cœur même de l'empirisme.
Il faut se garder, sur ce point, d'une lecture trop tranchée. Quine ne nie pas qu'il existe des énoncés que l'usage range du côté de l'analytique, ni qu'on puisse, dans un langage construit, fixer par convention quels énoncés y seront tenus pour tels. Le Quine tardif va plus loin : dans ''Les racines de la référence'' (1974), il propose même un critère comportemental de l'analyticité, un énoncé étant analytique lorsque tout locuteur en apprend la vérité en même temps qu'il apprend les mots qui le composent. Selon ce critère, « aucun célibataire n'est marié » et l'essentiel de la logique élémentaire ressortissent bien à l'analytique. Ce que Quine combat n'est donc ni l'analyticité ordinaire ni l'analyticité réglée d'un langage formel, mais une troisième notion, plus ambitieuse : celle qui prétendrait fonder en raison la nécessité des mathématiques et tracer entre l'a priori et l'empirique la frontière étanche dont Carnap avait besoin. Cette analyticité forte, son critère ne la livre pas, car les mathématiques n'en relèvent pas. C'est elle, et elle seule, que « Deux dogmes » entreprend de dissoudre.<ref>Sur le critère tardif de l'analyticité, voir W. V. O. Quine, ''The Roots of Reference'', La Salle, Open Court, 1974, p. 78-80 (ouvrage non traduit en français), et l'analyse de Richard Creath, « Quine on the Intelligibility and Relevance of Analyticity », dans ''The Cambridge Companion to Quine'', éd. citée, p. 47-64.</ref>
=== Le second dogme : le réductionnisme ===
Le second dogme est le réductionnisme, sous sa forme moderne : la croyance que tout énoncé doué de sens est traduisible en un énoncé portant sur l'expérience immédiate, ou du moins qu'à chaque énoncé est associé un domaine d'expériences qui le confirmeraient et un autre qui l'infirmeraient. C'est la version de la théorie vérificationniste de la signification qui rattache le contenu d'une phrase aux observations qui la vérifient. Quine fait observer que ce dogme est le pendant du premier. Car si chaque énoncé avait son contenu empirique propre, on pourrait définir l'analyticité comme le cas limite : serait analytique l'énoncé dont le contenu empirique est vide, qui se confirme quoi qu'il arrive. Les deux dogmes sont, dit-il, identiques à la racine.
Or le réductionnisme ne résiste pas à l'examen. Quine y oppose un argument qu'il emprunte au physicien et historien des sciences Pierre Duhem : on ne peut pas soumettre à l'expérience une hypothèse isolée. Quand une prédiction tirée d'une théorie se trouve démentie, l'expérience ne nous dit pas quel énoncé est en faute. Elle frappe la théorie comme un tout, et c'est à nous de répartir le blâme. Nous pouvons abandonner l'hypothèse mise à l'épreuve, mais nous pouvons aussi mettre en cause une loi auxiliaire, une condition initiale, un principe de l'instrument de mesure, voire, en dernier recours, une règle de la logique. Aucun énoncé ne se présente seul devant le tribunal de l'expérience. Il n'y a donc pas de contenu empirique attaché à l'énoncé pris isolément ; ce contenu n'appartient qu'à des ensembles d'énoncés, et, à la limite, à la science tout entière. L'unité de signification empirique n'est pas la phrase, mais le système. Voilà qui prive le réductionnisme de son objet et, du même coup, ruine l'espoir de définir l'analyticité comme degré zéro du contenu empirique. En tombant, le second dogme entraîne le premier.
== Le holisme et la révision des croyances ==
Une fois les deux dogmes écartés, l'empirisme prend un autre visage, que Quine peint dans la dernière partie de « Deux dogmes » à l'aide d'une image souvent reprise. La totalité de notre savoir, des vérités les plus quotidiennes de la géographie aux lois de la physique atomique et jusqu'aux théorèmes de la logique, forme un tissu fait de main d'homme qui ne touche l'expérience que par ses bords. Ou, pour changer de figure, la science tout entière est comme un champ de forces dont les conditions aux limites sont l'expérience. Un conflit avec l'expérience, à la périphérie, oblige à des réajustements à l'intérieur du champ : il faut redistribuer des valeurs de vérité sur certains de nos énoncés. Mais le champ est si lâchement déterminé par ses bords que nous gardons une large latitude quant aux énoncés à réviser à la lumière d'une expérience contraire donnée. Aucune expérience particulière n'est liée à un énoncé particulier de l'intérieur du champ, sinon de façon indirecte, par les exigences d'équilibre qui affectent le champ comme un tout.<ref>« Deux dogmes de l'empirisme », sixième section, « L'empirisme sans les dogmes » : le « tissu fait de main d'homme » et le « champ de forces » sont décrits p. 42, « aucun énoncé n'est à l'abri d'une révision » p. 43, les « dieux d'Homère » p. 44 et le « pragmatisme plus poussé » p. 46 (''FLPV'', éd. citée).</ref>
De cette image se déduisent les deux formules les plus frappantes de l'article. Premièrement : tout énoncé peut être tenu pour vrai quoi qu'il arrive, pourvu que nous fassions des ajustements assez énergiques ailleurs dans le système. Même un énoncé proche de la périphérie peut être maintenu en dépit d'une expérience récalcitrante, en plaidant l'hallucination ou en retouchant certaines des lois dites logiques. Deuxièmement, et inversement : aucun énoncé n'est à l'abri d'une révision. On a même proposé de réviser la loi logique du tiers exclu pour simplifier la mécanique quantique ; et quelle différence de principe y a-t-il entre un tel changement et celui par lequel Kepler a supplanté Ptolémée, ou Einstein Newton, ou Darwin Aristote ? Les énoncés de la logique et des mathématiques ne jouissent d'aucune immunité spéciale ; ils occupent seulement une position centrale dans le réseau, loin des bords, là où peu de connexions avec une expérience particulière s'imposent. C'est pourquoi nous hésitons davantage à les abandonner : leur révision aurait des répercussions étendues. Cette résistance est affaire de degré, non de nature.
Ce holisme renverse la hiérarchie héritée. Il n'y a plus de partage tranché entre des [[Dictionnaire de philosophie/Croyance|croyances]] purement empiriques, qui affronteraient seules l'expérience, et des vérités purement formelles, qui en seraient à l'abri. Toutes nos croyances tiennent ensemble par leurs liens logiques, et c'est l'ensemble qui se confronte au monde. Les énoncés de la logique, des mathématiques, de l'ontologie, sont au cœur du réseau ; ceux de l'histoire et de la perception, à sa marge. Mais ce ne sont là que des positions relatives sur une même étoffe, non des espèces hétérogènes.
Pour rendre ces distances tangibles, Quine recourt à des exemples ordinaires. Qu'une expérience nous surprenne, et, selon les cas, nous y ferons face en corrigeant l'énoncé qu'il y a des maisons de brique dans telle rue, ou bien l'énoncé qu'il n'existe pas de centaures. De tels énoncés ont une référence empirique aiguë : ils touchent presque au bord du tissu. Les énoncés de la physique des particules, des mathématiques ou de l'ontologie, eux, gisent au centre, non parce qu'ils échapperaient à l'expérience, mais parce qu'aucune sensation particulière ne s'y noue de façon saillante. C'est pourquoi nous révisons d'abord les premiers : non par contrainte logique, mais par souci de troubler l'ensemble le moins possible.<ref>L'exemple des maisons de brique et des centaures illustre la « référence empirique aiguë » de certains énoncés (« Deux dogmes de l'empirisme », ''FLPV'', éd. citée, p. 43-44).</ref>
Quine en tire une conséquence sur le statut des objets eux-mêmes. Les objets physiques, écrit-il, sont introduits dans notre conception comme des intermédiaires commodes, non par définition à partir de l'expérience, mais à titre de simples postulats, comparables, sur le plan de la connaissance, aux dieux d'Homère. La comparaison est calculée pour choquer, et Quine en précise aussitôt la portée. Lui-même croit aux objets physiques et non aux dieux d'Homère, et il tient pour une erreur scientifique de croire le contraire. Mais quant à leur statut épistémologique, les uns et les autres ne diffèrent que par degré : tous deux entrent dans notre conception comme des entités posées par la culture. Le mythe des objets physiques l'emporte sur les autres en ceci qu'il s'est révélé plus efficace qu'eux pour ménager une structure maniable dans le flux de l'expérience. Postuler des corps, des atomes, des forces, des classes, c'est se donner des instruments d'organisation et de prédiction ; la science continue en cela le geste du sens commun, qui gonfle l'ontologie pour simplifier la théorie.
Deux notions complètent ce tableau et l'éloignent du relativisme facile auquel on le réduit parfois. La première est la sous-détermination des théories par l'expérience : pour un même corps de données possibles, plusieurs théories rivales, incompatibles entre elles, peuvent rendre compte également bien des observations. Les bords du champ ne fixent pas son intérieur. La seconde est que ce jeu n'est pas arbitraire. Quand l'expérience nous contraint à retoucher notre système, deux forces guident notre choix : un conservatisme qui nous porte à déranger le système le moins possible, et une quête de simplicité qui nous fait préférer les hypothèses les plus économiques. Carnap, Lewis et d'autres adoptaient une attitude pragmatique pour le choix entre formes de langage, mais leur pragmatisme s'arrêtait à la frontière supposée de l'analytique et du synthétique. En supprimant cette frontière, Quine étend le pragmatisme à toute la science : chacun reçoit un héritage scientifique et un flux continu de stimulations sensorielles, et les considérations qui le guident, lorsqu'il ajuste cet héritage à ces stimulations, sont, dans la mesure où elles sont rationnelles, pragmatiques. L'empirisme sans les dogmes devient un pragmatisme plus conséquent, attentif à la fois à l'expérience, qui contraint, et à la cohérence du système, qui oriente.
Quine a tempéré, avec le temps, la version forte de 1951. Dans « Two Dogmas in Retrospect » (1991), il reconnaît que faire comparaître la science tout entière à chaque épreuve allait au-delà de ce qu'exigeait sa critique du réductionnisme. Il parle désormais d'un holisme modéré. Ce qui affronte l'expérience, ce ne sont pas des énoncés isolés ; mais ce n'est pas non plus la totalité de nos croyances : ce sont des ensembles d'énoncés assez vastes pour impliquer des prédictions observables, ce qu'il nomme des « masses sémantiques critiques ». Le principe demeure, intact : aucun énoncé n'est en droit à l'abri d'une révision. En fait, pourtant, l'épreuve porte sur des fragments de théorie, non sur le système entier à chaque instant. Quine en tire même une explication de la nécessité mathématique qui se passe d'analyticité : si l'énoncé mis en cause est purement mathématique, nous nous gardons de le réviser, car y toucher ébranlerait trop le reste de la science. C'est ce qu'il appelle la maxime de mutilation minimale. Dans ce cadre, la nécessité mathématique tient à la position centrale des mathématiques dans notre système et à notre politique rationnelle de porter ailleurs les révisions, sauf coût théorique exceptionnel.<ref>W. V. O. Quine, « Two Dogmas in Retrospect », ''Canadian Journal of Philosophy'', vol. 21, 1991, p. 265-274 (ici p. 269-270) ; voir aussi ''La poursuite de la vérité'', éd. citée, chap. 1. Sur ce holisme modéré et la « masse sémantique critique », voir Roger F. Gibson (dir.), ''The Cambridge Companion to Quine'', Cambridge University Press, 2004, p. 12-13.</ref>
== La traduction radicale et l'indétermination de la signification ==
Le holisme atteignait la théorie de la confirmation. Quine va l'étendre à la théorie de la signification, et c'est l'objet central du ''Mot et la chose'' (1960). Le fil conducteur en est une exigence naturaliste : si le langage est un comportement public, appris par l'enfant au contact d'autrui dans des situations observables, alors tout ce qu'il y a à savoir sur la signification doit pouvoir se lire dans ce comportement et dans les circonstances qui l'accompagnent. Il n'y a pas, dans l'apprentissage et l'usage d'une langue, de matière cachée à laquelle le sujet aurait un accès privé. Cette contrainte, Quine la met à l'épreuve par une expérience de pensée qu'il a rendue fameuse : la traduction radicale.
=== Le linguiste de terrain ===
[[Fichier:European Rabbit 09 05 2025 02.jpg|vignette|upright=1.15|« Gavagai. » Un lapin détale, l'indigène prononce ce mot, le linguiste note « Lapin ». Mais rien dans la scène ne décide si le terme indigène vise un lapin entier, un segment temporel de lapin, ou un agrégat de parties non détachées de lapin.]]
Imaginons un linguiste qui aborde une langue jusqu'alors inconnue, sans interprète, sans dictionnaire, sans la moindre passerelle avec une langue déjà comprise. Tout ce dont il dispose, ce sont les sons que prononcent les indigènes et les circonstances visibles où ils les prononcent. C'est la situation de la traduction radicale, où l'on doit tout reconstruire à partir du seul comportement. Un lapin détale, l'indigène dit « Gavagai », et le linguiste inscrit provisoirement « Lapin » comme traduction. Pour étayer cette conjecture, il guette les occasions : il prononce lui-même « Gavagai ? » dans diverses situations et note si l'indigène marque son assentiment, son refus, ou ni l'un ni l'autre. À force d'observations, il accumule des indices et finit par tenir « Gavagai » pour synonyme de « Lapin ».
Ce que le linguiste peut établir ainsi, Quine le nomme la signification stimulante (stimulus meaning) d'une phrase d'occasion : l'ensemble des stimulations sensorielles qui disposeraient l'indigène à donner son assentiment, et l'ensemble de celles qui provoqueraient son refus. Il importe de penser ce qui déclenche l'assentiment comme une stimulation, non comme le lapin lui-même : la stimulation reste la même si l'on remplace l'animal par un leurre habile, et elle change si l'on bouche les yeux de l'indigène. Sur cette base étroite, Quine reconnaît que certains énoncés se laissent traduire avec une assurance suffisante. Ce sont les énoncés d'observation, dont l'assentiment est étroitement commandé par la stimulation présente, et qui constituent le point d'ancrage de la langue dans le monde. « Gavagai » et « Voici un lapin » sont, en ce sens limité, synonymes stimulants : ils commandent l'assentiment dans les mêmes circonstances.
=== Le lapin, ses parties et sa lapinité ===
Il faut ici dissiper une confusion fréquente, car l'exemple du lapin sert en réalité deux thèses voisines mais distinctes. Comme phrase d'observation, « Gavagai » se laisse traduire avec assurance : sa signification stimulante est déterminée, et « Voici un lapin » en est un bon équivalent. La difficulté surgit au niveau du terme. La première thèse, l'inscrutabilité de la référence, porte précisément sur les termes, sur ce que désigne le mot « gavagai » pris à part. La seconde, l'indétermination de la traduction proprement dite, est plus large : elle porte sur les phrases, et surtout sur les énoncés éloignés de l'observation, dont rien ne fixe la traduction même lorsque celle des termes serait arrêtée. Le doute entre le lapin, ses parties et ses phases relève de la première ; il en offre l'image la plus parlante, mais on aurait tort d'y réduire la seconde.
Voici le ressort de l'argument. L'accord sur la signification stimulante de « Gavagai » comme phrase ne garantit nullement que « gavagai » et « lapin » soient des termes coextensifs, vrais des mêmes choses. Car que désigne au juste « gavagai » ? Peut-être des lapins ; mais peut-être de simples segments temporels de lapins, de brèves tranches de leur durée ; ou encore l'ensemble des parties non détachées de lapins ; ou même la fusion de tous les lapins en une seule portion discontinue de l'espace-temps ; ou enfin la lapinité, ce trait universel partout où un lapin se manifeste. Dans tous ces cas, la signification stimulante serait la même. Pointer un lapin, c'est aussi bien pointer une de ses parties, un de ses instants, la fusion à laquelle il appartient, le lieu où la lapinité s'incarne. Aucune ostension, aucune désignation par le doigt ne tranche entre ces lectures, car ce qui les distingue n'est pas dans la ressemblance des stimulations, mais dans l'anatomie des phrases : dans la manière dont la langue manie l'identité, la pluralité, les articles, ce que Quine appelle l'appareil de la référence.
Or cet appareil, le linguiste ne peut le mettre en évidence qu'en posant des hypothèses sur la façon dont la langue indigène rend nos propres procédés : nos pronoms, notre copule, notre « est le même que ». Ces hypothèses, que Quine nomme hypothèses analytiques, vont au-delà de tout ce que la signification stimulante autorise. Elles sont indispensables pour passer de la traduction des phrases d'occasion à celle des termes, mais rien dans le comportement ne les impose. Le linguiste peut équivaloir « gavagai » à « lapin », ou à « segment de lapin », ou à « partie non détachée de lapin », et compenser ce choix en ajustant la traduction de l'identité et des particules associées, sans jamais entrer en conflit avec les significations stimulantes. La référence des termes étrangers reste, selon le mot de Quine, inscrutable. Les phrases d'occasion et la signification stimulante sont une monnaie commune ; les termes et la référence, eux, sont propres à notre schème conceptuel.<ref>W. V. O. Quine, ''Le mot et la chose'', § 12, trad. Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977 (''Word and Object'', Cambridge (Mass.), The MIT Press, 1960). Le lapin, ses segments, ses parties non détachées et la lapinité, ainsi que la remarque selon laquelle « l'inscrutabilité tient non à la ressemblance, mais à l'anatomie des phrases », occupent le § 12 (p. 51-53 de l'éd. de 1960).</ref>
=== Le mythe du musée ===
Derrière cet argument, Quine vise une certaine image de la signification, qu'il appelle le mythe du musée. Selon cette image, les significations seraient à nos expressions ce que les tableaux exposés dans un musée sont à leurs étiquettes : des objets fixes, indépendants des langues, que les mots se borneraient à désigner. Deux expressions seraient synonymes lorsqu'elles renvoient à une même signification, comme deux étiquettes pour un seul tableau ; et traduire un mot, ce serait lui trouver, dans une autre langue, l'étiquette qui pend au même tableau, c'est-à-dire à la même signification interlinguistique. Ce que cet argument établit, c'est qu'aucune signification de ce genre, antérieure aux langues et commune à elles, ne vient fixer la traduction. Il n'existe pas de signification de « Gavagai » qui dirait, par-delà tout comportement, s'il faut le rendre par « lapin » ou par « segment de lapin ». La signification n'est pas un objet logé dans un musée mental : elle se réduit à ce que le comportement linguistique, dans ses circonstances, peut exhiber, c'est-à-dire à la signification stimulante, bien plus pauvre que la synonymie pleine que les philosophes lui prêtaient.<ref>Le « mythe du musée », où « les pièces exposées sont des significations et les mots, des étiquettes », ouvre « La relativité de l'ontologie », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Ontological Relativity », ''OR'', p. 27).</ref>
=== L'indétermination de la traduction ===
De là procède la thèse de l'indétermination de la traduction. Deux linguistes, travaillant indépendamment sur la même langue, pourraient produire deux manuels de traduction, chacun cohérent avec la totalité du comportement verbal observable, et pourtant inconciliables entre eux : là où l'un rendrait une phrase d'une certaine façon, l'autre la rendrait d'une façon que le premier rejetterait. Aucun fait, pas même la totalité des dispositions verbales des locuteurs, ne permettrait de dire lequel a raison, car il n'y a pas, en ce domaine, de fait de l'affaire qui excède le comportement. La traduction n'est pas seulement difficile ou faillible : elle est, en un sens précis, sous-déterminée par tout ce qui pourrait en décider.
Quine insiste sur un point qu'on néglige souvent. S'il a choisi pour théâtre une langue exotique, c'est pour rendre la thèse plausible, à la manière des ''Voyages de Gulliver'' qui éclairent nos mœurs en les transposant dans des contrées étranges. Mais la leçon vaut aussi pour notre propre langue. Étant donné deux manuels rivaux entre la langue de la jungle et la nôtre, nous pouvons traduire perversement notre langue en elle-même, en la faisant passer par la jungle au moyen d'un manuel, puis revenir au moyen de l'autre. L'indétermination n'est pas un accident de l'éloignement ; elle tient à la nature même de la signification. Ce qui se donnait pour un objet bien défini, le sens d'une phrase ou d'un mot, se révèle un mythe dès qu'on exige qu'il rende compte de plus que ce que le comportement public peut porter.
Un écueil guette ici, qu'il faut écarter : confondre cette indétermination avec la sous-détermination des théories physiques rencontrée à propos du holisme. Une théorie de la nature est sous-déterminée parce que les données laissent ouvertes plusieurs descriptions du monde ; mais il y a, sous ces descriptions, un monde à décrire : les théories rivales diffèrent par ce qu'elles disent de la réalité, même si les observations disponibles, voire toutes les observations possibles, ne suffisent pas à les départager. Dans le cas de la traduction, soutient Quine, il n'en va pas ainsi : ce n'est pas que le fait de la signification nous échappe, c'est qu'il n'existe aucun fait à atteindre. L'indétermination n'est pas une ignorance, mais une absence. C'est en ce point précis que la thèse heurte le sens commun, et que ses adversaires la jugent tantôt triviale, tantôt incroyable.<ref>Sur l'idée qu'il n'y a, en matière de signification, aucun fait à connaître, voir « Parler d'objets » (''OR'', éd. citée, p. 5) et ''Le mot et la chose'', § 16. Quine précisera la distinction d'avec la sous-détermination dans ''La poursuite de la vérité'', éd. citée, chap. 1.</ref>
== L'inscrutabilité de la référence et la relativité de l'ontologie ==
L'indétermination de la traduction se rapporte aux phrases et à leur sens. Quine isole un autre phénomène, voisin mais distinct, qui touche cette fois la référence des termes : l'inscrutabilité de la référence. Il l'avait déjà rencontré avec « gavagai », où rien ne fixait si le terme renvoyait au lapin, à ses parties ou à sa fusion. Il en donne dans « La relativité de l'ontologie » (1968) une formulation générale, à l'aide de ce qu'il appelle des fonctions de substitution. Soit une théorie quelconque ; remplaçons systématiquement chacun de ses objets par un autre, au moyen d'une correspondance terme à terme. À chaque objet, faisons par exemple correspondre son singleton, c'est-à-dire la classe qui n'a que lui pour élément ; ou bien son complément spatio-temporel, c'est-à-dire tout le reste du monde, lui excepté. Si l'on réinterprète en même temps tous les prédicats de la théorie de manière concertée, l'ensemble des énoncés vrais reste exactement le même, et avec lui la totalité de la matière probante. Du dehors, rien ne distingue la théorie qui parle de lapins de celle qui parle de singletons de lapins. La référence de chaque terme est, en ce sens, indéterminée : on peut faire tourner l'univers des objets sans que la trame des vérités s'en ressente.<ref>W. V. O. Quine, « La relativité de l'ontologie » (''Relativité de l'ontologie et autres essais'', éd. citée). Les fonctions de substitution, qui établissent l'inscrutabilité de la référence, sont introduites ''OR'', p. 47 et suiv.</ref>
Quine en tire une conséquence sur le sens même des questions d'ontologie. Demander, dans l'absolu, quels sont les objets d'une théorie n'a pas de sens. La question ne devient sensée que relativement à un manuel de traduction dans une théorie d'arrière-plan. C'est seulement en rapportant une langue à une autre, prise pour cadre, que l'on peut dire ce dont parle la première ; et cette théorie d'arrière-plan demande à son tour, si on l'interroge, d'être rapportée à une autre. La référence est ainsi relative, comme la position d'un point est relative à un système de coordonnées. Il est vain de demander où se trouve un objet dans l'espace absolu ; on ne peut indiquer sa place que par rapport à un repère. De même, il est vain de demander quels objets une théorie pose en elle-même ; on ne peut le dire que par rapport à un cadre que l'on adopte sans le mettre lui-même en question. Telle est la relativité de l'ontologie.
On évitera un contresens. Quine ne soutient pas que les objets seraient des illusions, ni que tout se vaut. Resté à l'intérieur de notre langue, sans la mettre en balance avec une autre, je parle bel et bien de lapins, de tables et de nombres, et la question « combien de lapins ? » a une réponse déterminée. C'est l'image qu'il propose en disant qu'il faut « rester à bord de son propre langage » et ne pas faire tanguer la barque : tant qu'on n'entreprend pas de traduire son langage en un autre, ou de le permuter sur lui-même, la référence va de soi.<ref>Sur l'image de rester « à bord de son propre langage » sans « faire tanguer la barque », et sur la traduction perverse de l'anglais en anglais, voir « La relativité de l'ontologie » (''OR'', p. 30 et p. 47-48) et ''La poursuite de la vérité'', trad. Maurice Clavelin, Paris, Seuil, 1993.</ref> Elle ne devient inscrutable que lorsqu'on prend du recul, qu'on contemple une réinterprétation globale ou qu'on traduit. Ce que Quine appelle dans ses derniers textes son structuralisme global tient en ceci : ce que nos théories saisissent du monde, c'est une structure, le réseau des rôles imbriqués que remplissent les objets, et non l'identité propre de ces objets pris un à un. « La structure est ce qui importe à la science, écrit-il, non le choix de ses objets. » Ceux-ci ne sont plus alors que des « points neutres » dans l'armature logique de notre théorie, et leur nature intime reste hors d'atteinte. Il faut pourtant se garder d'un dernier malentendu : ce structuralisme n'est pas une thèse sur ce qui existe. Quine ne soutient pas que seules les structures seraient réelles, ni que tout se réduirait à des relations sans termes ; il continue d'admettre des objets, corps et classes. Il soutient seulement qu'aucun fait ne décide lesquels, parmi des objets que l'on peut mettre en correspondance terme à terme, portent vraiment la structure. Sauver la structure, en somme, c'est tout sauver.<ref>« La structure est ce qui importe à la science, non le choix de ses objets » : W. V. O. Quine, « Things and Their Place in Theories », dans ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981, p. 20. Les objets réduits à des « points neutres » dans la structure logique de la théorie : ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995, p. 74-75. Sur le caractère non ontologique de ce structuralisme, qui n'infère pas que seules les structures existent, voir Frederique Janssen-Lauret (dir.), ''Quine, Structure, and Ontology'', Oxford University Press, 2020, notamment l'introduction et le chapitre de Michael Resnik.</ref>
== L'épistémologie naturalisée ==
Le dernier grand déplacement opéré par Quine concerne l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] elle-même. Exposé surtout dans « L'épistémologie naturalisée » (1969)<ref>W. V. O. Quine, « L'épistémologie naturalisée », dans ''Relativité de l'ontologie et autres essais'', éd. citée (« Epistemology Naturalized », ''OR'', p. 69-90). L'épistémologie « comme chapitre de la psychologie », la « contenance réciproque » et le rapport entre « l'entrée maigre et la sortie torrentielle » se trouvent p. 83.</ref>, il consiste à ranger la théorie de la connaissance parmi les sciences de la nature, au rebours d'une tradition qui voulait qu'elle les précède et les fonde.
=== La fin de la philosophie première ===
Depuis [[Dictionnaire de philosophie/René Descartes|Descartes]], l'épistémologie se voulait une philosophie première : une discipline antérieure à la science, chargée d'en assurer les fondements depuis un point d'appui que la science ne fournirait pas. Le projet avait deux versants. Sur le versant doctrinal, il s'agissait de déduire les vérités sur le monde à partir de l'expérience immédiate, avec la certitude de la logique ; c'était la quête cartésienne de la [[Dictionnaire de philosophie/Certitude|certitude]]. Sur le versant conceptuel, il s'agissait de définir les notions de la science à partir des seuls termes d'observation. L'aboutissement le plus accompli de ce second versant est l{{'}}''Aufbau'' de Carnap (1928), qui entreprend de construire le monde comme un édifice logique élevé sur la base des données sensibles.
Quine tient ce projet pour irrémédiablement échoué, et il s'y connaît, lui qui admirait Carnap. Sur le versant doctrinal, l'échec était reconnu de longue date : on ne peut déduire la science de l'expérience, car la plus modeste des généralisations sur l'observable porte sur plus de cas que son auteur n'en a jamais pu observer. La quête de certitude était une cause perdue, héritée de Hume autant que de Descartes. Sur le versant conceptuel, l'entreprise de l{{'}}''Aufbau'' achoppe elle aussi. Carnap ne parvient pas à fournir une réduction par traduction, c'est-à-dire une recette permettant de réécrire chaque énoncé sur le monde en termes d'observation, de logique et de théorie des ensembles. Au point capital, là où il faut assigner des qualités sensibles à des positions dans l'espace et le temps, il ne donne qu'une consigne d'ajustement, révisable au fil de l'expérience, et non une définition. L'idéal d'une réduction du monde à l'expérience demeure hors d'atteinte.
L'échec du fondationnalisme ne signe pourtant pas la mort de l'empirisme. Deux thèses empiristes, souligne Quine, demeurent intactes. La première : toute la matière probante dont dispose la science est de nature sensorielle. La seconde : l'apprentissage du sens des mots repose en dernière instance sur l'expérience sensible. Ce qui s'effondre, c'est l'ambition de déduire la science de cette base ; ce qui subsiste, c'est que la science n'a pas d'autre source d'épreuve que l'irritation de nos surfaces sensorielles. Le naturalisme de Quine n'est donc pas un congé donné à l'empirisme, mais sa reformulation : un empirisme qui renonce au fondement sans renoncer à l'expérience.<ref>« L'épistémologie naturalisée » (''OR'', éd. citée, p. 75) : « toute matière probante de la science est sensorielle » et « l'inculcation du sens des mots repose en dernier ressort sur la matière probante sensorielle ».</ref>
=== Un chapitre de la psychologie ===
Devant cet échec, Quine propose un renversement. Puisque le rêve de déduire la science de l'observation est perdu, pourquoi ne pas se contenter de la psychologie ? Pourquoi ne pas étudier, simplement, comment l'édifice de nos croyances s'élève en fait sur la base des stimulations sensorielles ? On objectait jadis à cette idée un cercle vicieux : si l'épistémologue veut valider les fondements de la science, il se contredit en usant, pour cela, de la science elle-même. Mais ce scrupule, observe Quine, perd toute portée dès qu'on a cessé de vouloir déduire la science de l'observation. Si nous cherchons seulement à comprendre le lien entre l'observation et la théorie, nous avons tout intérêt à mobiliser toute l'information disponible, y compris celle que nous fournit la science même dont nous étudions le rapport à l'observation. La crainte de la circularité n'a de sens que pour qui poursuit encore une fondation ; elle s'évanouit pour qui cherche seulement à comprendre.
L'épistémologie trouve alors une place nouvelle : elle devient un chapitre de la psychologie, et par là de la science de la nature. Elle étudie un phénomène naturel, à savoir un sujet humain physique. On accorde à ce sujet une certaine entrée, contrôlée par l'expérimentateur, sous forme de schémas d'irradiation de ses surfaces sensorielles ; et, le temps venu, le sujet livre en sortie une description du monde extérieur à trois dimensions et de son histoire. La relation entre cette entrée maigre et cette sortie torrentielle est précisément ce que l'épistémologue est conduit à étudier, pour des raisons à peu près semblables à celles qui ont toujours animé sa discipline : voir comment la matière probante se rattache à la théorie, et en quoi notre théorie de la nature déborde toute donnée disponible.
Quine décrit le rapport ainsi obtenu entre l'épistémologie et la science par une formule en forme de boucle : il y a contenance réciproque. L'ancienne épistémologie aspirait à contenir la science, à la construire à partir des données sensibles ; la nouvelle, à l'inverse, est contenue dans la science, comme un chapitre de la psychologie. Mais l'ancienne contenance vaut aussi, à sa manière, car nous étudions comment notre sujet pose des corps et projette sa physique à partir de ses données, et nous comprenons que notre propre position dans le monde ne diffère en rien de la sienne. Notre étude de la connaissance, la psychologie où elle s'inscrit, la science tout entière qui contient cette psychologie : tout cela est notre propre construction, projetée à partir de stimulations semblables à celles que nous administrons au sujet observé. Nul cercle vicieux là-dedans, une fois renoncé au rêve de la déduction : nous cherchons à comprendre la science comme un processus dans le monde, et nous n'exigeons pas que cette compréhension soit plus assurée que la science qui en est l'objet.
Cette attitude, Quine la rattache à une image qu'il emprunte à Otto Neurath et qu'il affectionne : celle du [[Dictionnaire de philosophie/Bateau de Neurath|bateau de Neurath]].<ref>L'image du bateau est empruntée à Otto Neurath ; Quine la place en exergue du ''Mot et la chose'' et la reprend dans « L'épistémologie naturalisée » (''OR'', p. 84) ainsi que dans l'essai « Natural Kinds » (même volume, p. 127).</ref> Nous sommes comme des marins qui doivent réparer leur navire en pleine mer, sans pouvoir le mettre en cale sèche ni le reconstruire à neuf depuis la quille. Nous ne disposons d'aucun sol ferme extérieur à la science d'où la refonder ; nous travaillons toujours du dedans, remplaçant une planche après l'autre tout en restant à flot, en nous appuyant sur le reste de la coque. Il n'y a pas de point d'appui archimédien hors de nos croyances, pas de [[Dictionnaire de philosophie/A priori|donnée première]] soustraite à l'enquête. La philosophie ne surplombe pas la science : elle en fait partie, à la pointe la plus générale et la plus réflexive, mais sans privilège de juridiction. On objectera que naturaliser l'épistémologie, c'est la priver de sa fonction d'évaluation : si elle se borne à décrire comment nous formons nos croyances, que devient la question de savoir lesquelles sont justifiées ? Quine répond, on le verra, que la part normative n'est pas abolie, mais reconduite à l'intérieur de la science, sous la forme de recommandations sur les meilleurs moyens d'atteindre la vérité. Le naturalisme ne supprime pas la norme ; il cesse seulement de la chercher hors de la science.
== Logique, extensionnalisme et critique des modalités ==
Logicien de métier, Quine a soutenu en philosophie de la logique des positions cohérentes avec l'ensemble de son œuvre. La première est un extensionnalisme assumé. Un contexte est dit extensionnel lorsqu'on peut y remplacer un terme par un autre, vrai des mêmes objets, sans changer la valeur de vérité de l'énoncé, et lorsqu'on peut y substituer à une phrase toute phrase de même valeur de vérité. La logique classique des prédicats est extensionnelle ; elle ne connaît que les objets, leurs classes et la vérité ou la fausseté des énoncés. Quine y voit le langage le plus clair que nous ayons, et il refuse d'en sortir sans nécessité. Ce refus a une cible précise : les entités intensionnelles, c'est-à-dire les significations, les propositions et les propriétés, qui peuplent les contextes où la substitution échoue. On a vu pourquoi il les écarte : faute de critère d'identité, ces entités ne satisfont pas à la règle « pas d'entité sans identité ».
=== L'opacité des contextes modaux ===
C'est sur ce terrain que se joue la critique quinienne de la logique modale, celle qui ajoute à la logique les opérateurs « il est nécessaire que » et « il est possible que ». Quine ne conteste pas la logique modale comme calcul formel ; il conteste qu'on puisse l'interpréter de façon intelligible dès qu'on y fait entrer des quantificateurs. Son argument procède d'un exemple resté classique. Considérons les deux énoncés : « il est nécessaire que neuf soit plus grand que sept » et « il est nécessaire que le nombre des planètes soit plus grand que sept ». Le premier paraît vrai, les vérités de l'arithmétique passant pour les meilleures candidates à la nécessité. Le second paraît faux, car le nombre des planètes aurait pu être autre : le système solaire aurait pu se former avec moins d'astres. Or, à l'époque où Quine écrit, le nombre des planètes est neuf. On passe donc du premier énoncé au second en remplaçant un terme, « neuf », par un autre qui désigne le même objet, « le nombre des planètes » ; et cette substitution transforme un vrai en un faux. Le contexte modal est ainsi opaque à la référence : ce qui s'y dit ne dépend pas seulement de l'objet désigné, mais de la façon de le désigner.<ref>W. V. O. Quine, « Référence et modalité » (« Reference and Modality »), dans ''Du point de vue logique'', éd. citée : l'exemple du nombre des planètes est introduit ''FLPV'' p. 143, et l'« attitude discriminante » envers les façons de spécifier un objet, censée livrer son « essence », est dénoncée p. 155. Voir aussi « Les trois degrés de l'implication modale » (« Three Grades of Modal Involvement »), dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''The Ways of Paradox and Other Essays'', ci-après ''WP'', New York, Random House, 1966, p. 158 et p. 175).</ref>
Tant qu'on s'en tient à une modalité de dicto, qui porte sur des énoncés tout entiers, Quine concède qu'on peut donner un sens à ces tournures, en traitant la nécessité comme un prédicat attaché à des phrases plutôt qu'à des choses : « la phrase neuf est plus grand que sept est nécessaire ». La difficulté surgit quand on veut quantifier dans le contexte modal, c'est-à-dire affirmer une modalité de re, qui porte sur la chose elle-même : « il existe un objet qui est nécessairement plus grand que sept ». Une telle affirmation prétend qu'un objet possède une certaine propriété nécessairement, en lui-même, indépendamment de la manière dont on le spécifie. Or cela suppose, soutient Quine, ce qu'il nomme avec ironie l'essentialisme aristotélicien : la doctrine selon laquelle, parmi les propriétés vraies d'une chose, certaines lui appartiennent par essence et d'autres par accident, abstraction faite de toute description.
=== Le mathématicien cycliste ===
Pour faire sentir ce qu'il tient pour une perplexité légitime, Quine forge dans ''Le mot et la chose'' un exemple devenu un cas d'école. On dira peut-être que les mathématiciens sont nécessairement rationnels et non nécessairement bipèdes, tandis que les cyclistes sont nécessairement bipèdes et non nécessairement rationnels. Soit. Mais que dire d'un individu qui compte parmi ses occupations à la fois les mathématiques et la bicyclette ? Cet homme concret est-il nécessairement rationnel et accidentellement bipède, ou l'inverse ? La question, juge Quine, n'admet pas de réponse, et ne devrait pas en admettre.<ref>W. V. O. Quine, ''Le mot et la chose'', § 41 (''Word and Object'', éd. citée, p. 199).</ref> Car la rationalité ne lui revient nécessairement qu'en tant qu'on le considère comme mathématicien, et la bipédie qu'en tant qu'on le considère comme cycliste ; rapportées à l'objet nu, sans description privilégiée, ces nécessités s'évanouissent. L'essentialisme exige qu'on tienne pour mieux révélatrices de l'essence certaines manières de spécifier un objet, et pour trompeuses les autres. Cette préférence, Quine la trouve injustifiable, et la nécessité de re qui s'y appuie, à peine intelligible.
=== Attitudes propositionnelles et nécessité ===
La même opacité affecte les contextes de croyance, que Quine range parmi les attitudes propositionnelles. « Œdipe veut épouser Jocaste » peut être vrai quand « Œdipe veut épouser sa mère » est faux, alors même que Jocaste est sa mère. Là encore, la substitution de termes coréférents échoue, et pour la même raison : ce qui est en jeu n'est pas seulement l'objet, mais la façon dont il est présenté à l'esprit du croyant. Quine en conclut que ces tournures, indispensables à la vie ordinaire, résistent à une analyse extensionnelle et qu'il faut, en science rigoureuse, soit les paraphraser, soit s'en passer.
Il faut signaler que ces réserves n'ont pas eu le dernier mot. À partir de « La logique des noms propres » (''Naming and Necessity'') de Saul Kripke et de la sémantique des mondes possibles, une partie de la philosophie a réhabilité la nécessité de re, l'essentialisme et même la notion de vérité nécessaire connue a posteriori. Là où Quine voyait une notion à peine compréhensible, ces travaux ont vu un domaine cohérent et fécond. Le débat reste ouvert, et il oppose deux conceptions de la nécessité : pour Quine et l'empirisme logique, la nécessité, si elle a un sens, vient de nous, de notre langage ; pour la tradition issue de Kripke, elle est ancrée dans la nature des choses. Quine considérait cette seconde idée comme un retour à une métaphysique qu'il croyait dépassée.
=== La logique n'est pas vraie par convention ===
Reste la question du statut des vérités logiques elles-mêmes. L'empirisme logique tenait la logique et les mathématiques pour vraies en vertu de [[Dictionnaire de philosophie/Convention|conventions]] linguistiques. Quine, dès « Truth by Convention » (1936) puis dans « Carnap et la vérité logique », a démonté cette thèse par un argument de régression.<ref>W. V. O. Quine, « La vérité par convention » (« Truth by Convention », 1936) et « Carnap et la vérité logique » (« Carnap and Logical Truth »), repris dans ''Les voies du paradoxe et autres essais'', Paris, Vrin, 2011 (''WP'', éd. citée, p. 89 et p. 113-114).</ref> Si les vérités logiques découlaient de conventions explicites, encore faudrait-il, pour en tirer les cas particuliers à partir des règles générales, user de la logique. On ne peut poser par convention l'infinité des vérités logiques qu'en les énonçant sous forme de quelques principes généraux, dont on déduirait les instances ; mais cette déduction présuppose déjà la logique qu'on prétendait fonder. La convention ne saurait donc engendrer la logique sans la supposer. Quine en conclut que les vérités logiques ne sont pas d'une autre nature que les autres : elles occupent simplement la position la plus centrale et la plus générale du réseau de nos croyances, là où nous touchons le moins volontiers, parce qu'y toucher bouleverserait tout le reste.
De là découle une dernière thèse, que résume une formule de sa ''Philosophie de la logique'' : changer de logique, c'est changer de sujet.<ref>W. V. O. Quine, ''Philosophie de la logique'', chap. 6, « Les logiques déviantes », trad. Jean Largeault, Paris, Aubier-Montaigne, 1975 (''Philosophy of Logic'', Cambridge (Mass.), Harvard University Press, 1970, p. 81 ; sur le « prix » d'une logique déviante, p. 86-87).</ref> Qui prétend réviser une loi logique, par exemple en rejetant le tiers exclu, ne réfute pas l'ancienne loi ; il donne un sens nouveau aux connecteurs, et parle désormais d'autre chose. La logique reste révisable en droit, comme tout le reste du tissu de la science, car aucun énoncé n'y est sacré ; mais sa centralité même fait qu'on ne la révise qu'en dernière extrémité, sous la pression d'une simplification d'ensemble assez forte pour le justifier. Le maintien de la logique classique n'est pas, chez Quine, un dogme : c'est le fruit du conservatisme et de la quête de simplicité qui gouvernent toutes nos révisions, sous la conduite de la maxime de mutilation minimale déjà rencontrée. Réviser une loi logique entraînerait une refonte de si grande ampleur du réseau théorique que le coût en serait, presque toujours, hors de proportion avec le gain. Aussi Quine n'a-t-il jamais recommandé les logiques déviantes : il en admet la possibilité de principe, mais sa maxime milite contre elles, sauf bénéfice théorique exceptionnel, comme celui qu'on a cru parfois entrevoir du côté de la mécanique quantique.
== Postérité et discussions ==
[[Fichier:Willard Van Orman Quine on Bluenose II in Halifax NS harbor 1980.jpg|vignette|upright=1|Quine à la barre du Bluenose II, dans le port de Halifax, en 1980. Le goût des cartes et des voyages, né dans l'enfance, ne le quitta jamais et colore son image de la connaissance comme exploration sans sol ferme.]]
L'œuvre de Quine a façonné le paysage de la philosophie analytique de la seconde moitié du XX{{e}} siècle, au point que ses adversaires eux-mêmes argumentent sur le terrain qu'il a déblayé. Son influence se mesure moins à une école constituée qu'à un climat : le naturalisme, devenu pour beaucoup l'atmosphère par défaut de la discipline.
=== Une influence diffuse ===
Donald Davidson a prolongé le projet quinien de la traduction radicale en une théorie de l'interprétation, posant qu'on ne peut comprendre autrui qu'en lui prêtant, par un principe de charité, une rationalité et des croyances pour l'essentiel vraies. Daniel Dennett a fait du naturalisme quinien un instrument pour la philosophie de l'esprit. En philosophie des mathématiques, l'argument dit d'indispensabilité, élaboré avec Hilary Putnam, soutient que nous devons admettre l'existence des objets abstraits, nombres et ensembles, parce que nos meilleures théories physiques en font un usage que l'on ne sait pas éliminer : c'est le critère de l'engagement ontologique appliqué à la science effective. Le programme d'une [[Dictionnaire de philosophie/Épistémologie|épistémologie]] naturalisée a nourri tout un courant de recherche, qui étudie la formation des croyances avec les ressources de la psychologie et des sciences cognitives, et qui a contribué à rapprocher la philosophie de la connaissance des sciences empiriques de l'esprit.
=== La défense de l'analyticité ===
La critique de la distinction analytique et synthétique n'a pas fait l'unanimité. Dans un article resté célèbre, « Pour la défense d'un dogme » (1956), Paul Grice et Peter Strawson objectent que l'exigence quinienne est trop forte.<ref>H. P. Grice et P. F. Strawson, « In Defense of a Dogma », ''The Philosophical Review'', vol. 65, 1956, p. 141-158.</ref> Que l'on ne sache pas définir « analytique » sans cercle ne prouve pas que la notion soit vide : bien des couples de notions s'éclairent mutuellement sans qu'aucune se laisse réduire à autre chose, et les locuteurs compétents s'accordent en fait, de manière stable, sur ce qui relève du sens des mots et sur ce qui relève des faits. Une distinction dont l'usage est partagé et régulier ne saurait être tenue pour illusoire au seul motif qu'elle résiste à la définition explicite. Carnap, de son côté, n'a jamais cédé sur l'analyticité, qu'il jugeait clarifiable pour les langages réglés. Plus tard, des philosophes comme Paul Boghossian ont cherché à reconstruire une notion défendable de vérité fondée sur la signification, et à rouvrir la question de l'a priori que Quine croyait close.
=== Le langage et l'esprit ===
Sur le terrain du langage, Noam Chomsky a opposé à Quine une linguistique d'inspiration tout autre. Là où Quine, héritier du behaviorisme, voulait expliquer l'acquisition du langage par le conditionnement de dispositions verbales observables, Chomsky fait valoir la pauvreté du stimulus : l'enfant maîtrise sa langue bien au-delà de ce que son exposition limitée pourrait lui apprendre, ce qui suppose des structures innées. Chomsky a de plus contesté le statut de l'indétermination de la traduction, y voyant non un phénomène singulier mais un simple cas de la sous-détermination ordinaire de toute théorie par ses données, sans portée philosophique particulière. Quine a maintenu que l'indétermination était d'une autre espèce : non pas notre ignorance d'un fait qui existerait, mais l'absence de tout fait à connaître. Le différend touche à la question de savoir s'il existe, en matière de signification, des faits que nos méthodes ne feraient qu'approcher, ou s'il n'y a là rien à approcher du tout.
=== Le retour de la nécessité et la question des normes ===
On a dit comment Saul Kripke et la nouvelle théorie de la référence ont rouvert, contre les interdits quiniens, le dossier de la nécessité et de l'essence. Une autre objection, plus interne, vise l'épistémologie naturalisée. Si la théorie de la connaissance se réduit à la description psychologique de la façon dont nous formons nos croyances, que devient sa dimension normative, sa fonction d'évaluer ce qui justifie une croyance et ce qui ne la justifie pas ? Jaegwon Kim a soutenu qu'une épistémologie purement descriptive cesse d'être une épistémologie, faute de pouvoir dire ce que nous devrions croire.<ref>Jaegwon Kim, « What is “Naturalized Epistemology”? », ''Philosophical Perspectives'', vol. 2, 1988, p. 381-405.</ref> Quine a répondu que la norme n'est pas abolie, mais reconduite à une visée pratique : l'épistémologie normative devient une sorte de technologie de la recherche de la [[Dictionnaire de philosophie/Vérité|vérité]], qui étudie, à l'intérieur de la science, par quels moyens on prédit le mieux l'expérience. Les règles de la bonne méthode sont des conseils d'ingénieur, ajustés à une fin, et non des décrets d'une raison souveraine antérieure à toute science. La question de savoir si cette réponse suffit demeure l'un des points vifs de la discussion contemporaine.
== Conclusion ==
L'unité de l'œuvre de Quine tient à une attitude plus qu'à un système. C'est l'attitude de qui refuse tout point d'appui extérieur à la science et travaille toujours du dedans, du sein de nos croyances, sans sol ferme ni certitude première. De ce parti pris découlent, par enchaînement, ses thèses les plus discutées : si nul énoncé n'affronte seul l'expérience, alors le partage de l'analytique et du synthétique s'efface, alors la logique perd son immunité, alors la signification se réduit à ce que le comportement public peut porter, alors la connaissance n'a d'autre juge qu'elle-même. La barbe de Platon tombée sous le rasoir, le mythe du musée dissipé, le rêve de la philosophie première abandonné, il ne reste qu'un univers sobre, des objets et des classes, et une science qui se reconstruit en pleine mer comme le bateau de Neurath, planche après planche. On peut tenir cette austérité pour une perte ou pour une libération. Mais on ne fait plus de l'[[Dictionnaire de philosophie/Métaphysique|ontologie]], de l'[[Dictionnaire de philosophie/Épistémologie|épistémologie]] ou de la philosophie du langage sans passer par les questions que Quine a posées, ni sans se situer, fût-ce pour s'en écarter, par rapport aux réponses qu'il a avancées.
== Notes et références ==
{{references|colonnes=2}}
== Bibliographie ==
=== Œuvres de Quine traduites en français ===
* ''Le mot et la chose'' [''Word and Object'', 1960], traduction de Joseph Dopp et Paul Gochet, avant-propos de Paul Gochet, Paris, Flammarion, 1977.
* ''Du point de vue logique. Neuf essais logico-philosophiques'' [''From a Logical Point of View'', 1953], traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.
* ''Relativité de l'ontologie et autres essais'' [''Ontological Relativity and Other Essays'', 1969], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1977.
* ''Philosophie de la logique'' [''Philosophy of Logic'', 1970], traduction de Jean Largeault, Paris, Aubier-Montaigne, 1975.
* ''Méthodes de logique'' [''Methods of Logic'', 1950], traduction de Maurice Clavelin, Paris, Armand Colin, 1973.
* ''Les voies du paradoxe et autres essais'' [''The Ways of Paradox and Other Essays'', 1966], Paris, Vrin, 2011.
* ''La poursuite de la vérité'' [''Pursuit of Truth'', 1990], traduction de Maurice Clavelin, Paris, Seuil, 1993.
* ''Quiddités. Dictionnaire philosophique par intermittence'' [''Quiddities. An Intermittently Philosophical Dictionary'', 1987], traduction de Dominique Goy-Blanquet et Thierry Marchaisse, Paris, Seuil, 1992.
=== Principales œuvres non traduites en français ===
* ''Mathematical Logic'', Cambridge (Mass.), Harvard University Press, 1940.
* ''Set Theory and Its Logic'', Cambridge (Mass.), Harvard University Press, 1963.
* ''The Roots of Reference'', La Salle (Illinois), Open Court, 1974.
* ''Theories and Things'', Cambridge (Mass.), Harvard University Press, 1981.
* ''The Time of My Life. An Autobiography'', Cambridge (Mass.), The MIT Press, 1985.
* ''From Stimulus to Science'', Cambridge (Mass.), Harvard University Press, 1995.
=== Études ===
* {{Ouvrage|langue=en|prénom1=Edward|nom1=Becker|titre=The Themes of Quine's Philosophy|sous-titre=Meaning, Reference, and Knowledge|lieu=Cambridge|éditeur=Cambridge University Press|année=2012}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=Quintessence|sous-titre=Basic Readings from the Philosophy of W. V. Quine|lieu=Cambridge (Mass.)|éditeur=The Belknap Press of Harvard University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Frederique|nom1=Janssen-Lauret|responsabilité1=dir.|titre=Quine, Structure, and Ontology|lieu=Oxford|éditeur=Oxford University Press|année=2020}}
* {{Ouvrage|prénom1=Paul|nom1=Gochet|titre=Quine en perspective|sous-titre=essai de philosophie comparée|lieu=Paris|éditeur=Flammarion|année=1978}}
* {{Ouvrage|prénom1=Sandra|nom1=Laugier|titre=L'anthropologie logique de Quine|sous-titre=l'apprentissage de l'obvie|lieu=Paris|éditeur=Vrin|année=1992}}
* {{Ouvrage|langue=en|prénom1=Roger F.|nom1=Gibson|responsabilité1=dir.|titre=The Cambridge Companion to Quine|lieu=Cambridge|éditeur=Cambridge University Press|année=2004}}
* {{Ouvrage|langue=en|prénom1=Peter|nom1=Hylton|titre=Quine|lieu=Londres|éditeur=Routledge|année=2007}}
* {{Ouvrage|langue=en|prénom1=Alex|nom1=Orenstein|titre=W. V. Quine|lieu=Chesham|éditeur=Acumen|année=2002}}
* {{Ouvrage|langue=en|prénom1=Christopher|nom1=Hookway|titre=Quine|sous-titre=Language, Experience and Reality|lieu=Cambridge|éditeur=Polity Press|année=1988}}
* {{Ouvrage|langue=en|prénom1=Gilbert|nom1=Harman|prénom2=Ernest|nom2=Lepore|responsabilité1=dir.|titre=A Companion to W. V. O. Quine|lieu=Chichester|éditeur=Wiley-Blackwell|année=2014}}
* {{Ouvrage|langue=en|prénom1=Eve|nom1=Gaudet|titre=Quine on Meaning|sous-titre=The Indeterminacy of Translation|lieu=Londres|éditeur=Continuum|année=2006}}
* {{Ouvrage|langue=en|prénom1=Lewis Edwin|nom1=Hahn|prénom2=Paul Arthur|nom2=Schilpp|responsabilité1=dir.|titre=The Philosophy of W. V. Quine|lieu=La Salle (Illinois)|éditeur=Open Court|année=1986|collection=The Library of Living Philosophers}}
== Voir aussi ==
* [[Dictionnaire de philosophie/Empirisme|Empirisme]]
* [[Dictionnaire de philosophie/Épistémologie|Épistémologie]]
* [[Dictionnaire de philosophie/Métaphysique|Métaphysique]]
* [[Dictionnaire de philosophie/Existence|Existence]]
* [[Dictionnaire de philosophie/Vérité|Vérité]]
* [[Dictionnaire de philosophie/Convention|Convention]]
* [[Dictionnaire de philosophie/A priori|A priori]]
* [[Dictionnaire de philosophie/Bateau de Neurath|Bateau de Neurath]]
* [[Dictionnaire de philosophie/Moritz Schlick|Moritz Schlick]]
* [[Dictionnaire de philosophie/Scepticisme|Scepticisme]]
[[Catégorie:Philosophe]]
{{DEFAULTSORT:Quine, Willard Van Orman}}
aqw8gq4brkkxwez2vl8bb6ktwfc3cwp
Dictionnaire de philosophie/David Chalmers
0
83959
768288
2026-06-22T03:34:39Z
PandaMystique
119061
Page créée avec « {{DicoPhilo|David Chalmers}} [[Fichier:David Chalmers 2011 (cropped).jpg|vignette|upright=1.1|David Chalmers en 2011.]] '''David Chalmers''', né en 1966 à Sydney, est un philosophe australien qui compte parmi les figures centrales de la philosophie de l'esprit contemporaine. On lui doit la formulation la plus reprise du problème de la conscience : la distinction entre les « problèmes faciles », que les sciences cognitives savent en principe traiter, et le... »
768288
wikitext
text/x-wiki
{{DicoPhilo|David Chalmers}}
[[Fichier:David Chalmers 2011 (cropped).jpg|vignette|upright=1.1|David Chalmers en 2011.]]
'''David Chalmers''', né en 1966 à Sydney, est un philosophe australien qui compte parmi les figures centrales de la philosophie de l'esprit contemporaine. On lui doit la formulation la plus reprise du problème de la conscience : la distinction entre les « problèmes faciles », que les sciences cognitives savent en principe traiter, et le « problème difficile », celui de l'expérience vécue, qui leur échappe. Son premier livre, ''The Conscious Mind'' (1996), traduit en français sous le titre ''L'Esprit conscient'', défend une stratégie antiréductionniste et une position qu'il nomme « dualisme naturaliste ».
Une même intuition traverse toute son œuvre. La physique décrit le monde par sa structure et sa dynamique, c'est-à-dire par un réseau de relations et de dispositions ; elle ne dit rien de la nature intrinsèque des choses qui entrent dans ces relations, ni de ce que cela fait d'être un sujet. Or l'expérience, la sensation du rouge ou le goût du café, paraît rétive à toute description purement structurale. De ce point d'appui Chalmers tire une critique du matérialisme, une cartographie des positions possibles sur la conscience, puis le projet, plus tardif, d'une reconstruction du savoir à partir d'une base réduite de vérités (''Constructing the World'', 2012) et une enquête sur la réalité virtuelle (''Reality+'', 2022). On lui doit aussi, avec Andy Clark, l'hypothèse de l'« esprit étendu ». Cofondateur de la base de données PhilPapers, il enseigne à l'université de New York.
== Repères biographiques ==
David John Chalmers naît le 20 avril 1966 à Sydney et grandit à Adélaïde, en Australie. Enfant, il fait l'expérience de la synesthésie, ce mélange des sens où une perception en éveille spontanément une autre : sans doute sa première rencontre, vécue de l'intérieur, avec l'étrangeté de l'expérience consciente. Il manifeste très tôt un intérêt marqué pour les mathématiques, décroche une médaille de bronze aux Olympiades internationales de mathématiques, et découvre vers treize ans le livre de Douglas Hofstadter ''Gödel, Escher, Bach'', qui éveille son goût pour les questions de l'esprit et de la machine<ref>Pour le détail biographique, voir D. Chalmers, « Bio » et « Curriculum Vitae », sur consc.net, ainsi que l'entretien autobiographique accordé à Clifford Sosis, « What Is It Like to Be a Philosopher? », 2016. La synesthésie, la médaille aux Olympiades de mathématiques, le séjour de lecture en Europe et la lecture précoce de ''Gödel, Escher, Bach'' y sont rapportés.</ref>.
Il obtient d'abord un diplôme de mathématiques pures à l'université d'Adélaïde. Après six mois passés à lire de la philosophie en parcourant l'Europe en auto-stop, il rejoint Oxford comme boursier Rhodes, mais s'aperçoit que l'esprit l'occupe davantage que les mathématiques et change de discipline. Il part aux États-Unis, à l'université de l'Indiana, où il prépare sous la direction de Hofstadter une thèse de philosophie et de sciences cognitives soutenue en 1993, intitulée ''Toward a Theory of Consciousness''. Une bourse postdoctorale au programme « philosophie, neurosciences, psychologie » de l'université Washington à Saint-Louis, où il travaille auprès d'Andy Clark de 1993 à 1995, lui donne le cadre où il met au point son premier livre et où naît, avec Clark, le travail sur l'esprit étendu.
En 1994, une intervention à la conférence ''Toward a Science of Consciousness'' de Tucson le fait connaître : c'est là qu'il met en circulation l'expression de « problème difficile ». Il cofonde l'Association pour l'étude scientifique de la conscience, dont il présidera la société. Sa carrière le mène ensuite de l'université de Californie à Santa Cruz à l'université d'Arizona, où il dirige le Center for Consciousness Studies, puis, en 2004, de retour en Australie, à l'université nationale australienne grâce à une bourse fédérale de recherche. Il rejoint l'université de New York en 2009, à temps partiel d'abord, puis à plein temps, comme professeur de philosophie et de neurosciences et codirecteur du Center for Mind, Brain, and Consciousness. Élu à l'Académie américaine des arts et des sciences en 2013, il a cofondé avec David Bourget l'archive PhilPapers, qui recense la littérature philosophique mondiale, et conduit les enquêtes statistiques sur les opinions des philosophes professionnels. Un trait de son tempérament intellectuel : en 1998, il avait parié une caisse de vin avec le neuroscientifique Christof Koch que les bases neuronales de la conscience ne seraient pas élucidées sous vingt-cinq ans ; il a gagné ce pari en 2023<ref>Le pari et son issue sont relatés dans la presse scientifique en 2023. Sur le fond, voir D. Chalmers, ''The Character of Consciousness'', Oxford University Press, 2010, chap. 3 et 4, sur la notion de corrélat neuronal de la conscience.</ref>.
Le style de Chalmers tient pour modèle la clarté analytique : des distinctions nettes, des expériences de pensée bien découpées, un outillage logique (la sémantique bidimensionnelle) au service de problèmes que d'autres préfèrent laisser dans le clair-obscur. Il s'efforce, selon sa propre formule, de prendre la conscience au sérieux, sans la dissoudre dans le vocabulaire fonctionnel ni la déclarer hors d'atteinte.
== Le problème difficile de la conscience ==
L'argument qui a porté son nom tient dans une distinction. Le mot « conscience » recouvre plusieurs phénomènes, et certains se laissent expliquer bien plus aisément que d'autres<ref>D. Chalmers, « Facing Up to the Problem of Consciousness » (1995), repris dans ''The Character of Consciousness'', chap. 1 ; voir aussi ''The Conscious Mind'', introduction et chap. 1.</ref>.
=== Les problèmes faciles ===
Chalmers range parmi les « problèmes faciles » de la conscience un ensemble de fonctions : la capacité de discriminer les stimuli et d'y réagir, l'intégration de l'information par un système cognitif, la possibilité de rapporter verbalement ses états internes, l'accès d'un système à ses propres états, la concentration de l'attention, le contrôle délibéré de l'action, la différence entre veille et sommeil. Ces phénomènes sont « faciles » en un sens précis et relatif : non qu'on sache déjà les expliquer dans le détail, mais qu'on voie clairement à quoi ressemblerait leur explication. Il suffit, pour chacun, d'exhiber le mécanisme cognitif ou neuronal qui le produit. Le travail empirique pourra être long, mais son type d'explication, lui, est identifiable.
=== Le résidu : l'expérience ===
Reste, lorsque toutes ces fonctions ont été expliquées, un résidu. Pourquoi ce traitement de l'information s'accompagne-t-il d'une vie intérieure ? Lorsque nous percevons, nous éprouvons des qualités : le rouge d'une tomate mûre, le timbre d'une clarinette, l'odeur du café, la douleur d'une brûlure. Ce que le philosophe Thomas Nagel a nommé le « ce que c'est que » d'un état, l'effet que cela fait d'être dans cet état, voilà l'explanandum du problème difficile. On peut décrire complètement les processus physiques d'un cerveau sans avoir encore dit pourquoi ils sont vécus de l'intérieur, ni même pourquoi ils le sont du tout.
Chalmers reprend ici l'idée d'un « fossé explicatif », formulée par Joseph Levine : entre une description physique ou fonctionnelle et le fait de l'expérience, l'explication n'a pas la même nécessité transparente que dans le reste des sciences. Que l'eau soit H{{ind|2}}O nous fait comprendre pourquoi elle bout, gèle, dissout ; mais d'une description complète des circuits cérébraux on ne déduit pas avec la même évidence pourquoi il y a là quelque chose de ressenti. Pour clarifier les enjeux, Chalmers propose de réserver le terme de « conscience » au phénomène de l'expérience, et de regrouper sous le nom de conscience d'accès, ou disponibilité fonctionnelle de l'information (''awareness''), l'ensemble des capacités fonctionnelles plus traitables : l'accès d'une information au contrôle délibéré des conduites. Bien des débats, observe-t-il, tiennent à ce que les interlocuteurs parlent, sous le même mot, de deux choses différentes.
Le problème difficile n'est pas un appel au désespoir. Il invite à reconnaître que la conscience n'est pas un cas ordinaire, et que les méthodes qui ont réussi ailleurs ne suffiront pas telles quelles. C'est à partir de ce constat, et non contre lui, que Chalmers cherche une théorie.
== L'argument du zombie et la critique du matérialisme ==
Pour montrer que l'expérience n'est pas entraînée logiquement par les seuls faits physiques, Chalmers recourt à une [[Dictionnaire de philosophie/Expérience de pensée|expérience de pensée]] devenue célèbre.
=== Le jumeau zombie ===
Imaginons un être physiquement identique à moi, molécule pour molécule, plongé dans le même environnement, et dépourvu de toute expérience. Chalmers l'appelle mon « jumeau zombie ». Ce double me ressemble jusque dans le moindre détail fonctionnel : il traite la même information, réagit comme moi, module ses états internes comme les miens, produit les mêmes phrases. Il se dira même « conscient » : il est éveillé, rapporte ses états, dirige son attention. Simplement, rien de tout cela ne s'accompagne du moindre vécu. Il n'y a rien que cela fasse d'être lui.
Ce zombie philosophique n'a rien du mort-vivant du cinéma, lequel souffre justement de déficits fonctionnels. La question n'est pas de savoir si de tels êtres existent, ni même s'ils pourraient apparaître dans notre monde ; il est probable que tout double physique de moi serait, en fait, conscient. La question est seulement de savoir si l'idée d'un zombie est cohérente, exempte de contradiction cachée. Encore ne s'agit-il pas d'une vague impression : Chalmers a en vue une concevabilité idéale et positive, stabilisée à la réflexion, dont il soutiendra qu'elle donne une raison de reconnaître la possibilité du scénario. De même qu'un monocycle haut d'un mille, soit plus d'un kilomètre et demi, n'existe pas mais se conçoit sans contradiction, le scénario du zombie paraît concevable.
=== De la concevabilité à la possibilité ===
L'argument, dès lors, prend la forme suivante. Si un monde zombie, physiquement identique au nôtre mais sans aucune expérience, est concevable, alors un tel monde est métaphysiquement possible ; or, si ce monde est possible, c'est que les faits physiques ne suffisent pas à fixer les faits de l'expérience ; donc le matérialisme, selon lequel tout fait est fixé par les faits physiques, est faux. Tout le poids repose sur le passage du concevable au possible.
C'est là que Saul Kripke avait élevé une difficulté : certaines vérités sont nécessaires tout en n'étant connaissables qu'a posteriori, comme l'identité de l'eau et de H{{ind|2}}O. On pourrait donc concevoir un monde sans pour autant établir sa possibilité réelle. Chalmers répond au moyen de la sémantique bidimensionnelle, qu'il développe en propre<ref>D. Chalmers, « The Two-Dimensional Argument against Materialism », dans ''The Character of Consciousness'', chap. 6, et l'appendice « Two-Dimensional Semantics » du même ouvrage.</ref>. Un terme a deux valeurs : une intension primaire, qui suit la manière dont il se rapporte au monde tel qu'il nous apparaît, et une intension secondaire, qui dépend de la nature réelle de ce qu'il désigne. Pour l'eau, les deux divergent : la chose qui nous apparaît comme de l'eau pourrait, dans un autre monde, n'être pas H{{ind|2}}O. Mais la conscience est un cas singulier : elle n'a pas d'apparence distincte de son être, puisqu'elle est précisément l'apparaître. Là où l'eau cache une nature derrière son aspect, l'expérience ne cache rien : sentir le rouge, c'est qu'il y a du rouge ressenti. Les deux intensions coïncident, de sorte que l'objection tirée de Kripke ne s'applique pas à la conscience. La concevabilité du zombie, soutient Chalmers, vaut alors comme indice de possibilité.
=== Les trois arguments contre le matérialisme ===
L'argument du zombie n'est qu'une voie parmi d'autres. Chalmers le replace dans une famille d'« arguments épistémiques » contre le matérialisme, qui tous concluent d'un écart dans l'ordre de la connaissance à un écart dans l'ordre de l'être<ref>D. Chalmers, « Consciousness and Its Place in Nature », dans ''The Character of Consciousness'', chap. 5, sect. 2-3.</ref>.
Le premier est l'argument de la concevabilité, celui du zombie. Le deuxième est l'argument de la connaissance, dû à Frank Jackson : Mary, neuroscientifique enfermée depuis sa naissance dans une chambre en noir et blanc, connaît tous les faits physiques de la vision des couleurs ; le jour où elle voit le rouge pour la première fois, elle apprend pourtant quelque chose de neuf, ce que cela fait de voir le rouge. Si elle savait déjà tout le physique et qu'il lui restait à apprendre, c'est que tout le physique ne suffit pas. Le troisième est l'argument explicatif, déjà rencontré : l'explication fonctionnelle, si complète soit-elle, laisse intact le problème de l'expérience. Les trois partagent une même charpente, passer d'une impossibilité de déduction à une différence dans les faits, et Chalmers en propose une analyse commune, par où l'on aperçoit ce que chacun suppose et où chacun peut être contesté.
Et de fait, les matérialistes ne se tiennent pas pour battus, et leurs objections dessinent en creux les points sensibles de la démarche. Les uns refusent que le zombie soit réellement concevable : ce qui passe pour une conception claire dissimulerait, à l'examen, une incohérence, faute qu'on saisisse vraiment ce que serait un double physiquement complet. D'autres accordent la concevabilité mais refusent le pas vers la possibilité métaphysique : à leurs yeux, la stratégie dite des concepts phénoménaux explique l'écart par la singularité de nos façons de penser l'expérience, sans qu'il faille une dualité dans les choses. D'autres enfin nient qu'un écart dans l'ordre de la connaissance entraîne un écart dans l'ordre de l'être : que l'on ne puisse déduire l'expérience du physique tiendrait à nos concepts, non au monde. Chalmers oppose à chacune une réponse, mais c'est sur ces trois fronts que se joue l'essentiel de la controverse.
== Le dualisme naturaliste ==
Si le matérialisme échoue, faut-il revenir à Descartes ? Chalmers s'en garde. Le [[Dictionnaire de philosophie/Dualisme|dualisme]] qu'il défend n'est pas un dualisme des substances, avec un esprit séparé agissant sur le corps. C'est un dualisme des propriétés : l'expérience est une propriété d'un individu qui n'est pas entraînée par ses propriétés physiques, sans constituer pour autant une seconde substance<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 1 et 6 ; pour les équivalents français adoptés ici (« survenance », « explication réductrice »), voir ''L'Esprit conscient'', trad. Stéphane Dunand, Ithaque, 2010.</ref>.
=== Propriétés et lois psychophysiques ===
La thèse se laisse formuler dans le vocabulaire de la survenance, c'est-à-dire de la dépendance : la conscience ne survient pas logiquement sur le physique, elle n'en découle pas par simple analyse, et c'est ce qui distingue cette position d'un matérialisme déguisé. Le verbe que l'on emploie d'ordinaire est révélateur : on dit volontiers que l'esprit « émerge » du cerveau, alors qu'on ne dirait pas que l'apprentissage en émerge ; ce besoin d'un terme d'apparition trahit qu'il se passe là quelque chose de plus que les seuls faits physiques. Pour intégrer la conscience à une théorie de la nature, il faut admettre de nouvelles propriétés premières et de nouvelles lois, des lois psychophysiques reliant le physique au phénoménal. Ces lois ne contredisent pas les lois physiques, qui forment déjà un système clos ; elles s'y ajoutent, en disant comment l'expérience naît des processus du monde. Chalmers envisage aussi que les propriétés premières ne soient pas elles-mêmes phénoménales mais « protophénoménales », à partir desquelles le phénoménal serait composé, comme la température se compose du mouvement de particules qui, prises une à une, ne sont pas chaudes.
=== L'analogie de l'électromagnétisme ===
Pour montrer qu'une telle extension n'a rien d'antiscientifique, Chalmers rappelle l'histoire de l'électromagnétisme. Au XIX{{e}} siècle, on avait tenté de réduire les phénomènes électromagnétiques aux principes mécaniques déjà connus ; l'entreprise échoua. Il fallut tenir la charge et les champs pour des grandeurs premières et, avec Maxwell, poser de nouvelles lois. Ce ne fut pas renoncer à la science, mais élargir son inventaire. De même, suggère Chalmers, expliquer la conscience demande d'ajouter de nouvelles grandeurs et de nouvelles lois à la liste de ce qui est premier. Sa position se dit « naturaliste » pour cette raison : elle ne fait appel à rien de surnaturel ni de transcendant, elle maintient que tout procède d'un réseau de propriétés et de lois de base, et que la conscience est un phénomène naturel parmi d'autres. Sur un point, le dualiste naturaliste se tient même plus près du matérialiste que des dualismes classiques, puisqu'il accorde que le comportement, comme tout fait physique, a des causes physiques.
=== L'objection de l'épiphénoménisme ===
Cette dernière concession soulève aussitôt une difficulté. Si la cause de tout comportement est déjà physique, à quoi sert l'expérience ? Ne risque-t-elle pas d'être un épiphénomène, un reflet sans pouvoir, qui accompagne les processus du cerveau sans rien y faire ? Chalmers nomme « paradoxe du jugement phénoménal » la version la plus aiguë de l'objection : nos discours sur la conscience, nos déclarations mêmes, paraissent avoir une cause entièrement physique ; mais alors comment se rapportent-ils à l'expérience, et comment l'expérience pourrait-elle les rendre justes<ref>D. Chalmers, ''The Conscious Mind'', chap. 5 (« The Paradox of Phenomenal Judgment ») ; et ''The Character of Consciousness'', chap. 5, sect. sur le type-E.</ref> ? Chalmers ne tranche pas d'un mot. Il explore plusieurs réponses, dont l'une l'attire : l'expérience pourrait jouer un rôle non comme une force ajoutée au monde physique, mais comme la nature intrinsèque même des processus que la physique ne décrit que par leurs relations. Cette piste le conduit au monisme russellien.
== Une carte des positions sur la conscience ==
L'un des apports les plus utiles de Chalmers est une cartographie ordonnée des réponses possibles au problème difficile. Toutes se distinguent par la manière dont elles traitent l'écart épistémique entre le physique et le phénoménal<ref>D. Chalmers, « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 4 à 11. La typologie en types A à F y est exposée en détail.</ref>.
Trois familles relèvent du matérialisme. Le type A nie l'écart : il n'y aurait pas de problème supplémentaire une fois les fonctions expliquées ; l'éliminativisme et certaines formes de fonctionnalisme analytique en relèvent, comme l'illusionnisme, pour qui le sentiment d'un mystère provient d'une représentation trompeuse de nos propres états. Le type B reconnaît un écart durable dans l'ordre de la connaissance, mais le tient pour compatible avec une identité dans l'ordre de l'être, sur le modèle de l'identité a posteriori de l'eau et de H{{ind|2}}O ; c'est la « stratégie des concepts phénoménaux », qui explique l'écart par la singularité de nos concepts d'expérience plutôt que par une dualité dans les choses. Chalmers objecte, au moyen de la sémantique bidimensionnelle, que cette identité sans entraînement a priori reste inintelligible. Le type C, enfin, juge l'écart provisoire, voué à se combler quand notre science aura mûri ; Chalmers soutient qu'à l'examen il se rabat soit sur le type A, soit sur une forme de dualisme.
Deux familles relèvent du dualisme. Le type D, ou interactionnisme, prête à l'expérience un pouvoir sur le physique : les états phénoménaux agissent sur les états physiques, et la clôture causale du monde physique est niée. La figure historique en est Descartes ; Chalmers note qu'une lecture de la mécanique quantique, où la réduction du paquet d'ondes serait liée à l'observation par un sujet conscient, pourrait lui offrir un appui inattendu, sans pour autant l'imposer. Le type E, ou épiphénoménisme, tient au contraire que le phénoménal ne produit aucun effet physique : les lois psychophysiques ne courent que dans un sens, du physique vers le vécu. La position respecte à la fois les arguments contre le matérialisme et la clôture du physique, au prix d'une forte tension avec l'intuition ordinaire, puisque ce ne serait pas la douleur qui ferait retirer la main du feu. Chalmers la juge cohérente mais inélégante.
Reste une sixième voie, qui n'est ni tout à fait matérialiste ni tout à fait dualiste, et à laquelle il accorde la préférence : le type F, ou monisme russellien.
== Le monisme russellien et le panpsychisme ==
L'idée prend appui sur une remarque que Bertrand Russell développait dans ''The Analysis of Matter''. La physique ne caractérise ses objets que par leurs relations et leurs dispositions. Un quark se décrit par ses interactions ; la masse se définit par une tendance, celle de résister à l'accélération. De la nature intrinsèque qui soutient ces dispositions, de ce qui est en jeu lorsque la causalité relie deux entités, la physique ne dit rien. Or il paraît peu satisfaisant d'imaginer un monde de pures relations entre des termes sans qualités propres, un réseau de dispositions ne disposant de rien. Il doit y avoir une nature intrinsèque sous la structure<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 3 (« The intrinsic nature of the physical ») ; et « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 11.</ref>.
Deux énigmes se font alors face : quelle est la nature intrinsèque des entités physiques, et comment loger l'expérience dans le monde physique ? La proposition de Russell, que Chalmers reprend, est de les résoudre d'un seul coup. Et si la nature intrinsèque du physique était elle-même de nature phénoménale, ou protophénoménale ? La structure que décrit la physique serait portée par des qualités qui, prises ensemble, constituent l'expérience. Cette position a des airs de [[Dictionnaire de philosophie/Métaphysique|métaphysique]] audacieuse, mais elle offre des avantages : elle intègre étroitement le phénoménal au physique, elle reste compatible avec la clôture causale et avec les lois physiques telles qu'elles sont, et elle assigne aux propriétés phénoménales ou protophénoménales un rôle circonscrit : réaliser de l'intérieur les dispositions [[Dictionnaire de philosophie/Causalité|causales]] que la physique décrit du dehors. Selon la part qu'on accorde aux propriétés phénoménales ou seulement protophénoménales, la doctrine prend le nom de panpsychisme, où la conscience serait présente jusque dans les entités élémentaires, ou de panprotopsychisme, plus prudent.
Chalmers ne cache ni l'étrangeté de la thèse ni son principal obstacle. L'étrangeté : faut-il admettre qu'il y a quelque chose que cela fait d'être un électron ? La version protophénoménale atténue la formule sans tout à fait la dissiper. L'obstacle, plus sérieux, est ce qu'il nomme le « problème de la combinaison » : à supposer que les composants élémentaires aient des micro-expériences, on ne voit pas comment celles-ci s'assembleraient en l'expérience unifiée d'un sujet. Le problème reste ouvert, et Chalmers le tient pour la principale épreuve de cette famille de positions.
== Le principe d'invariance organisationnelle ==
Une thèse plus précise traverse ces discussions et touche directement à la question des machines. Chalmers soutient que l'expérience consciente est un invariant de l'organisation fonctionnelle : deux systèmes qui partagent la même organisation, dans ses détails pertinents, ont les mêmes états conscients, quelle que soit la matière qui les réalise<ref>D. Chalmers, ''The Conscious Mind'', chap. 7 (« Absent Qualia, Fading Qualia, Dancing Qualia ») ; rendu français des termes dans ''L'Esprit conscient'', trad. S. Dunand.</ref>.
Il l'établit par deux expériences de pensée. Supposons qu'on remplace, un à un, les neurones d'un cerveau par des puces de silicium fonctionnellement équivalentes, jusqu'à obtenir un double de silicium. Que devient l'expérience au fil du remplacement ? Si elle s'éteignait peu à peu, on aurait des « qualia évanescents » : il existerait un moment où le sujet, encore parfaitement disposé à juger de ses états, se tromperait du tout au tout sur leur intensité, croyant voir des couleurs vives alors qu'elles s'estompent. Si, au contraire, on imaginait un circuit que l'on bascule entre deux réalisations, on aurait des « qualia dansants », des expériences sautant d'une qualité à l'autre sans que le sujet s'en aperçoive. Ces deux scénarios conduisent à admettre qu'un sujet pourrait être massivement coupé de sa propre expérience, ce que Chalmers tient pour absurde. Il en conclut que les qualia suivent l'organisation et non le substrat. La conséquence est notable : un système non biologique convenablement organisé, et donc en principe une machine, pourrait être le siège d'une expérience. Cette thèse, qui semble faire un pas vers le fonctionnalisme, demeure compatible avec le dualisme des propriétés, car l'invariance y a le statut d'une loi psychophysique et non d'une identité.
== L'esprit étendu ==
Dans ces mêmes années, et sur un tout autre terrain, Chalmers avait, avec le philosophe Andy Clark, exploré une autre question, étrangère à la conscience mais devenue un classique de la philosophie de l'esprit. Dans un article de 1998, les deux auteurs proposent un « principe de parité » : si une opération accomplie dans le monde, à l'aide d'un support externe, joue le rôle qu'une opération accomplie dans la tête remplirait, alors elle fait partie au même titre du processus cognitif<ref>A. Clark et D. Chalmers, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19. Ce texte ne figure pas dans les quatre livres ici commentés mais prolonge le programme de l'auteur.</ref>. L'exemple est celui d'Otto, dont la mémoire défaillante l'oblige à consigner les adresses dans un carnet : ce carnet remplit pour lui la fonction que la mémoire biologique remplit pour Inga ; il appartient donc, soutiennent les auteurs, à l'esprit d'Otto. Cet « externalisme actif » étend l'esprit au-delà de la peau et du crâne, et trouve une actualité dans nos usages du carnet, du téléphone et du réseau, devenus des prolongements de la mémoire et du calcul.
== La scrutabilité du monde ==
Le deuxième grand chantier de Chalmers, exposé dans ''Constructing the World'' (2012), paraît d'abord éloigné de la conscience. Il y reprend un projet que Rudolf Carnap avait formulé en 1928 dans ''Der logische Aufbau der Welt'', la reconstruction de tout notre savoir à partir d'une base réduite, et le relie à une idée plus ancienne encore, celle du démon de Laplace<ref>D. Chalmers, ''Constructing the World'', Oxford University Press, 2012, introduction et chap. 1 à 3. L'ouvrage reprend les six conférences John Locke prononcées à Oxford en 2010.</ref>.
=== L'héritage de Carnap et de Laplace ===
Laplace imaginait une intelligence qui, connaissant à un instant la position de toutes les particules et les lois de la nature, embrasserait d'une seule formule le passé et l'avenir. Chalmers généralise : sa « thèse de scrutabilité » affirme qu'il existe une classe restreinte de vérités de base à partir desquelles toutes les vérités du monde sont accessibles à un raisonnement idéal. Le monde, en ce sens, est compréhensible : du socle on peut, en droit, remonter au reste. Le démon de Laplace n'est qu'un cas particulier, et un cas trop pauvre, car l'information physique seule ne suffit pas. Pour atteindre les vérités sur l'expérience, il faut adjoindre au socle des vérités sur la conscience ; pour atteindre les vérités sur le présent ou sur soi, des vérités indexicales ; et une clause de totalité, pour exclure ce qui n'est pas.
=== La base et le Cosmoscope ===
Chalmers nomme ce socle, d'une formule, PQTI : les vérités de la physique (P), les vérités phénoménales ou qualia (Q), une vérité de totalité disant que le monde est minimal (T), et les vérités indexicales (I). De cette base, soutient-il, toutes les autres vérités sont scrutables, et même scrutables a priori, par déduction idéale : c'est la part de « rationalisme modal » de son entreprise. Pour rendre l'idée tangible, il invente un instrument fictif, le Cosmoscope, qui stockerait toute l'information de base et la rendrait utilisable : un calculateur de capacité illimitée, des outils pour explorer la distribution de la matière, un dispositif de réalité virtuelle pour transmettre les états phénoménaux décrits par Q, un repère « vous êtes ici » pour l'indexical, et des modules de simulation pour les vérités conditionnelles. Le détail compte moins que la thèse : un sujet idéal disposant d'une telle base aurait en principe de quoi établir toute vérité sur le monde, par le seul raisonnement.
Le projet rejoint alors la philosophie de l'esprit. Que les vérités phénoménales doivent figurer à part dans la base, qu'on ne puisse les scruter à partir des seules vérités physiques, c'est l'envers, dans l'ordre de la connaissance, de l'échec du matérialisme. La structure de ''Constructing the World'' confirme ainsi, par un autre chemin et avec d'autres outils ([[Dictionnaire de philosophie/Épistémologie|épistémologie]] de l'inférence, sémantique bidimensionnelle), la thèse du premier livre.
== Réalité virtuelle et technophilosophie ==
Le dernier versant de l'œuvre, esquissé dès un essai de 2003 sur le film ''Matrix'' et déployé dans ''Reality+'' (2022), porte sur la réalité, la connaissance du monde extérieur et la technologie<ref>D. Chalmers, « The Matrix as Metaphysics », ''The Character of Consciousness'', chap. 13 ; et ''Reality+: Virtual Worlds and the Problems of Philosophy'', W. W. Norton et Allen Lane, 2022 (édition de poche Penguin, 2023).</ref>.
=== La simulation comme hypothèse métaphysique ===
Reprenons le doute de Descartes, repeint aux couleurs du jour. Comment savoir que je ne suis pas, en ce moment même, dans une simulation informatique, comme les habitants de ''Matrix'' ? Chalmers soutient une thèse contre-intuitive : à supposer que nous y soyons, nos croyances ordinaires ne seraient pas pour autant fausses. L'hypothèse de la simulation n'est pas une hypothèse [[Dictionnaire de philosophie/Scepticisme|sceptique]] qui ruinerait notre savoir, mais une hypothèse métaphysique sur la nature ultime des choses. Si nous sommes dans une simulation, les tables et les chaises existent bel et bien : ce sont des objets numériques, faits de bits, et nos propos à leur sujet sont vrais des structures de données qui les réalisent. Chalmers relie cette idée à l'hypothèse, présente en physique, d'un monde fait d'information (l{{'}}''it from bit''). La simulation ne dissout pas la réalité, elle lui prête une nature cachée, un peu comme la physique loge sous le monde sensible un substrat qui n'a pas l'aspect de ce qu'il fonde. C'est par là, et non par une réfutation directe du doute, que Chalmers entend répondre au problème du monde extérieur posé par [[Dictionnaire de philosophie/René Descartes|Descartes]].
=== Le réalisme virtuel ===
De ce diagnostic Chalmers tire une thèse générale, qu'il nomme réalisme virtuel et résume d'une phrase : la réalité virtuelle est une réalité authentique. Le livre articule autour d'elle trois affirmations. D'abord, les mondes virtuels ne sont pas des illusions ni des fictions : ce qui s'y produit s'y produit réellement, et les objets qu'on y manipule sont réels, à titre d'objets numériques. Ensuite, on peut mener dans un monde virtuel une vie pleinement sensée, non un simple divertissement d'évasion. Enfin, rien ne nous assure que notre propre monde n'est pas lui-même virtuel : c'est une possibilité que nous ne pouvons écarter, d'autant que les arguments statistiques sur la prolifération des simulations, qu'on doit à Nick Bostrom, lui donnent un poids. L'ensemble de la démarche relève de ce que Chalmers appelle la « technophilosophie », un va-et-vient entre deux tâches : poser sur la technologie des questions philosophiques, et se servir de la technologie pour éclairer de vieilles questions de la philosophie.
== Le méta-problème de la conscience ==
Dans un texte de 2018, Chalmers ajoute à son dispositif une question qu'il juge centrale : le « méta-problème » de la conscience, c'est-à-dire le problème d'expliquer pourquoi nous croyons qu'il y a un problème difficile<ref>D. Chalmers, « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.</ref>. Il s'agit de rendre compte de nos « intuitions de problème », de nos déclarations selon lesquelles la conscience serait irréductible ou la qualité du rouge distincte de toute propriété physique, et de le faire en termes neutres, physiques ou fonctionnels, sans présupposer la conscience. Le méta-problème a ceci d'intéressant qu'il appartient, lui, à la classe des problèmes faciles : il porte sur des comportements et des rapports, qui se laissent en principe expliquer.
L'enjeu n'est pas mince. Si l'on parvenait à expliquer nos intuitions de problème sans jamais invoquer l'expérience, on disposerait d'un argument pour l'illusionnisme, la thèse selon laquelle la conscience phénoménale, telle que nous la concevons, est une sorte d'illusion introspective. Chalmers, qui demeure réaliste à l'égard de la conscience, prend pourtant le méta-problème au sérieux et avoue que, s'il était matérialiste, c'est l'illusionnisme qu'il choisirait. Il recense une quinzaine de solutions candidates et marque sa sympathie pour plusieurs d'entre elles, sans trancher. La manœuvre est typique de sa façon de faire : tendre la main à la position adverse, en éprouver la force, et laisser au lecteur le soin de conclure.
== Réception et postérité ==
L'œuvre de Chalmers a laissé une empreinte durable sur la philosophie de l'esprit. La distinction du facile et du difficile a fourni à tout un champ son vocabulaire et son ordre du jour ; rares sont les discussions sur la conscience qui ne s'y réfèrent, fût-ce pour la contester. Les adversaires se répartissent selon la carte que Chalmers a lui-même dessinée. Daniel Dennett tient le problème difficile pour un mirage et range Chalmers parmi ceux qui prennent une difficulté d'imagination pour une découverte métaphysique. Les tenants de la stratégie des concepts phénoménaux, du côté du matérialisme de type B, contestent le passage de la concevabilité à la possibilité. D'autres jugent que les zombies ne sont pas réellement concevables, ou que l'épiphénoménisme menace la connaissance même de l'expérience. Le panpsychisme auquel Chalmers donne droit de cité bute, on l'a vu, sur le problème de la combinaison.
Au-delà des thèses, son influence tient à une attitude et à des institutions. L'attitude : avoir rendu la conscience à la philosophie comme un problème sérieux, ni honteux ni clos, et avoir montré qu'on pouvait en traiter avec les instruments les plus exigeants de la logique et de la sémantique. Les institutions : la base PhilPapers, qu'il a cofondée et qui a transformé l'accès à la littérature philosophique, et les grandes enquêtes sur les opinions des philosophes, qui ont donné au champ une image de lui-même. Ses travaux récents sur l'intelligence artificielle, et sur la question de savoir si de grands modèles de langage pourraient un jour être conscients ou penser, prolongent une préoccupation présente chez lui depuis ses années auprès de Hofstadter. La conscience, écrivait-il au seuil de son premier livre, est peut-être le plus grand obstacle qui reste sur la route d'une compréhension scientifique de l'univers ; toute son œuvre s'emploie à le cerner sans en masquer la difficulté.
== Notes et références ==
{{références|colonnes=2}}
== Bibliographie ==
=== Œuvres de David Chalmers ===
* ''The Conscious Mind: In Search of a Fundamental Theory'', New York, Oxford University Press, 1996.
* ''The Character of Consciousness'', New York, Oxford University Press, 2010.
* ''Constructing the World'', Oxford, Oxford University Press, 2012.
* ''Reality+: Virtual Worlds and the Problems of Philosophy'', New York, W. W. Norton et Londres, Allen Lane, 2022 (édition de poche, Penguin, 2023).
* « Facing Up to the Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 2, n{{o}} 3, 1995, p. 200-219.
* avec Andy Clark, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19.
* « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.
* « Could a Large Language Model Be Conscious? », ''Boston Review'', 2023.
* « Does Thought Require Sensory Grounding? From Pure Thinkers to Large Language Models », ''Proceedings and Addresses of the American Philosophical Association'', 2023.
=== Traduction française ===
* ''L'Esprit conscient. À la recherche d'une théorie fondamentale'', traduit de l'anglais par Stéphane Dunand, Paris, Ithaque, 2010 (traduction de ''The Conscious Mind'').
=== Études et ouvrages de référence ===
* Thomas Nagel, « What Is It Like to Be a Bat? », ''The Philosophical Review'', vol. 83, n{{o}} 4, 1974, p. 435-450.
* Frank Jackson, « Epiphenomenal Qualia », ''The Philosophical Quarterly'', vol. 32, n{{o}} 127, 1982, p. 127-136.
* Joseph Levine, « Materialism and Qualia: The Explanatory Gap », ''Pacific Philosophical Quarterly'', vol. 64, 1983, p. 354-361.
* Daniel Dennett, ''Consciousness Explained'', Boston, Little, Brown and Company, 1991.
* Bertrand Russell, ''The Analysis of Matter'', Londres, Kegan Paul, 1927.
* Denis Fisette et Pierre Poirier (dir.), ''Textes clés de philosophie de l'esprit'', Paris, Vrin, 2 vol., 2002-2003, anthologie de référence pour le débat francophone sur la conscience et les qualia.
* Daniel Stoljar, ''Physicalism'', Londres, Routledge, 2010.
* David Papineau, ''Thinking about Consciousness'', Oxford, Oxford University Press, 2002.
* Ned Block, « On a Confusion about a Function of Consciousness », ''Behavioral and Brain Sciences'', vol. 18, n{{o}} 2, 1995, p. 227-247.
* Brian Loar, « Phenomenal States », ''Philosophical Perspectives'', vol. 4, 1990, p. 81-108.
* Keith Frankish, « Illusionism as a Theory of Consciousness », ''Journal of Consciousness Studies'', vol. 23, n{{o}} 11-12, 2016, p. 11-39.
* Galen Strawson, « Realistic Monism: Why Physicalism Entails Panpsychism », ''Journal of Consciousness Studies'', vol. 13, n{{o}} 10-11, 2006, p. 3-31.
* Philip Goff, ''Consciousness and Fundamental Reality'', Oxford, Oxford University Press, 2017.
* Michael Tye, ''Ten Problems of Consciousness'', Cambridge (Massachusetts), MIT Press, 1995.
{{DEFAULTSORT:Chalmers}}
[[Catégorie:Dictionnaire de philosophie (livre)]]
[[Catégorie:Philosophe]]
[[Catégorie:Philosophie de l'esprit]]
[[Catégorie:Métaphysique]]
[[Catégorie:Épistémologie]]
c6gzr5cmrsus8gkkjz4s1gf2zh6mlu5
768294
768288
2026-06-22T04:54:35Z
PandaMystique
119061
768294
wikitext
text/x-wiki
{{DicoPhilo|David Chalmers|lecture=oui}}
[[Fichier:David Chalmers 2011 (cropped).jpg|vignette|upright=1.1|David Chalmers en 2011.]]
'''David Chalmers''', né en 1966 à Sydney, est un philosophe australien qui compte parmi les figures centrales de la philosophie de l'esprit contemporaine. On lui doit la formulation la plus reprise du problème de la conscience : la distinction entre les « problèmes faciles », que les sciences cognitives savent en principe traiter, et le « problème difficile », celui de l'expérience vécue, qui leur échappe. Son premier livre, ''The Conscious Mind'' (1996), traduit en français sous le titre ''L'Esprit conscient'', défend une stratégie antiréductionniste et une position qu'il nomme « dualisme naturaliste ».
Une même intuition traverse toute son œuvre. La physique décrit le monde par sa structure et sa dynamique, c'est-à-dire par un réseau de relations et de dispositions ; elle ne dit rien de la nature intrinsèque des choses qui entrent dans ces relations, ni de ce que cela fait d'être un sujet. Or l'expérience, la sensation du rouge ou le goût du café, paraît rétive à toute description purement structurale. De ce point d'appui Chalmers tire une critique du matérialisme, une cartographie des positions possibles sur la conscience, puis le projet, plus tardif, d'une reconstruction du savoir à partir d'une base réduite de vérités (''Constructing the World'', 2012) et une enquête sur la réalité virtuelle (''Reality+'', 2022). On lui doit aussi, avec Andy Clark, l'hypothèse de l'« esprit étendu ». Cofondateur de la base de données PhilPapers, il enseigne à l'université de New York.
== Repères biographiques ==
David John Chalmers naît le 20 avril 1966 à Sydney et grandit à Adélaïde, en Australie. Enfant, il fait l'expérience de la synesthésie, ce mélange des sens où une perception en éveille spontanément une autre : sans doute sa première rencontre, vécue de l'intérieur, avec l'étrangeté de l'expérience consciente. Il manifeste très tôt un intérêt marqué pour les mathématiques, décroche une médaille de bronze aux Olympiades internationales de mathématiques, et découvre vers treize ans le livre de Douglas Hofstadter ''Gödel, Escher, Bach'', qui éveille son goût pour les questions de l'esprit et de la machine<ref>Pour le détail biographique, voir D. Chalmers, « Bio » et « Curriculum Vitae », sur consc.net, ainsi que l'entretien autobiographique accordé à Clifford Sosis, « What Is It Like to Be a Philosopher? », 2016. La synesthésie, la médaille aux Olympiades de mathématiques, le séjour de lecture en Europe et la lecture précoce de ''Gödel, Escher, Bach'' y sont rapportés.</ref>.
Il obtient d'abord un diplôme de mathématiques pures à l'université d'Adélaïde. Après six mois passés à lire de la philosophie en parcourant l'Europe en auto-stop, il rejoint Oxford comme boursier Rhodes, mais s'aperçoit que l'esprit l'occupe davantage que les mathématiques et change de discipline. Il part aux États-Unis, à l'université de l'Indiana, où il prépare sous la direction de Hofstadter une thèse de philosophie et de sciences cognitives soutenue en 1993, intitulée ''Toward a Theory of Consciousness''. Une bourse postdoctorale au programme « philosophie, neurosciences, psychologie » de l'université Washington à Saint-Louis, où il travaille auprès d'Andy Clark de 1993 à 1995, lui donne le cadre où il met au point son premier livre et où naît, avec Clark, le travail sur l'esprit étendu.
En 1994, une intervention à la conférence ''Toward a Science of Consciousness'' de Tucson le fait connaître : c'est là qu'il met en circulation l'expression de « problème difficile ». Il cofonde l'Association pour l'étude scientifique de la conscience, dont il présidera la société. Sa carrière le mène ensuite de l'université de Californie à Santa Cruz à l'université d'Arizona, où il dirige le Center for Consciousness Studies, puis, en 2004, de retour en Australie, à l'université nationale australienne grâce à une bourse fédérale de recherche. Il rejoint l'université de New York en 2009, à temps partiel d'abord, puis à plein temps, comme professeur de philosophie et de neurosciences et codirecteur du Center for Mind, Brain, and Consciousness. Élu à l'Académie américaine des arts et des sciences en 2013, il a cofondé avec David Bourget l'archive PhilPapers, qui recense la littérature philosophique mondiale, et conduit les enquêtes statistiques sur les opinions des philosophes professionnels. Un trait de son tempérament intellectuel : en 1998, il avait parié une caisse de vin avec le neuroscientifique Christof Koch que les bases neuronales de la conscience ne seraient pas élucidées sous vingt-cinq ans ; il a gagné ce pari en 2023<ref>Le pari et son issue sont relatés dans la presse scientifique en 2023. Sur le fond, voir D. Chalmers, ''The Character of Consciousness'', Oxford University Press, 2010, chap. 3 et 4, sur la notion de corrélat neuronal de la conscience.</ref>.
Le style de Chalmers tient pour modèle la clarté analytique : des distinctions nettes, des expériences de pensée bien découpées, un outillage logique (la sémantique bidimensionnelle) au service de problèmes que d'autres préfèrent laisser dans le clair-obscur. Il s'efforce, selon sa propre formule, de prendre la conscience au sérieux, sans la dissoudre dans le vocabulaire fonctionnel ni la déclarer hors d'atteinte.
== Le problème difficile de la conscience ==
L'argument qui a porté son nom tient dans une distinction. Le mot « conscience » recouvre plusieurs phénomènes, et certains se laissent expliquer bien plus aisément que d'autres<ref>D. Chalmers, « Facing Up to the Problem of Consciousness » (1995), repris dans ''The Character of Consciousness'', chap. 1 ; voir aussi ''The Conscious Mind'', introduction et chap. 1.</ref>.
=== Les problèmes faciles ===
Chalmers range parmi les « problèmes faciles » de la conscience un ensemble de fonctions : la capacité de discriminer les stimuli et d'y réagir, l'intégration de l'information par un système cognitif, la possibilité de rapporter verbalement ses états internes, l'accès d'un système à ses propres états, la concentration de l'attention, le contrôle délibéré de l'action, la différence entre veille et sommeil. Ces phénomènes sont « faciles » en un sens précis et relatif : non qu'on sache déjà les expliquer dans le détail, mais qu'on voie clairement à quoi ressemblerait leur explication. Il suffit, pour chacun, d'exhiber le mécanisme cognitif ou neuronal qui le produit. Le travail empirique pourra être long, mais son type d'explication, lui, est identifiable.
=== Le résidu : l'expérience ===
Reste, lorsque toutes ces fonctions ont été expliquées, un résidu. Pourquoi ce traitement de l'information s'accompagne-t-il d'une vie intérieure ? Lorsque nous percevons, nous éprouvons des qualités : le rouge d'une tomate mûre, le timbre d'une clarinette, l'odeur du café, la douleur d'une brûlure. Ce que le philosophe Thomas Nagel a nommé le « ce que c'est que » d'un état, l'effet que cela fait d'être dans cet état, voilà l'explanandum du problème difficile. On peut décrire complètement les processus physiques d'un cerveau sans avoir encore dit pourquoi ils sont vécus de l'intérieur, ni même pourquoi ils le sont du tout.
Chalmers reprend ici l'idée d'un « fossé explicatif », formulée par Joseph Levine : entre une description physique ou fonctionnelle et le fait de l'expérience, l'explication n'a pas la même nécessité transparente que dans le reste des sciences. Que l'eau soit H{{ind|2}}O nous fait comprendre pourquoi elle bout, gèle, dissout ; mais d'une description complète des circuits cérébraux on ne déduit pas avec la même évidence pourquoi il y a là quelque chose de ressenti. Pour clarifier les enjeux, Chalmers propose de réserver le terme de « conscience » au phénomène de l'expérience, et de regrouper sous le nom de conscience d'accès, ou disponibilité fonctionnelle de l'information (''awareness''), l'ensemble des capacités fonctionnelles plus traitables : l'accès d'une information au contrôle délibéré des conduites. Bien des débats, observe-t-il, tiennent à ce que les interlocuteurs parlent, sous le même mot, de deux choses différentes.
Le problème difficile n'est pas un appel au désespoir. Il invite à reconnaître que la conscience n'est pas un cas ordinaire, et que les méthodes qui ont réussi ailleurs ne suffiront pas telles quelles. C'est à partir de ce constat, et non contre lui, que Chalmers cherche une théorie.
== L'argument du zombie et la critique du matérialisme ==
Pour montrer que l'expérience n'est pas entraînée logiquement par les seuls faits physiques, Chalmers recourt à une [[Dictionnaire de philosophie/Expérience de pensée|expérience de pensée]] devenue célèbre.
=== Le jumeau zombie ===
Imaginons un être physiquement identique à moi, molécule pour molécule, plongé dans le même environnement, et dépourvu de toute expérience. Chalmers l'appelle mon « jumeau zombie ». Ce double me ressemble jusque dans le moindre détail fonctionnel : il traite la même information, réagit comme moi, module ses états internes comme les miens, produit les mêmes phrases. Il se dira même « conscient » : il est éveillé, rapporte ses états, dirige son attention. Simplement, rien de tout cela ne s'accompagne du moindre vécu. Il n'y a rien que cela fasse d'être lui.
Ce zombie philosophique n'a rien du mort-vivant du cinéma, lequel souffre justement de déficits fonctionnels. La question n'est pas de savoir si de tels êtres existent, ni même s'ils pourraient apparaître dans notre monde ; il est probable que tout double physique de moi serait, en fait, conscient. La question est seulement de savoir si l'idée d'un zombie est cohérente, exempte de contradiction cachée. Encore ne s'agit-il pas d'une vague impression : Chalmers a en vue une concevabilité idéale et positive, stabilisée à la réflexion, dont il soutiendra qu'elle donne une raison de reconnaître la possibilité du scénario. De même qu'un monocycle haut d'un mille, soit plus d'un kilomètre et demi, n'existe pas mais se conçoit sans contradiction, le scénario du zombie paraît concevable.
=== De la concevabilité à la possibilité ===
L'argument, dès lors, prend la forme suivante. Si un monde zombie, physiquement identique au nôtre mais sans aucune expérience, est concevable, alors un tel monde est métaphysiquement possible ; or, si ce monde est possible, c'est que les faits physiques ne suffisent pas à fixer les faits de l'expérience ; donc le matérialisme, selon lequel tout fait est fixé par les faits physiques, est faux. Tout le poids repose sur le passage du concevable au possible.
C'est là que Saul Kripke avait élevé une difficulté : certaines vérités sont nécessaires tout en n'étant connaissables qu'a posteriori, comme l'identité de l'eau et de H{{ind|2}}O. On pourrait donc concevoir un monde sans pour autant établir sa possibilité réelle. Chalmers répond au moyen de la sémantique bidimensionnelle, qu'il développe en propre<ref>D. Chalmers, « The Two-Dimensional Argument against Materialism », dans ''The Character of Consciousness'', chap. 6, et l'appendice « Two-Dimensional Semantics » du même ouvrage.</ref>. Un terme a deux valeurs : une intension primaire, qui suit la manière dont il se rapporte au monde tel qu'il nous apparaît, et une intension secondaire, qui dépend de la nature réelle de ce qu'il désigne. Pour l'eau, les deux divergent : la chose qui nous apparaît comme de l'eau pourrait, dans un autre monde, n'être pas H{{ind|2}}O. Mais la conscience est un cas singulier : elle n'a pas d'apparence distincte de son être, puisqu'elle est précisément l'apparaître. Là où l'eau cache une nature derrière son aspect, l'expérience ne cache rien : sentir le rouge, c'est qu'il y a du rouge ressenti. Les deux intensions coïncident, de sorte que l'objection tirée de Kripke ne s'applique pas à la conscience. La concevabilité du zombie, soutient Chalmers, vaut alors comme indice de possibilité.
=== Les trois arguments contre le matérialisme ===
L'argument du zombie n'est qu'une voie parmi d'autres. Chalmers le replace dans une famille d'« arguments épistémiques » contre le matérialisme, qui tous concluent d'un écart dans l'ordre de la connaissance à un écart dans l'ordre de l'être<ref>D. Chalmers, « Consciousness and Its Place in Nature », dans ''The Character of Consciousness'', chap. 5, sect. 2-3.</ref>.
Le premier est l'argument de la concevabilité, celui du zombie. Le deuxième est l'argument de la connaissance, dû à Frank Jackson : Mary, neuroscientifique enfermée depuis sa naissance dans une chambre en noir et blanc, connaît tous les faits physiques de la vision des couleurs ; le jour où elle voit le rouge pour la première fois, elle apprend pourtant quelque chose de neuf, ce que cela fait de voir le rouge. Si elle savait déjà tout le physique et qu'il lui restait à apprendre, c'est que tout le physique ne suffit pas. Le troisième est l'argument explicatif, déjà rencontré : l'explication fonctionnelle, si complète soit-elle, laisse intact le problème de l'expérience. Les trois partagent une même charpente, passer d'une impossibilité de déduction à une différence dans les faits, et Chalmers en propose une analyse commune, par où l'on aperçoit ce que chacun suppose et où chacun peut être contesté.
Et de fait, les matérialistes ne se tiennent pas pour battus, et leurs objections dessinent en creux les points sensibles de la démarche. Les uns refusent que le zombie soit réellement concevable : ce qui passe pour une conception claire dissimulerait, à l'examen, une incohérence, faute qu'on saisisse vraiment ce que serait un double physiquement complet. D'autres accordent la concevabilité mais refusent le pas vers la possibilité métaphysique : à leurs yeux, la stratégie dite des concepts phénoménaux explique l'écart par la singularité de nos façons de penser l'expérience, sans qu'il faille une dualité dans les choses. D'autres enfin nient qu'un écart dans l'ordre de la connaissance entraîne un écart dans l'ordre de l'être : que l'on ne puisse déduire l'expérience du physique tiendrait à nos concepts, non au monde. Chalmers oppose à chacune une réponse, mais c'est sur ces trois fronts que se joue l'essentiel de la controverse.
== Le dualisme naturaliste ==
Si le matérialisme échoue, faut-il revenir à Descartes ? Chalmers s'en garde. Le [[Dictionnaire de philosophie/Dualisme|dualisme]] qu'il défend n'est pas un dualisme des substances, avec un esprit séparé agissant sur le corps. C'est un dualisme des propriétés : l'expérience est une propriété d'un individu qui n'est pas entraînée par ses propriétés physiques, sans constituer pour autant une seconde substance<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 1 et 6 ; pour les équivalents français adoptés ici (« survenance », « explication réductrice »), voir ''L'Esprit conscient'', trad. Stéphane Dunand, Ithaque, 2010.</ref>.
=== Propriétés et lois psychophysiques ===
La thèse se laisse formuler dans le vocabulaire de la survenance, c'est-à-dire de la dépendance : la conscience ne survient pas logiquement sur le physique, elle n'en découle pas par simple analyse, et c'est ce qui distingue cette position d'un matérialisme déguisé. Le verbe que l'on emploie d'ordinaire est révélateur : on dit volontiers que l'esprit « émerge » du cerveau, alors qu'on ne dirait pas que l'apprentissage en émerge ; ce besoin d'un terme d'apparition trahit qu'il se passe là quelque chose de plus que les seuls faits physiques. Pour intégrer la conscience à une théorie de la nature, il faut admettre de nouvelles propriétés premières et de nouvelles lois, des lois psychophysiques reliant le physique au phénoménal. Ces lois ne contredisent pas les lois physiques, qui forment déjà un système clos ; elles s'y ajoutent, en disant comment l'expérience naît des processus du monde. Chalmers envisage aussi que les propriétés premières ne soient pas elles-mêmes phénoménales mais « protophénoménales », à partir desquelles le phénoménal serait composé, comme la température se compose du mouvement de particules qui, prises une à une, ne sont pas chaudes.
=== L'analogie de l'électromagnétisme ===
Pour montrer qu'une telle extension n'a rien d'antiscientifique, Chalmers rappelle l'histoire de l'électromagnétisme. Au XIX{{e}} siècle, on avait tenté de réduire les phénomènes électromagnétiques aux principes mécaniques déjà connus ; l'entreprise échoua. Il fallut tenir la charge et les champs pour des grandeurs premières et, avec Maxwell, poser de nouvelles lois. Ce ne fut pas renoncer à la science, mais élargir son inventaire. De même, suggère Chalmers, expliquer la conscience demande d'ajouter de nouvelles grandeurs et de nouvelles lois à la liste de ce qui est premier. Sa position se dit « naturaliste » pour cette raison : elle ne fait appel à rien de surnaturel ni de transcendant, elle maintient que tout procède d'un réseau de propriétés et de lois de base, et que la conscience est un phénomène naturel parmi d'autres. Sur un point, le dualiste naturaliste se tient même plus près du matérialiste que des dualismes classiques, puisqu'il accorde que le comportement, comme tout fait physique, a des causes physiques.
=== L'objection de l'épiphénoménisme ===
Cette dernière concession soulève aussitôt une difficulté. Si la cause de tout comportement est déjà physique, à quoi sert l'expérience ? Ne risque-t-elle pas d'être un épiphénomène, un reflet sans pouvoir, qui accompagne les processus du cerveau sans rien y faire ? Chalmers nomme « paradoxe du jugement phénoménal » la version la plus aiguë de l'objection : nos discours sur la conscience, nos déclarations mêmes, paraissent avoir une cause entièrement physique ; mais alors comment se rapportent-ils à l'expérience, et comment l'expérience pourrait-elle les rendre justes<ref>D. Chalmers, ''The Conscious Mind'', chap. 5 (« The Paradox of Phenomenal Judgment ») ; et ''The Character of Consciousness'', chap. 5, sect. sur le type-E.</ref> ? Chalmers ne tranche pas d'un mot. Il explore plusieurs réponses, dont l'une l'attire : l'expérience pourrait jouer un rôle non comme une force ajoutée au monde physique, mais comme la nature intrinsèque même des processus que la physique ne décrit que par leurs relations. Cette piste le conduit au monisme russellien.
== Une carte des positions sur la conscience ==
L'un des apports les plus utiles de Chalmers est une cartographie ordonnée des réponses possibles au problème difficile. Toutes se distinguent par la manière dont elles traitent l'écart épistémique entre le physique et le phénoménal<ref>D. Chalmers, « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 4 à 11. La typologie en types A à F y est exposée en détail.</ref>.
Trois familles relèvent du matérialisme. Le type A nie l'écart : il n'y aurait pas de problème supplémentaire une fois les fonctions expliquées ; l'éliminativisme et certaines formes de fonctionnalisme analytique en relèvent, comme l'illusionnisme, pour qui le sentiment d'un mystère provient d'une représentation trompeuse de nos propres états. Le type B reconnaît un écart durable dans l'ordre de la connaissance, mais le tient pour compatible avec une identité dans l'ordre de l'être, sur le modèle de l'identité a posteriori de l'eau et de H{{ind|2}}O ; c'est la « stratégie des concepts phénoménaux », qui explique l'écart par la singularité de nos concepts d'expérience plutôt que par une dualité dans les choses. Chalmers objecte, au moyen de la sémantique bidimensionnelle, que cette identité sans entraînement a priori reste inintelligible. Le type C, enfin, juge l'écart provisoire, voué à se combler quand notre science aura mûri ; Chalmers soutient qu'à l'examen il se rabat soit sur le type A, soit sur une forme de dualisme.
Deux familles relèvent du dualisme. Le type D, ou interactionnisme, prête à l'expérience un pouvoir sur le physique : les états phénoménaux agissent sur les états physiques, et la clôture causale du monde physique est niée. La figure historique en est Descartes ; Chalmers note qu'une lecture de la mécanique quantique, où la réduction du paquet d'ondes serait liée à l'observation par un sujet conscient, pourrait lui offrir un appui inattendu, sans pour autant l'imposer. Le type E, ou épiphénoménisme, tient au contraire que le phénoménal ne produit aucun effet physique : les lois psychophysiques ne courent que dans un sens, du physique vers le vécu. La position respecte à la fois les arguments contre le matérialisme et la clôture du physique, au prix d'une forte tension avec l'intuition ordinaire, puisque ce ne serait pas la douleur qui ferait retirer la main du feu. Chalmers la juge cohérente mais inélégante.
Reste une sixième voie, qui n'est ni tout à fait matérialiste ni tout à fait dualiste, et à laquelle il accorde la préférence : le type F, ou monisme russellien.
== Le monisme russellien et le panpsychisme ==
L'idée prend appui sur une remarque que Bertrand Russell développait dans ''The Analysis of Matter''. La physique ne caractérise ses objets que par leurs relations et leurs dispositions. Un quark se décrit par ses interactions ; la masse se définit par une tendance, celle de résister à l'accélération. De la nature intrinsèque qui soutient ces dispositions, de ce qui est en jeu lorsque la causalité relie deux entités, la physique ne dit rien. Or il paraît peu satisfaisant d'imaginer un monde de pures relations entre des termes sans qualités propres, un réseau de dispositions ne disposant de rien. Il doit y avoir une nature intrinsèque sous la structure<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 3 (« The intrinsic nature of the physical ») ; et « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 11.</ref>.
Deux énigmes se font alors face : quelle est la nature intrinsèque des entités physiques, et comment loger l'expérience dans le monde physique ? La proposition de Russell, que Chalmers reprend, est de les résoudre d'un seul coup. Et si la nature intrinsèque du physique était elle-même de nature phénoménale, ou protophénoménale ? La structure que décrit la physique serait portée par des qualités qui, prises ensemble, constituent l'expérience. Cette position a des airs de [[Dictionnaire de philosophie/Métaphysique|métaphysique]] audacieuse, mais elle offre des avantages : elle intègre étroitement le phénoménal au physique, elle reste compatible avec la clôture causale et avec les lois physiques telles qu'elles sont, et elle assigne aux propriétés phénoménales ou protophénoménales un rôle circonscrit : réaliser de l'intérieur les dispositions [[Dictionnaire de philosophie/Causalité|causales]] que la physique décrit du dehors. Selon la part qu'on accorde aux propriétés phénoménales ou seulement protophénoménales, la doctrine prend le nom de panpsychisme, où la conscience serait présente jusque dans les entités élémentaires, ou de panprotopsychisme, plus prudent.
Chalmers ne cache ni l'étrangeté de la thèse ni son principal obstacle. L'étrangeté : faut-il admettre qu'il y a quelque chose que cela fait d'être un électron ? La version protophénoménale atténue la formule sans tout à fait la dissiper. L'obstacle, plus sérieux, est ce qu'il nomme le « problème de la combinaison » : à supposer que les composants élémentaires aient des micro-expériences, on ne voit pas comment celles-ci s'assembleraient en l'expérience unifiée d'un sujet. Le problème reste ouvert, et Chalmers le tient pour la principale épreuve de cette famille de positions.
== Le principe d'invariance organisationnelle ==
Une thèse plus précise traverse ces discussions et touche directement à la question des machines. Chalmers soutient que l'expérience consciente est un invariant de l'organisation fonctionnelle : deux systèmes qui partagent la même organisation, dans ses détails pertinents, ont les mêmes états conscients, quelle que soit la matière qui les réalise<ref>D. Chalmers, ''The Conscious Mind'', chap. 7 (« Absent Qualia, Fading Qualia, Dancing Qualia ») ; rendu français des termes dans ''L'Esprit conscient'', trad. S. Dunand.</ref>.
Il l'établit par deux expériences de pensée. Supposons qu'on remplace, un à un, les neurones d'un cerveau par des puces de silicium fonctionnellement équivalentes, jusqu'à obtenir un double de silicium. Que devient l'expérience au fil du remplacement ? Si elle s'éteignait peu à peu, on aurait des « qualia évanescents » : il existerait un moment où le sujet, encore parfaitement disposé à juger de ses états, se tromperait du tout au tout sur leur intensité, croyant voir des couleurs vives alors qu'elles s'estompent. Si, au contraire, on imaginait un circuit que l'on bascule entre deux réalisations, on aurait des « qualia dansants », des expériences sautant d'une qualité à l'autre sans que le sujet s'en aperçoive. Ces deux scénarios conduisent à admettre qu'un sujet pourrait être massivement coupé de sa propre expérience, ce que Chalmers tient pour absurde. Il en conclut que les qualia suivent l'organisation et non le substrat. La conséquence est notable : un système non biologique convenablement organisé, et donc en principe une machine, pourrait être le siège d'une expérience. Cette thèse, qui semble faire un pas vers le fonctionnalisme, demeure compatible avec le dualisme des propriétés, car l'invariance y a le statut d'une loi psychophysique et non d'une identité.
== L'esprit étendu ==
Dans ces mêmes années, et sur un tout autre terrain, Chalmers avait, avec le philosophe Andy Clark, exploré une autre question, étrangère à la conscience mais devenue un classique de la philosophie de l'esprit. Dans un article de 1998, les deux auteurs proposent un « principe de parité » : si une opération accomplie dans le monde, à l'aide d'un support externe, joue le rôle qu'une opération accomplie dans la tête remplirait, alors elle fait partie au même titre du processus cognitif<ref>A. Clark et D. Chalmers, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19. Ce texte ne figure pas dans les quatre livres ici commentés mais prolonge le programme de l'auteur.</ref>. L'exemple est celui d'Otto, dont la mémoire défaillante l'oblige à consigner les adresses dans un carnet : ce carnet remplit pour lui la fonction que la mémoire biologique remplit pour Inga ; il appartient donc, soutiennent les auteurs, à l'esprit d'Otto. Cet « externalisme actif » étend l'esprit au-delà de la peau et du crâne, et trouve une actualité dans nos usages du carnet, du téléphone et du réseau, devenus des prolongements de la mémoire et du calcul.
== La scrutabilité du monde ==
Le deuxième grand chantier de Chalmers, exposé dans ''Constructing the World'' (2012), paraît d'abord éloigné de la conscience. Il y reprend un projet que Rudolf Carnap avait formulé en 1928 dans ''Der logische Aufbau der Welt'', la reconstruction de tout notre savoir à partir d'une base réduite, et le relie à une idée plus ancienne encore, celle du démon de Laplace<ref>D. Chalmers, ''Constructing the World'', Oxford University Press, 2012, introduction et chap. 1 à 3. L'ouvrage reprend les six conférences John Locke prononcées à Oxford en 2010.</ref>.
=== L'héritage de Carnap et de Laplace ===
Laplace imaginait une intelligence qui, connaissant à un instant la position de toutes les particules et les lois de la nature, embrasserait d'une seule formule le passé et l'avenir. Chalmers généralise : sa « thèse de scrutabilité » affirme qu'il existe une classe restreinte de vérités de base à partir desquelles toutes les vérités du monde sont accessibles à un raisonnement idéal. Le monde, en ce sens, est compréhensible : du socle on peut, en droit, remonter au reste. Le démon de Laplace n'est qu'un cas particulier, et un cas trop pauvre, car l'information physique seule ne suffit pas. Pour atteindre les vérités sur l'expérience, il faut adjoindre au socle des vérités sur la conscience ; pour atteindre les vérités sur le présent ou sur soi, des vérités indexicales ; et une clause de totalité, pour exclure ce qui n'est pas.
=== La base et le Cosmoscope ===
Chalmers nomme ce socle, d'une formule, PQTI : les vérités de la physique (P), les vérités phénoménales ou qualia (Q), une vérité de totalité disant que le monde est minimal (T), et les vérités indexicales (I). De cette base, soutient-il, toutes les autres vérités sont scrutables, et même scrutables a priori, par déduction idéale : c'est la part de « rationalisme modal » de son entreprise. Pour rendre l'idée tangible, il invente un instrument fictif, le Cosmoscope, qui stockerait toute l'information de base et la rendrait utilisable : un calculateur de capacité illimitée, des outils pour explorer la distribution de la matière, un dispositif de réalité virtuelle pour transmettre les états phénoménaux décrits par Q, un repère « vous êtes ici » pour l'indexical, et des modules de simulation pour les vérités conditionnelles. Le détail compte moins que la thèse : un sujet idéal disposant d'une telle base aurait en principe de quoi établir toute vérité sur le monde, par le seul raisonnement.
Le projet rejoint alors la philosophie de l'esprit. Que les vérités phénoménales doivent figurer à part dans la base, qu'on ne puisse les scruter à partir des seules vérités physiques, c'est l'envers, dans l'ordre de la connaissance, de l'échec du matérialisme. La structure de ''Constructing the World'' confirme ainsi, par un autre chemin et avec d'autres outils ([[Dictionnaire de philosophie/Épistémologie|épistémologie]] de l'inférence, sémantique bidimensionnelle), la thèse du premier livre.
== Réalité virtuelle et technophilosophie ==
Le dernier versant de l'œuvre, esquissé dès un essai de 2003 sur le film ''Matrix'' et déployé dans ''Reality+'' (2022), porte sur la réalité, la connaissance du monde extérieur et la technologie<ref>D. Chalmers, « The Matrix as Metaphysics », ''The Character of Consciousness'', chap. 13 ; et ''Reality+: Virtual Worlds and the Problems of Philosophy'', W. W. Norton et Allen Lane, 2022 (édition de poche Penguin, 2023).</ref>.
=== La simulation comme hypothèse métaphysique ===
Reprenons le doute de Descartes, repeint aux couleurs du jour. Comment savoir que je ne suis pas, en ce moment même, dans une simulation informatique, comme les habitants de ''Matrix'' ? Chalmers soutient une thèse contre-intuitive : à supposer que nous y soyons, nos croyances ordinaires ne seraient pas pour autant fausses. L'hypothèse de la simulation n'est pas une hypothèse [[Dictionnaire de philosophie/Scepticisme|sceptique]] qui ruinerait notre savoir, mais une hypothèse métaphysique sur la nature ultime des choses. Si nous sommes dans une simulation, les tables et les chaises existent bel et bien : ce sont des objets numériques, faits de bits, et nos propos à leur sujet sont vrais des structures de données qui les réalisent. Chalmers relie cette idée à l'hypothèse, présente en physique, d'un monde fait d'information (l{{'}}''it from bit''). La simulation ne dissout pas la réalité, elle lui prête une nature cachée, un peu comme la physique loge sous le monde sensible un substrat qui n'a pas l'aspect de ce qu'il fonde. C'est par là, et non par une réfutation directe du doute, que Chalmers entend répondre au problème du monde extérieur posé par [[Dictionnaire de philosophie/René Descartes|Descartes]].
=== Le réalisme virtuel ===
De ce diagnostic Chalmers tire une thèse générale, qu'il nomme réalisme virtuel et résume d'une phrase : la réalité virtuelle est une réalité authentique. Le livre articule autour d'elle trois affirmations. D'abord, les mondes virtuels ne sont pas des illusions ni des fictions : ce qui s'y produit s'y produit réellement, et les objets qu'on y manipule sont réels, à titre d'objets numériques. Ensuite, on peut mener dans un monde virtuel une vie pleinement sensée, non un simple divertissement d'évasion. Enfin, rien ne nous assure que notre propre monde n'est pas lui-même virtuel : c'est une possibilité que nous ne pouvons écarter, d'autant que les arguments statistiques sur la prolifération des simulations, qu'on doit à Nick Bostrom, lui donnent un poids. L'ensemble de la démarche relève de ce que Chalmers appelle la « technophilosophie », un va-et-vient entre deux tâches : poser sur la technologie des questions philosophiques, et se servir de la technologie pour éclairer de vieilles questions de la philosophie.
== Le méta-problème de la conscience ==
Dans un texte de 2018, Chalmers ajoute à son dispositif une question qu'il juge centrale : le « méta-problème » de la conscience, c'est-à-dire le problème d'expliquer pourquoi nous croyons qu'il y a un problème difficile<ref>D. Chalmers, « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.</ref>. Il s'agit de rendre compte de nos « intuitions de problème », de nos déclarations selon lesquelles la conscience serait irréductible ou la qualité du rouge distincte de toute propriété physique, et de le faire en termes neutres, physiques ou fonctionnels, sans présupposer la conscience. Le méta-problème a ceci d'intéressant qu'il appartient, lui, à la classe des problèmes faciles : il porte sur des comportements et des rapports, qui se laissent en principe expliquer.
L'enjeu n'est pas mince. Si l'on parvenait à expliquer nos intuitions de problème sans jamais invoquer l'expérience, on disposerait d'un argument pour l'illusionnisme, la thèse selon laquelle la conscience phénoménale, telle que nous la concevons, est une sorte d'illusion introspective. Chalmers, qui demeure réaliste à l'égard de la conscience, prend pourtant le méta-problème au sérieux et avoue que, s'il était matérialiste, c'est l'illusionnisme qu'il choisirait. Il recense une quinzaine de solutions candidates et marque sa sympathie pour plusieurs d'entre elles, sans trancher. La manœuvre est typique de sa façon de faire : tendre la main à la position adverse, en éprouver la force, et laisser au lecteur le soin de conclure.
== Réception et postérité ==
L'œuvre de Chalmers a laissé une empreinte durable sur la philosophie de l'esprit. La distinction du facile et du difficile a fourni à tout un champ son vocabulaire et son ordre du jour ; rares sont les discussions sur la conscience qui ne s'y réfèrent, fût-ce pour la contester. Les adversaires se répartissent selon la carte que Chalmers a lui-même dessinée. Daniel Dennett tient le problème difficile pour un mirage et range Chalmers parmi ceux qui prennent une difficulté d'imagination pour une découverte métaphysique. Les tenants de la stratégie des concepts phénoménaux, du côté du matérialisme de type B, contestent le passage de la concevabilité à la possibilité. D'autres jugent que les zombies ne sont pas réellement concevables, ou que l'épiphénoménisme menace la connaissance même de l'expérience. Le panpsychisme auquel Chalmers donne droit de cité bute, on l'a vu, sur le problème de la combinaison.
Au-delà des thèses, son influence tient à une attitude et à des institutions. L'attitude : avoir rendu la conscience à la philosophie comme un problème sérieux, ni honteux ni clos, et avoir montré qu'on pouvait en traiter avec les instruments les plus exigeants de la logique et de la sémantique. Les institutions : la base PhilPapers, qu'il a cofondée et qui a transformé l'accès à la littérature philosophique, et les grandes enquêtes sur les opinions des philosophes, qui ont donné au champ une image de lui-même. Ses travaux récents sur l'intelligence artificielle, et sur la question de savoir si de grands modèles de langage pourraient un jour être conscients ou penser, prolongent une préoccupation présente chez lui depuis ses années auprès de Hofstadter. La conscience, écrivait-il au seuil de son premier livre, est peut-être le plus grand obstacle qui reste sur la route d'une compréhension scientifique de l'univers ; toute son œuvre s'emploie à le cerner sans en masquer la difficulté.
== Notes et références ==
{{références|colonnes=2}}
== Bibliographie ==
=== Œuvres de David Chalmers ===
* ''The Conscious Mind: In Search of a Fundamental Theory'', New York, Oxford University Press, 1996.
* ''The Character of Consciousness'', New York, Oxford University Press, 2010.
* ''Constructing the World'', Oxford, Oxford University Press, 2012.
* ''Reality+: Virtual Worlds and the Problems of Philosophy'', New York, W. W. Norton et Londres, Allen Lane, 2022 (édition de poche, Penguin, 2023).
* « Facing Up to the Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 2, n{{o}} 3, 1995, p. 200-219.
* avec Andy Clark, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19.
* « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.
* « Could a Large Language Model Be Conscious? », ''Boston Review'', 2023.
* « Does Thought Require Sensory Grounding? From Pure Thinkers to Large Language Models », ''Proceedings and Addresses of the American Philosophical Association'', 2023.
=== Traduction française ===
* ''L'Esprit conscient. À la recherche d'une théorie fondamentale'', traduit de l'anglais par Stéphane Dunand, Paris, Ithaque, 2010 (traduction de ''The Conscious Mind'').
=== Études et ouvrages de référence ===
* Thomas Nagel, « What Is It Like to Be a Bat? », ''The Philosophical Review'', vol. 83, n{{o}} 4, 1974, p. 435-450.
* Frank Jackson, « Epiphenomenal Qualia », ''The Philosophical Quarterly'', vol. 32, n{{o}} 127, 1982, p. 127-136.
* Joseph Levine, « Materialism and Qualia: The Explanatory Gap », ''Pacific Philosophical Quarterly'', vol. 64, 1983, p. 354-361.
* Daniel Dennett, ''Consciousness Explained'', Boston, Little, Brown and Company, 1991.
* Bertrand Russell, ''The Analysis of Matter'', Londres, Kegan Paul, 1927.
* Denis Fisette et Pierre Poirier (dir.), ''Textes clés de philosophie de l'esprit'', Paris, Vrin, 2 vol., 2002-2003, anthologie de référence pour le débat francophone sur la conscience et les qualia.
* Daniel Stoljar, ''Physicalism'', Londres, Routledge, 2010.
* David Papineau, ''Thinking about Consciousness'', Oxford, Oxford University Press, 2002.
* Ned Block, « On a Confusion about a Function of Consciousness », ''Behavioral and Brain Sciences'', vol. 18, n{{o}} 2, 1995, p. 227-247.
* Brian Loar, « Phenomenal States », ''Philosophical Perspectives'', vol. 4, 1990, p. 81-108.
* Keith Frankish, « Illusionism as a Theory of Consciousness », ''Journal of Consciousness Studies'', vol. 23, n{{o}} 11-12, 2016, p. 11-39.
* Galen Strawson, « Realistic Monism: Why Physicalism Entails Panpsychism », ''Journal of Consciousness Studies'', vol. 13, n{{o}} 10-11, 2006, p. 3-31.
* Philip Goff, ''Consciousness and Fundamental Reality'', Oxford, Oxford University Press, 2017.
* Michael Tye, ''Ten Problems of Consciousness'', Cambridge (Massachusetts), MIT Press, 1995.
{{DEFAULTSORT:Chalmers}}
[[Catégorie:Dictionnaire de philosophie (livre)]]
[[Catégorie:Philosophe]]
[[Catégorie:Philosophie de l'esprit]]
[[Catégorie:Métaphysique]]
[[Catégorie:Épistémologie]]
qqe0y9flgm03sjkqpww6rnfci695o40
768295
768294
2026-06-22T04:55:42Z
PandaMystique
119061
768295
wikitext
text/x-wiki
{{DicoPhilo|David Chalmers|lecture=oui}}
[[Fichier:David chalmers.jpg|vignette|upright=1.1|David Chalmers en 2021.]]
'''David Chalmers''', né en 1966 à Sydney, est un philosophe australien qui compte parmi les figures centrales de la philosophie de l'esprit contemporaine. On lui doit la formulation la plus reprise du problème de la conscience : la distinction entre les « problèmes faciles », que les sciences cognitives savent en principe traiter, et le « problème difficile », celui de l'expérience vécue, qui leur échappe. Son premier livre, ''The Conscious Mind'' (1996), traduit en français sous le titre ''L'Esprit conscient'', défend une stratégie antiréductionniste et une position qu'il nomme « dualisme naturaliste ».
Une même intuition traverse toute son œuvre. La physique décrit le monde par sa structure et sa dynamique, c'est-à-dire par un réseau de relations et de dispositions ; elle ne dit rien de la nature intrinsèque des choses qui entrent dans ces relations, ni de ce que cela fait d'être un sujet. Or l'expérience, la sensation du rouge ou le goût du café, paraît rétive à toute description purement structurale. De ce point d'appui Chalmers tire une critique du matérialisme, une cartographie des positions possibles sur la conscience, puis le projet, plus tardif, d'une reconstruction du savoir à partir d'une base réduite de vérités (''Constructing the World'', 2012) et une enquête sur la réalité virtuelle (''Reality+'', 2022). On lui doit aussi, avec Andy Clark, l'hypothèse de l'« esprit étendu ». Cofondateur de la base de données PhilPapers, il enseigne à l'université de New York.
== Repères biographiques ==
David John Chalmers naît le 20 avril 1966 à Sydney et grandit à Adélaïde, en Australie. Enfant, il fait l'expérience de la synesthésie, ce mélange des sens où une perception en éveille spontanément une autre : sans doute sa première rencontre, vécue de l'intérieur, avec l'étrangeté de l'expérience consciente. Il manifeste très tôt un intérêt marqué pour les mathématiques, décroche une médaille de bronze aux Olympiades internationales de mathématiques, et découvre vers treize ans le livre de Douglas Hofstadter ''Gödel, Escher, Bach'', qui éveille son goût pour les questions de l'esprit et de la machine<ref>Pour le détail biographique, voir D. Chalmers, « Bio » et « Curriculum Vitae », sur consc.net, ainsi que l'entretien autobiographique accordé à Clifford Sosis, « What Is It Like to Be a Philosopher? », 2016. La synesthésie, la médaille aux Olympiades de mathématiques, le séjour de lecture en Europe et la lecture précoce de ''Gödel, Escher, Bach'' y sont rapportés.</ref>.
Il obtient d'abord un diplôme de mathématiques pures à l'université d'Adélaïde. Après six mois passés à lire de la philosophie en parcourant l'Europe en auto-stop, il rejoint Oxford comme boursier Rhodes, mais s'aperçoit que l'esprit l'occupe davantage que les mathématiques et change de discipline. Il part aux États-Unis, à l'université de l'Indiana, où il prépare sous la direction de Hofstadter une thèse de philosophie et de sciences cognitives soutenue en 1993, intitulée ''Toward a Theory of Consciousness''. Une bourse postdoctorale au programme « philosophie, neurosciences, psychologie » de l'université Washington à Saint-Louis, où il travaille auprès d'Andy Clark de 1993 à 1995, lui donne le cadre où il met au point son premier livre et où naît, avec Clark, le travail sur l'esprit étendu.
En 1994, une intervention à la conférence ''Toward a Science of Consciousness'' de Tucson le fait connaître : c'est là qu'il met en circulation l'expression de « problème difficile ». Il cofonde l'Association pour l'étude scientifique de la conscience, dont il présidera la société. Sa carrière le mène ensuite de l'université de Californie à Santa Cruz à l'université d'Arizona, où il dirige le Center for Consciousness Studies, puis, en 2004, de retour en Australie, à l'université nationale australienne grâce à une bourse fédérale de recherche. Il rejoint l'université de New York en 2009, à temps partiel d'abord, puis à plein temps, comme professeur de philosophie et de neurosciences et codirecteur du Center for Mind, Brain, and Consciousness. Élu à l'Académie américaine des arts et des sciences en 2013, il a cofondé avec David Bourget l'archive PhilPapers, qui recense la littérature philosophique mondiale, et conduit les enquêtes statistiques sur les opinions des philosophes professionnels. Un trait de son tempérament intellectuel : en 1998, il avait parié une caisse de vin avec le neuroscientifique Christof Koch que les bases neuronales de la conscience ne seraient pas élucidées sous vingt-cinq ans ; il a gagné ce pari en 2023<ref>Le pari et son issue sont relatés dans la presse scientifique en 2023. Sur le fond, voir D. Chalmers, ''The Character of Consciousness'', Oxford University Press, 2010, chap. 3 et 4, sur la notion de corrélat neuronal de la conscience.</ref>.
Le style de Chalmers tient pour modèle la clarté analytique : des distinctions nettes, des expériences de pensée bien découpées, un outillage logique (la sémantique bidimensionnelle) au service de problèmes que d'autres préfèrent laisser dans le clair-obscur. Il s'efforce, selon sa propre formule, de prendre la conscience au sérieux, sans la dissoudre dans le vocabulaire fonctionnel ni la déclarer hors d'atteinte.
== Le problème difficile de la conscience ==
L'argument qui a porté son nom tient dans une distinction. Le mot « conscience » recouvre plusieurs phénomènes, et certains se laissent expliquer bien plus aisément que d'autres<ref>D. Chalmers, « Facing Up to the Problem of Consciousness » (1995), repris dans ''The Character of Consciousness'', chap. 1 ; voir aussi ''The Conscious Mind'', introduction et chap. 1.</ref>.
=== Les problèmes faciles ===
Chalmers range parmi les « problèmes faciles » de la conscience un ensemble de fonctions : la capacité de discriminer les stimuli et d'y réagir, l'intégration de l'information par un système cognitif, la possibilité de rapporter verbalement ses états internes, l'accès d'un système à ses propres états, la concentration de l'attention, le contrôle délibéré de l'action, la différence entre veille et sommeil. Ces phénomènes sont « faciles » en un sens précis et relatif : non qu'on sache déjà les expliquer dans le détail, mais qu'on voie clairement à quoi ressemblerait leur explication. Il suffit, pour chacun, d'exhiber le mécanisme cognitif ou neuronal qui le produit. Le travail empirique pourra être long, mais son type d'explication, lui, est identifiable.
=== Le résidu : l'expérience ===
Reste, lorsque toutes ces fonctions ont été expliquées, un résidu. Pourquoi ce traitement de l'information s'accompagne-t-il d'une vie intérieure ? Lorsque nous percevons, nous éprouvons des qualités : le rouge d'une tomate mûre, le timbre d'une clarinette, l'odeur du café, la douleur d'une brûlure. Ce que le philosophe Thomas Nagel a nommé le « ce que c'est que » d'un état, l'effet que cela fait d'être dans cet état, voilà l'explanandum du problème difficile. On peut décrire complètement les processus physiques d'un cerveau sans avoir encore dit pourquoi ils sont vécus de l'intérieur, ni même pourquoi ils le sont du tout.
Chalmers reprend ici l'idée d'un « fossé explicatif », formulée par Joseph Levine : entre une description physique ou fonctionnelle et le fait de l'expérience, l'explication n'a pas la même nécessité transparente que dans le reste des sciences. Que l'eau soit H{{ind|2}}O nous fait comprendre pourquoi elle bout, gèle, dissout ; mais d'une description complète des circuits cérébraux on ne déduit pas avec la même évidence pourquoi il y a là quelque chose de ressenti. Pour clarifier les enjeux, Chalmers propose de réserver le terme de « conscience » au phénomène de l'expérience, et de regrouper sous le nom de conscience d'accès, ou disponibilité fonctionnelle de l'information (''awareness''), l'ensemble des capacités fonctionnelles plus traitables : l'accès d'une information au contrôle délibéré des conduites. Bien des débats, observe-t-il, tiennent à ce que les interlocuteurs parlent, sous le même mot, de deux choses différentes.
Le problème difficile n'est pas un appel au désespoir. Il invite à reconnaître que la conscience n'est pas un cas ordinaire, et que les méthodes qui ont réussi ailleurs ne suffiront pas telles quelles. C'est à partir de ce constat, et non contre lui, que Chalmers cherche une théorie.
== L'argument du zombie et la critique du matérialisme ==
Pour montrer que l'expérience n'est pas entraînée logiquement par les seuls faits physiques, Chalmers recourt à une [[Dictionnaire de philosophie/Expérience de pensée|expérience de pensée]] devenue célèbre.
=== Le jumeau zombie ===
Imaginons un être physiquement identique à moi, molécule pour molécule, plongé dans le même environnement, et dépourvu de toute expérience. Chalmers l'appelle mon « jumeau zombie ». Ce double me ressemble jusque dans le moindre détail fonctionnel : il traite la même information, réagit comme moi, module ses états internes comme les miens, produit les mêmes phrases. Il se dira même « conscient » : il est éveillé, rapporte ses états, dirige son attention. Simplement, rien de tout cela ne s'accompagne du moindre vécu. Il n'y a rien que cela fasse d'être lui.
Ce zombie philosophique n'a rien du mort-vivant du cinéma, lequel souffre justement de déficits fonctionnels. La question n'est pas de savoir si de tels êtres existent, ni même s'ils pourraient apparaître dans notre monde ; il est probable que tout double physique de moi serait, en fait, conscient. La question est seulement de savoir si l'idée d'un zombie est cohérente, exempte de contradiction cachée. Encore ne s'agit-il pas d'une vague impression : Chalmers a en vue une concevabilité idéale et positive, stabilisée à la réflexion, dont il soutiendra qu'elle donne une raison de reconnaître la possibilité du scénario. De même qu'un monocycle haut d'un mille, soit plus d'un kilomètre et demi, n'existe pas mais se conçoit sans contradiction, le scénario du zombie paraît concevable.
=== De la concevabilité à la possibilité ===
L'argument, dès lors, prend la forme suivante. Si un monde zombie, physiquement identique au nôtre mais sans aucune expérience, est concevable, alors un tel monde est métaphysiquement possible ; or, si ce monde est possible, c'est que les faits physiques ne suffisent pas à fixer les faits de l'expérience ; donc le matérialisme, selon lequel tout fait est fixé par les faits physiques, est faux. Tout le poids repose sur le passage du concevable au possible.
C'est là que Saul Kripke avait élevé une difficulté : certaines vérités sont nécessaires tout en n'étant connaissables qu'a posteriori, comme l'identité de l'eau et de H{{ind|2}}O. On pourrait donc concevoir un monde sans pour autant établir sa possibilité réelle. Chalmers répond au moyen de la sémantique bidimensionnelle, qu'il développe en propre<ref>D. Chalmers, « The Two-Dimensional Argument against Materialism », dans ''The Character of Consciousness'', chap. 6, et l'appendice « Two-Dimensional Semantics » du même ouvrage.</ref>. Un terme a deux valeurs : une intension primaire, qui suit la manière dont il se rapporte au monde tel qu'il nous apparaît, et une intension secondaire, qui dépend de la nature réelle de ce qu'il désigne. Pour l'eau, les deux divergent : la chose qui nous apparaît comme de l'eau pourrait, dans un autre monde, n'être pas H{{ind|2}}O. Mais la conscience est un cas singulier : elle n'a pas d'apparence distincte de son être, puisqu'elle est précisément l'apparaître. Là où l'eau cache une nature derrière son aspect, l'expérience ne cache rien : sentir le rouge, c'est qu'il y a du rouge ressenti. Les deux intensions coïncident, de sorte que l'objection tirée de Kripke ne s'applique pas à la conscience. La concevabilité du zombie, soutient Chalmers, vaut alors comme indice de possibilité.
=== Les trois arguments contre le matérialisme ===
L'argument du zombie n'est qu'une voie parmi d'autres. Chalmers le replace dans une famille d'« arguments épistémiques » contre le matérialisme, qui tous concluent d'un écart dans l'ordre de la connaissance à un écart dans l'ordre de l'être<ref>D. Chalmers, « Consciousness and Its Place in Nature », dans ''The Character of Consciousness'', chap. 5, sect. 2-3.</ref>.
Le premier est l'argument de la concevabilité, celui du zombie. Le deuxième est l'argument de la connaissance, dû à Frank Jackson : Mary, neuroscientifique enfermée depuis sa naissance dans une chambre en noir et blanc, connaît tous les faits physiques de la vision des couleurs ; le jour où elle voit le rouge pour la première fois, elle apprend pourtant quelque chose de neuf, ce que cela fait de voir le rouge. Si elle savait déjà tout le physique et qu'il lui restait à apprendre, c'est que tout le physique ne suffit pas. Le troisième est l'argument explicatif, déjà rencontré : l'explication fonctionnelle, si complète soit-elle, laisse intact le problème de l'expérience. Les trois partagent une même charpente, passer d'une impossibilité de déduction à une différence dans les faits, et Chalmers en propose une analyse commune, par où l'on aperçoit ce que chacun suppose et où chacun peut être contesté.
Et de fait, les matérialistes ne se tiennent pas pour battus, et leurs objections dessinent en creux les points sensibles de la démarche. Les uns refusent que le zombie soit réellement concevable : ce qui passe pour une conception claire dissimulerait, à l'examen, une incohérence, faute qu'on saisisse vraiment ce que serait un double physiquement complet. D'autres accordent la concevabilité mais refusent le pas vers la possibilité métaphysique : à leurs yeux, la stratégie dite des concepts phénoménaux explique l'écart par la singularité de nos façons de penser l'expérience, sans qu'il faille une dualité dans les choses. D'autres enfin nient qu'un écart dans l'ordre de la connaissance entraîne un écart dans l'ordre de l'être : que l'on ne puisse déduire l'expérience du physique tiendrait à nos concepts, non au monde. Chalmers oppose à chacune une réponse, mais c'est sur ces trois fronts que se joue l'essentiel de la controverse.
== Le dualisme naturaliste ==
Si le matérialisme échoue, faut-il revenir à Descartes ? Chalmers s'en garde. Le [[Dictionnaire de philosophie/Dualisme|dualisme]] qu'il défend n'est pas un dualisme des substances, avec un esprit séparé agissant sur le corps. C'est un dualisme des propriétés : l'expérience est une propriété d'un individu qui n'est pas entraînée par ses propriétés physiques, sans constituer pour autant une seconde substance<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 1 et 6 ; pour les équivalents français adoptés ici (« survenance », « explication réductrice »), voir ''L'Esprit conscient'', trad. Stéphane Dunand, Ithaque, 2010.</ref>.
=== Propriétés et lois psychophysiques ===
La thèse se laisse formuler dans le vocabulaire de la survenance, c'est-à-dire de la dépendance : la conscience ne survient pas logiquement sur le physique, elle n'en découle pas par simple analyse, et c'est ce qui distingue cette position d'un matérialisme déguisé. Le verbe que l'on emploie d'ordinaire est révélateur : on dit volontiers que l'esprit « émerge » du cerveau, alors qu'on ne dirait pas que l'apprentissage en émerge ; ce besoin d'un terme d'apparition trahit qu'il se passe là quelque chose de plus que les seuls faits physiques. Pour intégrer la conscience à une théorie de la nature, il faut admettre de nouvelles propriétés premières et de nouvelles lois, des lois psychophysiques reliant le physique au phénoménal. Ces lois ne contredisent pas les lois physiques, qui forment déjà un système clos ; elles s'y ajoutent, en disant comment l'expérience naît des processus du monde. Chalmers envisage aussi que les propriétés premières ne soient pas elles-mêmes phénoménales mais « protophénoménales », à partir desquelles le phénoménal serait composé, comme la température se compose du mouvement de particules qui, prises une à une, ne sont pas chaudes.
=== L'analogie de l'électromagnétisme ===
Pour montrer qu'une telle extension n'a rien d'antiscientifique, Chalmers rappelle l'histoire de l'électromagnétisme. Au XIX{{e}} siècle, on avait tenté de réduire les phénomènes électromagnétiques aux principes mécaniques déjà connus ; l'entreprise échoua. Il fallut tenir la charge et les champs pour des grandeurs premières et, avec Maxwell, poser de nouvelles lois. Ce ne fut pas renoncer à la science, mais élargir son inventaire. De même, suggère Chalmers, expliquer la conscience demande d'ajouter de nouvelles grandeurs et de nouvelles lois à la liste de ce qui est premier. Sa position se dit « naturaliste » pour cette raison : elle ne fait appel à rien de surnaturel ni de transcendant, elle maintient que tout procède d'un réseau de propriétés et de lois de base, et que la conscience est un phénomène naturel parmi d'autres. Sur un point, le dualiste naturaliste se tient même plus près du matérialiste que des dualismes classiques, puisqu'il accorde que le comportement, comme tout fait physique, a des causes physiques.
=== L'objection de l'épiphénoménisme ===
Cette dernière concession soulève aussitôt une difficulté. Si la cause de tout comportement est déjà physique, à quoi sert l'expérience ? Ne risque-t-elle pas d'être un épiphénomène, un reflet sans pouvoir, qui accompagne les processus du cerveau sans rien y faire ? Chalmers nomme « paradoxe du jugement phénoménal » la version la plus aiguë de l'objection : nos discours sur la conscience, nos déclarations mêmes, paraissent avoir une cause entièrement physique ; mais alors comment se rapportent-ils à l'expérience, et comment l'expérience pourrait-elle les rendre justes<ref>D. Chalmers, ''The Conscious Mind'', chap. 5 (« The Paradox of Phenomenal Judgment ») ; et ''The Character of Consciousness'', chap. 5, sect. sur le type-E.</ref> ? Chalmers ne tranche pas d'un mot. Il explore plusieurs réponses, dont l'une l'attire : l'expérience pourrait jouer un rôle non comme une force ajoutée au monde physique, mais comme la nature intrinsèque même des processus que la physique ne décrit que par leurs relations. Cette piste le conduit au monisme russellien.
== Une carte des positions sur la conscience ==
L'un des apports les plus utiles de Chalmers est une cartographie ordonnée des réponses possibles au problème difficile. Toutes se distinguent par la manière dont elles traitent l'écart épistémique entre le physique et le phénoménal<ref>D. Chalmers, « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 4 à 11. La typologie en types A à F y est exposée en détail.</ref>.
Trois familles relèvent du matérialisme. Le type A nie l'écart : il n'y aurait pas de problème supplémentaire une fois les fonctions expliquées ; l'éliminativisme et certaines formes de fonctionnalisme analytique en relèvent, comme l'illusionnisme, pour qui le sentiment d'un mystère provient d'une représentation trompeuse de nos propres états. Le type B reconnaît un écart durable dans l'ordre de la connaissance, mais le tient pour compatible avec une identité dans l'ordre de l'être, sur le modèle de l'identité a posteriori de l'eau et de H{{ind|2}}O ; c'est la « stratégie des concepts phénoménaux », qui explique l'écart par la singularité de nos concepts d'expérience plutôt que par une dualité dans les choses. Chalmers objecte, au moyen de la sémantique bidimensionnelle, que cette identité sans entraînement a priori reste inintelligible. Le type C, enfin, juge l'écart provisoire, voué à se combler quand notre science aura mûri ; Chalmers soutient qu'à l'examen il se rabat soit sur le type A, soit sur une forme de dualisme.
Deux familles relèvent du dualisme. Le type D, ou interactionnisme, prête à l'expérience un pouvoir sur le physique : les états phénoménaux agissent sur les états physiques, et la clôture causale du monde physique est niée. La figure historique en est Descartes ; Chalmers note qu'une lecture de la mécanique quantique, où la réduction du paquet d'ondes serait liée à l'observation par un sujet conscient, pourrait lui offrir un appui inattendu, sans pour autant l'imposer. Le type E, ou épiphénoménisme, tient au contraire que le phénoménal ne produit aucun effet physique : les lois psychophysiques ne courent que dans un sens, du physique vers le vécu. La position respecte à la fois les arguments contre le matérialisme et la clôture du physique, au prix d'une forte tension avec l'intuition ordinaire, puisque ce ne serait pas la douleur qui ferait retirer la main du feu. Chalmers la juge cohérente mais inélégante.
Reste une sixième voie, qui n'est ni tout à fait matérialiste ni tout à fait dualiste, et à laquelle il accorde la préférence : le type F, ou monisme russellien.
== Le monisme russellien et le panpsychisme ==
L'idée prend appui sur une remarque que Bertrand Russell développait dans ''The Analysis of Matter''. La physique ne caractérise ses objets que par leurs relations et leurs dispositions. Un quark se décrit par ses interactions ; la masse se définit par une tendance, celle de résister à l'accélération. De la nature intrinsèque qui soutient ces dispositions, de ce qui est en jeu lorsque la causalité relie deux entités, la physique ne dit rien. Or il paraît peu satisfaisant d'imaginer un monde de pures relations entre des termes sans qualités propres, un réseau de dispositions ne disposant de rien. Il doit y avoir une nature intrinsèque sous la structure<ref>D. Chalmers, ''The Conscious Mind'', chap. 4, sect. 3 (« The intrinsic nature of the physical ») ; et « Consciousness and Its Place in Nature », ''The Character of Consciousness'', chap. 5, sect. 11.</ref>.
Deux énigmes se font alors face : quelle est la nature intrinsèque des entités physiques, et comment loger l'expérience dans le monde physique ? La proposition de Russell, que Chalmers reprend, est de les résoudre d'un seul coup. Et si la nature intrinsèque du physique était elle-même de nature phénoménale, ou protophénoménale ? La structure que décrit la physique serait portée par des qualités qui, prises ensemble, constituent l'expérience. Cette position a des airs de [[Dictionnaire de philosophie/Métaphysique|métaphysique]] audacieuse, mais elle offre des avantages : elle intègre étroitement le phénoménal au physique, elle reste compatible avec la clôture causale et avec les lois physiques telles qu'elles sont, et elle assigne aux propriétés phénoménales ou protophénoménales un rôle circonscrit : réaliser de l'intérieur les dispositions [[Dictionnaire de philosophie/Causalité|causales]] que la physique décrit du dehors. Selon la part qu'on accorde aux propriétés phénoménales ou seulement protophénoménales, la doctrine prend le nom de panpsychisme, où la conscience serait présente jusque dans les entités élémentaires, ou de panprotopsychisme, plus prudent.
Chalmers ne cache ni l'étrangeté de la thèse ni son principal obstacle. L'étrangeté : faut-il admettre qu'il y a quelque chose que cela fait d'être un électron ? La version protophénoménale atténue la formule sans tout à fait la dissiper. L'obstacle, plus sérieux, est ce qu'il nomme le « problème de la combinaison » : à supposer que les composants élémentaires aient des micro-expériences, on ne voit pas comment celles-ci s'assembleraient en l'expérience unifiée d'un sujet. Le problème reste ouvert, et Chalmers le tient pour la principale épreuve de cette famille de positions.
== Le principe d'invariance organisationnelle ==
Une thèse plus précise traverse ces discussions et touche directement à la question des machines. Chalmers soutient que l'expérience consciente est un invariant de l'organisation fonctionnelle : deux systèmes qui partagent la même organisation, dans ses détails pertinents, ont les mêmes états conscients, quelle que soit la matière qui les réalise<ref>D. Chalmers, ''The Conscious Mind'', chap. 7 (« Absent Qualia, Fading Qualia, Dancing Qualia ») ; rendu français des termes dans ''L'Esprit conscient'', trad. S. Dunand.</ref>.
Il l'établit par deux expériences de pensée. Supposons qu'on remplace, un à un, les neurones d'un cerveau par des puces de silicium fonctionnellement équivalentes, jusqu'à obtenir un double de silicium. Que devient l'expérience au fil du remplacement ? Si elle s'éteignait peu à peu, on aurait des « qualia évanescents » : il existerait un moment où le sujet, encore parfaitement disposé à juger de ses états, se tromperait du tout au tout sur leur intensité, croyant voir des couleurs vives alors qu'elles s'estompent. Si, au contraire, on imaginait un circuit que l'on bascule entre deux réalisations, on aurait des « qualia dansants », des expériences sautant d'une qualité à l'autre sans que le sujet s'en aperçoive. Ces deux scénarios conduisent à admettre qu'un sujet pourrait être massivement coupé de sa propre expérience, ce que Chalmers tient pour absurde. Il en conclut que les qualia suivent l'organisation et non le substrat. La conséquence est notable : un système non biologique convenablement organisé, et donc en principe une machine, pourrait être le siège d'une expérience. Cette thèse, qui semble faire un pas vers le fonctionnalisme, demeure compatible avec le dualisme des propriétés, car l'invariance y a le statut d'une loi psychophysique et non d'une identité.
== L'esprit étendu ==
Dans ces mêmes années, et sur un tout autre terrain, Chalmers avait, avec le philosophe Andy Clark, exploré une autre question, étrangère à la conscience mais devenue un classique de la philosophie de l'esprit. Dans un article de 1998, les deux auteurs proposent un « principe de parité » : si une opération accomplie dans le monde, à l'aide d'un support externe, joue le rôle qu'une opération accomplie dans la tête remplirait, alors elle fait partie au même titre du processus cognitif<ref>A. Clark et D. Chalmers, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19. Ce texte ne figure pas dans les quatre livres ici commentés mais prolonge le programme de l'auteur.</ref>. L'exemple est celui d'Otto, dont la mémoire défaillante l'oblige à consigner les adresses dans un carnet : ce carnet remplit pour lui la fonction que la mémoire biologique remplit pour Inga ; il appartient donc, soutiennent les auteurs, à l'esprit d'Otto. Cet « externalisme actif » étend l'esprit au-delà de la peau et du crâne, et trouve une actualité dans nos usages du carnet, du téléphone et du réseau, devenus des prolongements de la mémoire et du calcul.
== La scrutabilité du monde ==
Le deuxième grand chantier de Chalmers, exposé dans ''Constructing the World'' (2012), paraît d'abord éloigné de la conscience. Il y reprend un projet que Rudolf Carnap avait formulé en 1928 dans ''Der logische Aufbau der Welt'', la reconstruction de tout notre savoir à partir d'une base réduite, et le relie à une idée plus ancienne encore, celle du démon de Laplace<ref>D. Chalmers, ''Constructing the World'', Oxford University Press, 2012, introduction et chap. 1 à 3. L'ouvrage reprend les six conférences John Locke prononcées à Oxford en 2010.</ref>.
=== L'héritage de Carnap et de Laplace ===
Laplace imaginait une intelligence qui, connaissant à un instant la position de toutes les particules et les lois de la nature, embrasserait d'une seule formule le passé et l'avenir. Chalmers généralise : sa « thèse de scrutabilité » affirme qu'il existe une classe restreinte de vérités de base à partir desquelles toutes les vérités du monde sont accessibles à un raisonnement idéal. Le monde, en ce sens, est compréhensible : du socle on peut, en droit, remonter au reste. Le démon de Laplace n'est qu'un cas particulier, et un cas trop pauvre, car l'information physique seule ne suffit pas. Pour atteindre les vérités sur l'expérience, il faut adjoindre au socle des vérités sur la conscience ; pour atteindre les vérités sur le présent ou sur soi, des vérités indexicales ; et une clause de totalité, pour exclure ce qui n'est pas.
=== La base et le Cosmoscope ===
Chalmers nomme ce socle, d'une formule, PQTI : les vérités de la physique (P), les vérités phénoménales ou qualia (Q), une vérité de totalité disant que le monde est minimal (T), et les vérités indexicales (I). De cette base, soutient-il, toutes les autres vérités sont scrutables, et même scrutables a priori, par déduction idéale : c'est la part de « rationalisme modal » de son entreprise. Pour rendre l'idée tangible, il invente un instrument fictif, le Cosmoscope, qui stockerait toute l'information de base et la rendrait utilisable : un calculateur de capacité illimitée, des outils pour explorer la distribution de la matière, un dispositif de réalité virtuelle pour transmettre les états phénoménaux décrits par Q, un repère « vous êtes ici » pour l'indexical, et des modules de simulation pour les vérités conditionnelles. Le détail compte moins que la thèse : un sujet idéal disposant d'une telle base aurait en principe de quoi établir toute vérité sur le monde, par le seul raisonnement.
Le projet rejoint alors la philosophie de l'esprit. Que les vérités phénoménales doivent figurer à part dans la base, qu'on ne puisse les scruter à partir des seules vérités physiques, c'est l'envers, dans l'ordre de la connaissance, de l'échec du matérialisme. La structure de ''Constructing the World'' confirme ainsi, par un autre chemin et avec d'autres outils ([[Dictionnaire de philosophie/Épistémologie|épistémologie]] de l'inférence, sémantique bidimensionnelle), la thèse du premier livre.
== Réalité virtuelle et technophilosophie ==
Le dernier versant de l'œuvre, esquissé dès un essai de 2003 sur le film ''Matrix'' et déployé dans ''Reality+'' (2022), porte sur la réalité, la connaissance du monde extérieur et la technologie<ref>D. Chalmers, « The Matrix as Metaphysics », ''The Character of Consciousness'', chap. 13 ; et ''Reality+: Virtual Worlds and the Problems of Philosophy'', W. W. Norton et Allen Lane, 2022 (édition de poche Penguin, 2023).</ref>.
=== La simulation comme hypothèse métaphysique ===
Reprenons le doute de Descartes, repeint aux couleurs du jour. Comment savoir que je ne suis pas, en ce moment même, dans une simulation informatique, comme les habitants de ''Matrix'' ? Chalmers soutient une thèse contre-intuitive : à supposer que nous y soyons, nos croyances ordinaires ne seraient pas pour autant fausses. L'hypothèse de la simulation n'est pas une hypothèse [[Dictionnaire de philosophie/Scepticisme|sceptique]] qui ruinerait notre savoir, mais une hypothèse métaphysique sur la nature ultime des choses. Si nous sommes dans une simulation, les tables et les chaises existent bel et bien : ce sont des objets numériques, faits de bits, et nos propos à leur sujet sont vrais des structures de données qui les réalisent. Chalmers relie cette idée à l'hypothèse, présente en physique, d'un monde fait d'information (l{{'}}''it from bit''). La simulation ne dissout pas la réalité, elle lui prête une nature cachée, un peu comme la physique loge sous le monde sensible un substrat qui n'a pas l'aspect de ce qu'il fonde. C'est par là, et non par une réfutation directe du doute, que Chalmers entend répondre au problème du monde extérieur posé par [[Dictionnaire de philosophie/René Descartes|Descartes]].
=== Le réalisme virtuel ===
De ce diagnostic Chalmers tire une thèse générale, qu'il nomme réalisme virtuel et résume d'une phrase : la réalité virtuelle est une réalité authentique. Le livre articule autour d'elle trois affirmations. D'abord, les mondes virtuels ne sont pas des illusions ni des fictions : ce qui s'y produit s'y produit réellement, et les objets qu'on y manipule sont réels, à titre d'objets numériques. Ensuite, on peut mener dans un monde virtuel une vie pleinement sensée, non un simple divertissement d'évasion. Enfin, rien ne nous assure que notre propre monde n'est pas lui-même virtuel : c'est une possibilité que nous ne pouvons écarter, d'autant que les arguments statistiques sur la prolifération des simulations, qu'on doit à Nick Bostrom, lui donnent un poids. L'ensemble de la démarche relève de ce que Chalmers appelle la « technophilosophie », un va-et-vient entre deux tâches : poser sur la technologie des questions philosophiques, et se servir de la technologie pour éclairer de vieilles questions de la philosophie.
== Le méta-problème de la conscience ==
Dans un texte de 2018, Chalmers ajoute à son dispositif une question qu'il juge centrale : le « méta-problème » de la conscience, c'est-à-dire le problème d'expliquer pourquoi nous croyons qu'il y a un problème difficile<ref>D. Chalmers, « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.</ref>. Il s'agit de rendre compte de nos « intuitions de problème », de nos déclarations selon lesquelles la conscience serait irréductible ou la qualité du rouge distincte de toute propriété physique, et de le faire en termes neutres, physiques ou fonctionnels, sans présupposer la conscience. Le méta-problème a ceci d'intéressant qu'il appartient, lui, à la classe des problèmes faciles : il porte sur des comportements et des rapports, qui se laissent en principe expliquer.
L'enjeu n'est pas mince. Si l'on parvenait à expliquer nos intuitions de problème sans jamais invoquer l'expérience, on disposerait d'un argument pour l'illusionnisme, la thèse selon laquelle la conscience phénoménale, telle que nous la concevons, est une sorte d'illusion introspective. Chalmers, qui demeure réaliste à l'égard de la conscience, prend pourtant le méta-problème au sérieux et avoue que, s'il était matérialiste, c'est l'illusionnisme qu'il choisirait. Il recense une quinzaine de solutions candidates et marque sa sympathie pour plusieurs d'entre elles, sans trancher. La manœuvre est typique de sa façon de faire : tendre la main à la position adverse, en éprouver la force, et laisser au lecteur le soin de conclure.
== Réception et postérité ==
L'œuvre de Chalmers a laissé une empreinte durable sur la philosophie de l'esprit. La distinction du facile et du difficile a fourni à tout un champ son vocabulaire et son ordre du jour ; rares sont les discussions sur la conscience qui ne s'y réfèrent, fût-ce pour la contester. Les adversaires se répartissent selon la carte que Chalmers a lui-même dessinée. Daniel Dennett tient le problème difficile pour un mirage et range Chalmers parmi ceux qui prennent une difficulté d'imagination pour une découverte métaphysique. Les tenants de la stratégie des concepts phénoménaux, du côté du matérialisme de type B, contestent le passage de la concevabilité à la possibilité. D'autres jugent que les zombies ne sont pas réellement concevables, ou que l'épiphénoménisme menace la connaissance même de l'expérience. Le panpsychisme auquel Chalmers donne droit de cité bute, on l'a vu, sur le problème de la combinaison.
Au-delà des thèses, son influence tient à une attitude et à des institutions. L'attitude : avoir rendu la conscience à la philosophie comme un problème sérieux, ni honteux ni clos, et avoir montré qu'on pouvait en traiter avec les instruments les plus exigeants de la logique et de la sémantique. Les institutions : la base PhilPapers, qu'il a cofondée et qui a transformé l'accès à la littérature philosophique, et les grandes enquêtes sur les opinions des philosophes, qui ont donné au champ une image de lui-même. Ses travaux récents sur l'intelligence artificielle, et sur la question de savoir si de grands modèles de langage pourraient un jour être conscients ou penser, prolongent une préoccupation présente chez lui depuis ses années auprès de Hofstadter. La conscience, écrivait-il au seuil de son premier livre, est peut-être le plus grand obstacle qui reste sur la route d'une compréhension scientifique de l'univers ; toute son œuvre s'emploie à le cerner sans en masquer la difficulté.
== Notes et références ==
{{références|colonnes=2}}
== Bibliographie ==
=== Œuvres de David Chalmers ===
* ''The Conscious Mind: In Search of a Fundamental Theory'', New York, Oxford University Press, 1996.
* ''The Character of Consciousness'', New York, Oxford University Press, 2010.
* ''Constructing the World'', Oxford, Oxford University Press, 2012.
* ''Reality+: Virtual Worlds and the Problems of Philosophy'', New York, W. W. Norton et Londres, Allen Lane, 2022 (édition de poche, Penguin, 2023).
* « Facing Up to the Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 2, n{{o}} 3, 1995, p. 200-219.
* avec Andy Clark, « The Extended Mind », ''Analysis'', vol. 58, n{{o}} 1, 1998, p. 7-19.
* « The Meta-Problem of Consciousness », ''Journal of Consciousness Studies'', vol. 25, n{{o}} 9-10, 2018, p. 6-61.
* « Could a Large Language Model Be Conscious? », ''Boston Review'', 2023.
* « Does Thought Require Sensory Grounding? From Pure Thinkers to Large Language Models », ''Proceedings and Addresses of the American Philosophical Association'', 2023.
=== Traduction française ===
* ''L'Esprit conscient. À la recherche d'une théorie fondamentale'', traduit de l'anglais par Stéphane Dunand, Paris, Ithaque, 2010 (traduction de ''The Conscious Mind'').
=== Études et ouvrages de référence ===
* Thomas Nagel, « What Is It Like to Be a Bat? », ''The Philosophical Review'', vol. 83, n{{o}} 4, 1974, p. 435-450.
* Frank Jackson, « Epiphenomenal Qualia », ''The Philosophical Quarterly'', vol. 32, n{{o}} 127, 1982, p. 127-136.
* Joseph Levine, « Materialism and Qualia: The Explanatory Gap », ''Pacific Philosophical Quarterly'', vol. 64, 1983, p. 354-361.
* Daniel Dennett, ''Consciousness Explained'', Boston, Little, Brown and Company, 1991.
* Bertrand Russell, ''The Analysis of Matter'', Londres, Kegan Paul, 1927.
* Denis Fisette et Pierre Poirier (dir.), ''Textes clés de philosophie de l'esprit'', Paris, Vrin, 2 vol., 2002-2003, anthologie de référence pour le débat francophone sur la conscience et les qualia.
* Daniel Stoljar, ''Physicalism'', Londres, Routledge, 2010.
* David Papineau, ''Thinking about Consciousness'', Oxford, Oxford University Press, 2002.
* Ned Block, « On a Confusion about a Function of Consciousness », ''Behavioral and Brain Sciences'', vol. 18, n{{o}} 2, 1995, p. 227-247.
* Brian Loar, « Phenomenal States », ''Philosophical Perspectives'', vol. 4, 1990, p. 81-108.
* Keith Frankish, « Illusionism as a Theory of Consciousness », ''Journal of Consciousness Studies'', vol. 23, n{{o}} 11-12, 2016, p. 11-39.
* Galen Strawson, « Realistic Monism: Why Physicalism Entails Panpsychism », ''Journal of Consciousness Studies'', vol. 13, n{{o}} 10-11, 2006, p. 3-31.
* Philip Goff, ''Consciousness and Fundamental Reality'', Oxford, Oxford University Press, 2017.
* Michael Tye, ''Ten Problems of Consciousness'', Cambridge (Massachusetts), MIT Press, 1995.
{{DEFAULTSORT:Chalmers}}
[[Catégorie:Dictionnaire de philosophie (livre)]]
[[Catégorie:Philosophe]]
[[Catégorie:Philosophie de l'esprit]]
[[Catégorie:Métaphysique]]
[[Catégorie:Épistémologie]]
3b7l3buoq5khdlwjecgte33l8c2yslu
Dictionnaire de philosophie/Willard Van Orman Quine/Barbe de Platon
0
83960
768289
2026-06-22T04:27:57Z
PandaMystique
119061
Page créée avec « == La barbe de Platon == [[Fichier:Plato Silanion Musei Capitolini MC1377.png|vignette|Buste de Platon (copie romaine d'après Silanion). L'énigme du non-être qu'il explore est ce que Quine surnomme « la barbe de Platon ».]] « Qu'y a-t-il ? » La question de départ paraît si simple qu'on hésite à la prendre au sérieux. C'est pourtant celle de l'ontologie, cette partie de la philosophie qui se demande Dictionnaire de philosophie/Existence|ce qui exis... »
768289
wikitext
text/x-wiki
== La barbe de Platon ==
[[Fichier:Plato Silanion Musei Capitolini MC1377.png|vignette|Buste de Platon (copie romaine d'après Silanion). L'énigme du non-être qu'il explore est ce que Quine surnomme « la barbe de Platon ».]]
« Qu'y a-t-il ? » La question de départ paraît si simple qu'on hésite à la prendre au sérieux. C'est pourtant celle de l'ontologie, cette partie de la philosophie qui se demande [[Dictionnaire de philosophie/Existence|ce qui existe]]. Le mot impressionne, l'idée est ordinaire : faire de l'ontologie, c'est tenter de dresser l'inventaire de ce qu'il y a. Presque tout le monde accordera qu'il y a des pierres, des arbres, des animaux, des villes, des personnes. Les choses se compliquent dès qu'on parle de Pégase, de Sherlock Holmes, du nombre 7, d'une propriété comme la rougeur, d'une espèce animale prise en général (le cheval, et non tel cheval dans un pré), ou d'un président possible qui ne fut jamais élu. Quine ouvre son article « De ce qui est »<ref>Willard Van Orman Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.</ref> par cette observation : à la question « Qu'y a-t-il ? », on peut répondre d'un mot, « tout », mais cette réponse ne règle rien, car le désaccord renaît à chaque exemple. Le problème n'est donc pas un jeu d'école. Il touche notre manière de parler, de raisonner, de faire des sciences, de bâtir des théories, et jusqu'à la question de savoir ce que nous acceptons au juste quand nous tenons une phrase pour [[Dictionnaire de philosophie/Vérité|vraie]].
Quine met l'affaire en scène. Imaginons deux philosophes : l'un, qu'il appelle McX, soutient que certaines choses existent ; l'autre les refuse. Celui qui affirme formule le désaccord sans peine : « mon adversaire, dira-t-il, refuse de reconnaître certaines entités », une entité étant simplement ce que l'on compte comme existant. Mais celui qui nie semble pris à son propre piège. Comment dira-t-il ce qu'il rejette sans se contredire ? S'il déclare « il y a des choses que McX admet et que je refuse », il vient d'accorder qu'il y a ces choses, donc d'admettre ce qu'il voulait nier. Le partisan du « non » paraît condamné au silence.
La difficulté tient à une habitude de pensée : nous parlons souvent comme si nommer une chose suffisait à lui donner une forme d'être. « Pégase n'existe pas », dis-je ; mais je parle bien de Pégase, et comment parler de lui s'il n'était rien du tout ? C'est l'antique problème du non-être, celui que Platon affronte dans le ''[[s:Le Sophiste|Sophiste]]'' : pour dire qu'une chose n'est pas, il semble qu'il faille d'abord la poser comme quelque chose. Quine baptise cette difficulté « la barbe de Platon ». L'image est ironique : une barbe drue s'accroche partout et finit par émousser la lame. La lame, ici, c'est le rasoir d'Occam, ce principe d'économie qui déconseille de multiplier les êtres sans nécessité et invite, entre deux explications, à préférer la plus sobre. Une voiture refuse de démarrer : inutile d'imaginer un lutin sous le capot quand une batterie à plat suffit. Quine veut passer ce rasoir sur le langage, pour qu'il ne nous oblige pas à peupler le monde d'objets douteux.
[[Fichier:Peter Paul Rubens - Bellérophon, monté sur Pégase transperce la Chimère.JPG|vignette|Pégase, le cheval ailé, monté par Bellérophon (Pierre Paul Rubens). Nous comprenons parfaitement le nom sans qu'aucun cheval ailé existe.]]
Restons sur Pégase, le cheval ailé de la mythologie. McX pourrait raisonner ainsi : si le mot « Pégase » ne désignait rien, nous ne dirions rien en l'employant ; or nous disons quelque chose ; donc Pégase possède une forme d'être. Le raisonnement a de l'allure, mais il confond deux choses. Comprendre un nom ne prouve pas qu'un objet lui réponde. Je comprends parfaitement « le père Noël », « la montagne d'or », « le cercle carré » ou « le détective Sherlock Holmes » sans devoir admettre qu'un tel être existe. Pressé, McX se replie sur une parade : Pégase existerait du moins comme idée dans les esprits. Mais c'est déplacer le problème. L'idée de Pégase existe peut-être dans une tête, comme une image ; elle n'est pas Pégase. De même, l'idée du Parthénon n'est pas le Parthénon : celui-ci est un édifice de pierre, à Athènes, que l'on peut visiter et photographier ; celle-là est une représentation que l'on forme les yeux fermés. Quand nous nions Pégase, ce n'est pas l'image des livres ou de nos esprits que nous nions, car cette image existe bel et bien ; c'est un cheval ailé de chair et de sang, que l'on pourrait approcher, nourrir, photographier, et dont nous disons qu'il ne galope nulle part.
[[Fichier:Parthenon from west.jpg|vignette|gauche|Le Parthénon, à Athènes. Quine distingue l'édifice de pierre, que l'on peut visiter, de l'idée que nous en formons.]]
Quine examine alors une position plus fine, qu'il prête à un certain Wyman. Pégase, dit Wyman, n'est pas une simple idée : il est un possible non actualisé. Il aurait pu exister, mais ne s'est pas réalisé. Dire « Pégase n'existe pas » reviendrait alors seulement à dire qu'il ne s'est pas réalisé, comme on dirait que le Parthénon n'est pas rouge : la couleur lui fait défaut sans qu'il cesse d'être. La parade séduit, car nous parlons sans cesse de possibles : un voyage que nous n'avons pas fait, une maison que nous aurions pu construire, une décision qui aurait pu être prise. Mais Wyman fait un pas de trop. S'il change chaque possible en objet, l'univers se peuple aussitôt d'une foule d'êtres fantomatiques : non plus seulement les personnes et les maisons réelles, mais toutes les personnes possibles, toutes les maisons possibles, tout un peuple de presque-choses.
Quine raille cette prolifération par des questions faussement naïves. Combien d'hommes possibles se tiennent en ce moment dans l'embrasure de cette porte ? L'homme possible gros et l'homme possible chauve sont-ils deux, ou un seul qui serait à la fois gros et chauve ? Y a-t-il, dans cette embrasure, plus d'hommes minces possibles que de gros ? Deux possibles qui se ressemblent en tout point font-ils deux, ou bien un ? Ces questions amusent, mais elles touchent un point sérieux : avec ces prétendus objets, nous ne savons plus ni les compter, ni décider quand deux d'entre eux sont identiques ou différents.
Or l'identité est la condition la plus modeste pour parler clairement d'objets. Pour compter des choses, il faut pouvoir dire où l'une finit et où l'autre commence. Je compte les chaises d'une salle : encore faut-il savoir si celle-ci est la même que celle d'à côté. Je range une bibliothèque : je dois distinguer deux exemplaires d'un même livre. Je parle d'une personne : je dois pouvoir dire si celle d'aujourd'hui est celle d'hier. Avec les possibles de Wyman, l'opération se brouille : aucun fait ne décide s'ils sont un ou deux. Ce critère, Quine en fera plus tard une devise, « pas d'entité sans identité » : n'admettons pas dans notre inventaire du monde des objets que nous serions incapables de distinguer ou de dénombrer. Que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ?
De là le mot de « bidonville des possibles » : un quartier bâti sans plan, encombré, sans règles nettes, où l'on a entassé des êtres faute d'avoir su analyser notre façon de parler. Ce que Quine reproche à Wyman n'est pas de parler de possibilités, car nous pouvons toujours dire qu'une chose aurait pu arriver. La faute commence quand on change chaque possibilité en objet, comme si le seul fait de pouvoir dire « cela aurait pu être » obligeait à loger un être possible quelque part. Mieux vaut raser le bidonville ; le rasoir d'Occam retrouve alors son tranchant.
L'enjeu général se laisse maintenant énoncer. Il faut distinguer ce dont nous parlons de ce que nous sommes tenus d'admettre comme existant. Nous pouvons parler de mythes, de fictions, de projets abandonnés, d'hypothèses et de possibilités sans remplir pour autant notre ontologie d'objets fantomatiques : une expression peut être signifiante sans fonctionner comme le nom d'un objet, et c'est de la confusion entre ces deux choses que naissait l'énigme du non-être. Reste à savoir comment nier proprement l'existence d'une chose sans paraître la concéder. La réponse de Quine est nette : ce qui engage une théorie à admettre des objets, ce ne sont pas les noms qu'elle emploie, car les noms embarrassants peuvent être traités comme des descriptions, au besoin grâce à un prédicat construit pour l'occasion, puis analysés à la manière de Russell ; ce sont les tournures du type « il existe quelque chose tel que… ». Dire « Pégase n'existe pas » n'engage alors à rien, tandis que dire « il existe quelque chose qui est un électron » engage bien à admettre des électrons. C'est ce mécanisme que la section suivante développe.
== Notes et références ==
{{références|colonnes=2}}
reo03cscaa4jh5v56a5wt7bi2zrzkz4
768290
768289
2026-06-22T04:28:21Z
PandaMystique
119061
/* La barbe de Platon */
768290
wikitext
text/x-wiki
[[Fichier:Plato Silanion Musei Capitolini MC1377.png|vignette|Buste de Platon (copie romaine d'après Silanion). L'énigme du non-être qu'il explore est ce que Quine surnomme « la barbe de Platon ».]]
« Qu'y a-t-il ? » La question de départ paraît si simple qu'on hésite à la prendre au sérieux. C'est pourtant celle de l'ontologie, cette partie de la philosophie qui se demande [[Dictionnaire de philosophie/Existence|ce qui existe]]. Le mot impressionne, l'idée est ordinaire : faire de l'ontologie, c'est tenter de dresser l'inventaire de ce qu'il y a. Presque tout le monde accordera qu'il y a des pierres, des arbres, des animaux, des villes, des personnes. Les choses se compliquent dès qu'on parle de Pégase, de Sherlock Holmes, du nombre 7, d'une propriété comme la rougeur, d'une espèce animale prise en général (le cheval, et non tel cheval dans un pré), ou d'un président possible qui ne fut jamais élu. Quine ouvre son article « De ce qui est »<ref>Willard Van Orman Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.</ref> par cette observation : à la question « Qu'y a-t-il ? », on peut répondre d'un mot, « tout », mais cette réponse ne règle rien, car le désaccord renaît à chaque exemple. Le problème n'est donc pas un jeu d'école. Il touche notre manière de parler, de raisonner, de faire des sciences, de bâtir des théories, et jusqu'à la question de savoir ce que nous acceptons au juste quand nous tenons une phrase pour [[Dictionnaire de philosophie/Vérité|vraie]].
Quine met l'affaire en scène. Imaginons deux philosophes : l'un, qu'il appelle McX, soutient que certaines choses existent ; l'autre les refuse. Celui qui affirme formule le désaccord sans peine : « mon adversaire, dira-t-il, refuse de reconnaître certaines entités », une entité étant simplement ce que l'on compte comme existant. Mais celui qui nie semble pris à son propre piège. Comment dira-t-il ce qu'il rejette sans se contredire ? S'il déclare « il y a des choses que McX admet et que je refuse », il vient d'accorder qu'il y a ces choses, donc d'admettre ce qu'il voulait nier. Le partisan du « non » paraît condamné au silence.
La difficulté tient à une habitude de pensée : nous parlons souvent comme si nommer une chose suffisait à lui donner une forme d'être. « Pégase n'existe pas », dis-je ; mais je parle bien de Pégase, et comment parler de lui s'il n'était rien du tout ? C'est l'antique problème du non-être, celui que Platon affronte dans le ''[[s:Le Sophiste|Sophiste]]'' : pour dire qu'une chose n'est pas, il semble qu'il faille d'abord la poser comme quelque chose. Quine baptise cette difficulté « la barbe de Platon ». L'image est ironique : une barbe drue s'accroche partout et finit par émousser la lame. La lame, ici, c'est le rasoir d'Occam, ce principe d'économie qui déconseille de multiplier les êtres sans nécessité et invite, entre deux explications, à préférer la plus sobre. Une voiture refuse de démarrer : inutile d'imaginer un lutin sous le capot quand une batterie à plat suffit. Quine veut passer ce rasoir sur le langage, pour qu'il ne nous oblige pas à peupler le monde d'objets douteux.
[[Fichier:Peter Paul Rubens - Bellérophon, monté sur Pégase transperce la Chimère.JPG|vignette|Pégase, le cheval ailé, monté par Bellérophon (Pierre Paul Rubens). Nous comprenons parfaitement le nom sans qu'aucun cheval ailé existe.]]
Restons sur Pégase, le cheval ailé de la mythologie. McX pourrait raisonner ainsi : si le mot « Pégase » ne désignait rien, nous ne dirions rien en l'employant ; or nous disons quelque chose ; donc Pégase possède une forme d'être. Le raisonnement a de l'allure, mais il confond deux choses. Comprendre un nom ne prouve pas qu'un objet lui réponde. Je comprends parfaitement « le père Noël », « la montagne d'or », « le cercle carré » ou « le détective Sherlock Holmes » sans devoir admettre qu'un tel être existe. Pressé, McX se replie sur une parade : Pégase existerait du moins comme idée dans les esprits. Mais c'est déplacer le problème. L'idée de Pégase existe peut-être dans une tête, comme une image ; elle n'est pas Pégase. De même, l'idée du Parthénon n'est pas le Parthénon : celui-ci est un édifice de pierre, à Athènes, que l'on peut visiter et photographier ; celle-là est une représentation que l'on forme les yeux fermés. Quand nous nions Pégase, ce n'est pas l'image des livres ou de nos esprits que nous nions, car cette image existe bel et bien ; c'est un cheval ailé de chair et de sang, que l'on pourrait approcher, nourrir, photographier, et dont nous disons qu'il ne galope nulle part.
[[Fichier:Parthenon from west.jpg|vignette|gauche|Le Parthénon, à Athènes. Quine distingue l'édifice de pierre, que l'on peut visiter, de l'idée que nous en formons.]]
Quine examine alors une position plus fine, qu'il prête à un certain Wyman. Pégase, dit Wyman, n'est pas une simple idée : il est un possible non actualisé. Il aurait pu exister, mais ne s'est pas réalisé. Dire « Pégase n'existe pas » reviendrait alors seulement à dire qu'il ne s'est pas réalisé, comme on dirait que le Parthénon n'est pas rouge : la couleur lui fait défaut sans qu'il cesse d'être. La parade séduit, car nous parlons sans cesse de possibles : un voyage que nous n'avons pas fait, une maison que nous aurions pu construire, une décision qui aurait pu être prise. Mais Wyman fait un pas de trop. S'il change chaque possible en objet, l'univers se peuple aussitôt d'une foule d'êtres fantomatiques : non plus seulement les personnes et les maisons réelles, mais toutes les personnes possibles, toutes les maisons possibles, tout un peuple de presque-choses.
Quine raille cette prolifération par des questions faussement naïves. Combien d'hommes possibles se tiennent en ce moment dans l'embrasure de cette porte ? L'homme possible gros et l'homme possible chauve sont-ils deux, ou un seul qui serait à la fois gros et chauve ? Y a-t-il, dans cette embrasure, plus d'hommes minces possibles que de gros ? Deux possibles qui se ressemblent en tout point font-ils deux, ou bien un ? Ces questions amusent, mais elles touchent un point sérieux : avec ces prétendus objets, nous ne savons plus ni les compter, ni décider quand deux d'entre eux sont identiques ou différents.
Or l'identité est la condition la plus modeste pour parler clairement d'objets. Pour compter des choses, il faut pouvoir dire où l'une finit et où l'autre commence. Je compte les chaises d'une salle : encore faut-il savoir si celle-ci est la même que celle d'à côté. Je range une bibliothèque : je dois distinguer deux exemplaires d'un même livre. Je parle d'une personne : je dois pouvoir dire si celle d'aujourd'hui est celle d'hier. Avec les possibles de Wyman, l'opération se brouille : aucun fait ne décide s'ils sont un ou deux. Ce critère, Quine en fera plus tard une devise, « pas d'entité sans identité » : n'admettons pas dans notre inventaire du monde des objets que nous serions incapables de distinguer ou de dénombrer. Que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ?
De là le mot de « bidonville des possibles » : un quartier bâti sans plan, encombré, sans règles nettes, où l'on a entassé des êtres faute d'avoir su analyser notre façon de parler. Ce que Quine reproche à Wyman n'est pas de parler de possibilités, car nous pouvons toujours dire qu'une chose aurait pu arriver. La faute commence quand on change chaque possibilité en objet, comme si le seul fait de pouvoir dire « cela aurait pu être » obligeait à loger un être possible quelque part. Mieux vaut raser le bidonville ; le rasoir d'Occam retrouve alors son tranchant.
L'enjeu général se laisse maintenant énoncer. Il faut distinguer ce dont nous parlons de ce que nous sommes tenus d'admettre comme existant. Nous pouvons parler de mythes, de fictions, de projets abandonnés, d'hypothèses et de possibilités sans remplir pour autant notre ontologie d'objets fantomatiques : une expression peut être signifiante sans fonctionner comme le nom d'un objet, et c'est de la confusion entre ces deux choses que naissait l'énigme du non-être. Reste à savoir comment nier proprement l'existence d'une chose sans paraître la concéder. La réponse de Quine est nette : ce qui engage une théorie à admettre des objets, ce ne sont pas les noms qu'elle emploie, car les noms embarrassants peuvent être traités comme des descriptions, au besoin grâce à un prédicat construit pour l'occasion, puis analysés à la manière de Russell ; ce sont les tournures du type « il existe quelque chose tel que… ». Dire « Pégase n'existe pas » n'engage alors à rien, tandis que dire « il existe quelque chose qui est un électron » engage bien à admettre des électrons. C'est ce mécanisme que la section suivante développe.
== Notes et références ==
{{références|colonnes=2}}
f2o3kerqenpxubpmgiikhlrvgcdhnmw
768293
768290
2026-06-22T04:33:19Z
PandaMystique
119061
768293
wikitext
text/x-wiki
{{DicoPhilo|Barbe de Platon|lecture=oui}}
[[Fichier:Plato Silanion Musei Capitolini MC1377.png|vignette|Buste de Platon (copie romaine d'après Silanion). L'énigme du non-être qu'il explore est ce que Quine surnomme « la barbe de Platon ».]]
« Qu'y a-t-il ? » La question de départ paraît si simple qu'on hésite à la prendre au sérieux. C'est pourtant celle de l'ontologie, cette partie de la philosophie qui se demande [[Dictionnaire de philosophie/Existence|ce qui existe]]. Le mot impressionne, l'idée est ordinaire : faire de l'ontologie, c'est tenter de dresser l'inventaire de ce qu'il y a. Presque tout le monde accordera qu'il y a des pierres, des arbres, des animaux, des villes, des personnes. Les choses se compliquent dès qu'on parle de Pégase, de Sherlock Holmes, du nombre 7, d'une propriété comme la rougeur, d'une espèce animale prise en général (le cheval, et non tel cheval dans un pré), ou d'un président possible qui ne fut jamais élu. Quine ouvre son article « De ce qui est »<ref>Willard Van Orman Quine, « De ce qui est », dans ''Du point de vue logique. Neuf essais logico-philosophiques'', traduction sous la direction de Sandra Laugier, Paris, Vrin, 2003.</ref> par cette observation : à la question « Qu'y a-t-il ? », on peut répondre d'un mot, « tout », mais cette réponse ne règle rien, car le désaccord renaît à chaque exemple. Le problème n'est donc pas un jeu d'école. Il touche notre manière de parler, de raisonner, de faire des sciences, de bâtir des théories, et jusqu'à la question de savoir ce que nous acceptons au juste quand nous tenons une phrase pour [[Dictionnaire de philosophie/Vérité|vraie]].
Quine met l'affaire en scène. Imaginons deux philosophes : l'un, qu'il appelle McX, soutient que certaines choses existent ; l'autre les refuse. Celui qui affirme formule le désaccord sans peine : « mon adversaire, dira-t-il, refuse de reconnaître certaines entités », une entité étant simplement ce que l'on compte comme existant. Mais celui qui nie semble pris à son propre piège. Comment dira-t-il ce qu'il rejette sans se contredire ? S'il déclare « il y a des choses que McX admet et que je refuse », il vient d'accorder qu'il y a ces choses, donc d'admettre ce qu'il voulait nier. Le partisan du « non » paraît condamné au silence.
La difficulté tient à une habitude de pensée : nous parlons souvent comme si nommer une chose suffisait à lui donner une forme d'être. « Pégase n'existe pas », dis-je ; mais je parle bien de Pégase, et comment parler de lui s'il n'était rien du tout ? C'est l'antique problème du non-être, celui que Platon affronte dans le ''[[s:Le Sophiste|Sophiste]]'' : pour dire qu'une chose n'est pas, il semble qu'il faille d'abord la poser comme quelque chose. Quine baptise cette difficulté « la barbe de Platon ». L'image est ironique : une barbe drue s'accroche partout et finit par émousser la lame. La lame, ici, c'est le rasoir d'Occam, ce principe d'économie qui déconseille de multiplier les êtres sans nécessité et invite, entre deux explications, à préférer la plus sobre. Une voiture refuse de démarrer : inutile d'imaginer un lutin sous le capot quand une batterie à plat suffit. Quine veut passer ce rasoir sur le langage, pour qu'il ne nous oblige pas à peupler le monde d'objets douteux.
[[Fichier:Peter Paul Rubens - Bellérophon, monté sur Pégase transperce la Chimère.JPG|vignette|Pégase, le cheval ailé, monté par Bellérophon (Pierre Paul Rubens). Nous comprenons parfaitement le nom sans qu'aucun cheval ailé existe.]]
Restons sur Pégase, le cheval ailé de la mythologie. McX pourrait raisonner ainsi : si le mot « Pégase » ne désignait rien, nous ne dirions rien en l'employant ; or nous disons quelque chose ; donc Pégase possède une forme d'être. Le raisonnement a de l'allure, mais il confond deux choses. Comprendre un nom ne prouve pas qu'un objet lui réponde. Je comprends parfaitement « le père Noël », « la montagne d'or », « le cercle carré » ou « le détective Sherlock Holmes » sans devoir admettre qu'un tel être existe. Pressé, McX se replie sur une parade : Pégase existerait du moins comme idée dans les esprits. Mais c'est déplacer le problème. L'idée de Pégase existe peut-être dans une tête, comme une image ; elle n'est pas Pégase. De même, l'idée du Parthénon n'est pas le Parthénon : celui-ci est un édifice de pierre, à Athènes, que l'on peut visiter et photographier ; celle-là est une représentation que l'on forme les yeux fermés. Quand nous nions Pégase, ce n'est pas l'image des livres ou de nos esprits que nous nions, car cette image existe bel et bien ; c'est un cheval ailé de chair et de sang, que l'on pourrait approcher, nourrir, photographier, et dont nous disons qu'il ne galope nulle part.
[[Fichier:Parthenon from west.jpg|vignette|gauche|Le Parthénon, à Athènes. Quine distingue l'édifice de pierre, que l'on peut visiter, de l'idée que nous en formons.]]
Quine examine alors une position plus fine, qu'il prête à un certain Wyman. Pégase, dit Wyman, n'est pas une simple idée : il est un possible non actualisé. Il aurait pu exister, mais ne s'est pas réalisé. Dire « Pégase n'existe pas » reviendrait alors seulement à dire qu'il ne s'est pas réalisé, comme on dirait que le Parthénon n'est pas rouge : la couleur lui fait défaut sans qu'il cesse d'être. La parade séduit, car nous parlons sans cesse de possibles : un voyage que nous n'avons pas fait, une maison que nous aurions pu construire, une décision qui aurait pu être prise. Mais Wyman fait un pas de trop. S'il change chaque possible en objet, l'univers se peuple aussitôt d'une foule d'êtres fantomatiques : non plus seulement les personnes et les maisons réelles, mais toutes les personnes possibles, toutes les maisons possibles, tout un peuple de presque-choses.
Quine raille cette prolifération par des questions faussement naïves. Combien d'hommes possibles se tiennent en ce moment dans l'embrasure de cette porte ? L'homme possible gros et l'homme possible chauve sont-ils deux, ou un seul qui serait à la fois gros et chauve ? Y a-t-il, dans cette embrasure, plus d'hommes minces possibles que de gros ? Deux possibles qui se ressemblent en tout point font-ils deux, ou bien un ? Ces questions amusent, mais elles touchent un point sérieux : avec ces prétendus objets, nous ne savons plus ni les compter, ni décider quand deux d'entre eux sont identiques ou différents.
Or l'identité est la condition la plus modeste pour parler clairement d'objets. Pour compter des choses, il faut pouvoir dire où l'une finit et où l'autre commence. Je compte les chaises d'une salle : encore faut-il savoir si celle-ci est la même que celle d'à côté. Je range une bibliothèque : je dois distinguer deux exemplaires d'un même livre. Je parle d'une personne : je dois pouvoir dire si celle d'aujourd'hui est celle d'hier. Avec les possibles de Wyman, l'opération se brouille : aucun fait ne décide s'ils sont un ou deux. Ce critère, Quine en fera plus tard une devise, « pas d'entité sans identité » : n'admettons pas dans notre inventaire du monde des objets que nous serions incapables de distinguer ou de dénombrer. Que vaut un domaine d'objets dont on ne peut dire ni qu'ils sont identiques à eux-mêmes ni qu'ils diffèrent les uns des autres ?
De là le mot de « bidonville des possibles » : un quartier bâti sans plan, encombré, sans règles nettes, où l'on a entassé des êtres faute d'avoir su analyser notre façon de parler. Ce que Quine reproche à Wyman n'est pas de parler de possibilités, car nous pouvons toujours dire qu'une chose aurait pu arriver. La faute commence quand on change chaque possibilité en objet, comme si le seul fait de pouvoir dire « cela aurait pu être » obligeait à loger un être possible quelque part. Mieux vaut raser le bidonville ; le rasoir d'Occam retrouve alors son tranchant.
L'enjeu général se laisse maintenant énoncer. Il faut distinguer ce dont nous parlons de ce que nous sommes tenus d'admettre comme existant. Nous pouvons parler de mythes, de fictions, de projets abandonnés, d'hypothèses et de possibilités sans remplir pour autant notre ontologie d'objets fantomatiques : une expression peut être signifiante sans fonctionner comme le nom d'un objet, et c'est de la confusion entre ces deux choses que naissait l'énigme du non-être. Reste à savoir comment nier proprement l'existence d'une chose sans paraître la concéder. La réponse de Quine est nette : ce qui engage une théorie à admettre des objets, ce ne sont pas les noms qu'elle emploie, car les noms embarrassants peuvent être traités comme des descriptions, au besoin grâce à un prédicat construit pour l'occasion, puis analysés à la manière de Russell ; ce sont les tournures du type « il existe quelque chose tel que… ». Dire « Pégase n'existe pas » n'engage alors à rien, tandis que dire « il existe quelque chose qui est un électron » engage bien à admettre des électrons. C'est ce mécanisme que la section suivante développe.
== Notes et références ==
{{références|colonnes=2}}
eq01s2z4i1ph31c1zt7tfakb9icqrwx