Quando si utilizza GLSL su GPU moderne (GL3.3 +), qual è il probabile costo di diramazione su un'uniforme?Costo della ramificazione su uniformi su GPU moderne
Nel mio motore sto arrivando al punto in cui ho un sacco di shader. E ho molti preset di qualità diversi per molti di quelli. Così com'è, sto usando uniformi con if() negli shader per scegliere diversi preset di qualità. Sono comunque preoccupato che potrei ottenere prestazioni migliori ricompilando gli shader e usando #ifdef. Il problema con questo è la necessità di preoccuparsi di monitorare e resettare altre uniformi quando ricompilare uno shader.
Fondamentalmente quello che voglio sapere è se le mie paure sono infondate. La ramificazione su un'uniforme economica sulle moderne GPU? Ho fatto alcuni test personalmente e ho trovato poche differenze in entrambi i modi, ma ho provato solo su nVidia 680.
Il guidatore è libero di ricompilare lo shader con uniformi inline se stesso se vede che il costo della ramificazione sarebbe troppo grande. –
La divergenza del thread, in cui le invocazioni parallele di uno shader prendono percorsi di controllo diversi, è un problema importante nelle GPU moderne. Le uniformi sono applicate a tutte le invocazioni in un programma, tuttavia, quindi questo non è un problema. Evitare la ramificazione sugli attributi dei vertici o altrimenti i dati dinamici è un uso migliore del tuo tempo. –
Ok, quindi nella pratica, è improbabile che una GPU moderna sia più lenta della ricompilazione con le costanti, perché i rami sono leggermente diversi da quelli di una CPU, o perché il compilatore ricompilerà automaticamente lo shader. Ho capito bene? – Jagoly