Die Graphikpipeline auf GPUs sieht vereinfacht in etwa so aus:
Vertexshader: Berechnet für jede Ecke eines Dreiecks einzeln wo es auf dem Bildschirm abgebildet wird. Diese sind als Unified-Shader implementiert und relativ frei programmierbar.
Rasterisierer: Dieser nimmt jeweils die vom Vertexshader transformierten Ecken her, führt das Clipping am Frustrum - also dem Sichtkegel der Kamera- aus. Anschliessend werden die Pixel berechnet, die das Dreieck auf den Bildschirm bedeckt. Für jeden Pixel bzw. Fragment, wird nun ein Fragmentshaderprogramm ausgeführt. Der Rasterisierer ist eine Spezialhardware, welche allerdings nur etwas konfigurierbar und nicht programmierbar ist.
Fragmentshader: Dieser berechnet für jedes Fragment nun die Farbe, welcher der Pixel später auf den Bildschirm besitzen soll. Diese Farbe leitet er mitsamt dem Tiefenwert an die ROP weiter. Fragmentshader sind wiederum relativ frei programmierbar und als Unified-Shader implementiert.
ROPs: Diese sind die finale Stufe in der Pipeline. Für jedes Fragment, das aus dem Fragmentshader kommt, wird zuerst ein Tiefentest (Early-Z vernachlässige ich mal) ausgeführt. Hier wird der Tiefenwert an der Stelle des entsprechenden Pixel aus dem Tiefenbuffer bzw. DRAM geholt und mit dem Wert des zu schreibenden Fragments verglichen. Besteht es den Tiefentest so findet das Blending statt: Hier wird die Farbe an der stelle des entsprechenden Pixels aus dem Farbbuffer bzw. DRAM geladen. Dann wird diese Farbe mit der Farbe des zu schreibenden Fragments mit einer Blendfunktion zu einer neuen Farbe kombiniert, welche dann letztendlich in den Farbbuffer bzw. DRAM zurückgeschrieben wird. Diese Rops sind wiederum Spezialhardware, welche man nur konfigurieren kann.
Die ROPs sind also vereinfacht dargestellt dafür verantwortlich, die von den Fragmentshadern berechneten Farbwerte zurück in den DRAM zu schreiben. Ihre Leistung wird in den entsprechenden Dokumentationen durch die Pixel-Fillrate beschrieben. Es gilt hierbei:
Fillrate = Takt * ROPS
Ein generelles Problem bei Spezialhardware ist, dass jede fallabhängig die Performance limitieren kann. Zeichnest du wenige große Dreiecke mit einfachen Shadern, so kommen die ROPs mit dem Zurückschreiben der Fragmente nicht mehr nach; die Performance ist also nur von der Leistung der ROPs abhängig. Zeichnest du allerdings Dreiecke mit sehr komplexen Shadern, so kommen diese Unified-Shader mit dem Berechnen nicht mehr hinterher; die Leistung der ROPs hat keinen Einfluss auf die Performance. Aus diesen Gründen ist der Einfluss dieser Fillrate auf die Performance sehr stark fallabhängig.
Zu der Skalierung der ROP-Leistung: Die für das zeichnen eines Bilds benötigte Fillrate ist in den meisten Anwendungen hauptsächlich von der Auflösung und nicht von dem Detailgrad der Szene abhängig. Da die Auflösung der Monitore weitestgehend stagniert, stagniert die Fillrate ebenfalls.