home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / plasma / plasm.txt < prev    next >
Encoding:
Text File  |  1995-12-24  |  9.7 KB  |  173 lines

  1.  
  2. Il Plasma        (Lezione by The Dark Coder)
  3.  
  4. In questo testo parleremo dell'effetto "plasma". In particolare vedremo come
  5. realizzare degli effetti plasma utilizzando tecniche impiegabili su tutti gli
  6. amiga. Al giorno d'oggi, infatti, grazie al chipset AGA e a processori 68020
  7. e superiori si realizzano anche dei plasmi differenti, basati su tecniche 
  8. "chunky pixel". Gli effetti di cui parleremo in questo testo, invece, sono
  9. impiegabili anche sul buon vecchio Amiga 500.
  10. La tecnica di base per realizzare un plasma e` costituita dall'utilizzo di
  11. una copperlist che cambia continuamente alcuni registri colore, mediante delle
  12. "copper moves" consecutive. Abbiamo gia` visto come costruire e utilizzare
  13. molte copperlists di questo tipo nella lezione 11. In particolare negli esempi
  14. lezione11g1.s, lezione11g2.s e lezione11g3.s abbiamo realizzato sfumatore di
  15. colori mediante copperlists che cambiavano il contenuto di COLOR00. Si tratta,
  16. pero`, di copperlists statiche. La differenza principale tra quegli esempi e un
  17. plasma e` proprio questa: in un effetto plasma si usa una copperlist
  18. strutturata in quel modo, ma dinamica, in modo che in ogni frame cambino i
  19. colori scritti nel registro COLOR00. Ogni "copper move" e` composta da 2 words:
  20.  
  21.     dc.w    $180,COLORE    ; struttura di una "copper move"
  22.  
  23. La prima word contiene l'indirizzo di COLOR00 e la seconda il valore da
  24. scrivere in tale registro. Per ottenere l'effetto plasma dobbiamo far variare
  25. questo valore ad ogni frame, ovvero dobbiamo scrivere ogni volta un valore
  26. diverso nella seconda word che costituisce la "copper move".
  27. Il problema e` che dobbiamo ripetere questa operazione per tutte le "copper
  28. moves" che fanno parte della copperlist. Si tratta quindi di una gran quantita`
  29. di dati da modificare. Poiche` la copperlist si trova in CHIP-RAM possiamo
  30. usare il blitter per effettuare le modifiche. In conclusione, dunque l'effetto
  31. plasma e` realizzato mediante una routine che (usando il blitter) legge da una
  32. tabella i colori e li copia nella copperlist. Facendo variare ad ogni frame i
  33. colori copiati, il plasma e` fatto. Notate che questo effetto non richiede
  34. l'uso di bitplane, visto che si fa tutto modificando il colore di sfondo.
  35. Per questo lo si indica come plasma "a 0 bitplanes", in contrasto con altre
  36. varianti che vedremo successivamente. Un esempio di plasma 0-bitplanes e`
  37. plasm1.s.
  38. Un significativo miglioramento dell'effetto e` costituito dal plasma RGB.
  39. Esso si differenzia dal plasma normale, perche` i colori non vengono
  40. semplicemente copiati da una tabella, ma "calcolati" nel seguente modo:
  41. vengono lette separatamente (da 3 sorgenti diverse) le componenti R, G e B
  42. di un colore, e vengono poi unite insieme con un OR. In questo modo poiche`
  43. le componenti R,G B variano continuamente tra una "copper move" e l'altra si
  44. produrra` un maggior numero di colori. In pratica, invece di un'operazione
  45. di copia si utilizza una blittata che esegue un OR tra 3 sorgenti che
  46. contengono rispettivamente le componenti R, G e B. Un primo esempio di plasma
  47. RGB e` plasm2.s
  48. Per migliorare ulteriormente l'effetto, si cerca di rendere piu` vario il 
  49. plasma. Un modo semplice per farlo e` rendere variabile la posizione di
  50. partenza di ogni riga del plasma. Cio` puo` essere fatto molto facilmente
  51. dato che la posizione di partenza e` determinata dall'istruzione WAIT che
  52. compare all'inizio di ogni riga della copperlist. Una variante del genere
  53. e` illustrata in plasm3.s. Purtroppo, pero` le posizioni orizzontali delle
  54. WAIT hanno una risoluzione di 4 pixel, il che vuol dire che e` possibile 
  55. variare la posizione di partenza del plasma a "scatti" di 4 pixel. Variando
  56. opportunamente i parametri dell'esempio plasm3.s si puo` evidenziare tale
  57. fenomeno. per ottenere delle oscillazioni meno scattose useremo una tecnica
  58. diversa, che fa uso di un bitplane, e pertanto si chiama plasma "1-bitplane".
  59. La tecnica e` la seguente: si usa un bitplane "a strisce" verticali larghe 8
  60. pixel. In questo modo l'immagine avra` 8 pixel colorati con COLOR00, poi 8
  61. colorati con COLOR01, poi di nuovo 8 con COLOR00 e cosi` via. In corrispondenza
  62. usiamo una copperlist simile a quelle viste negli esempi precedenti, ma che
  63. alterna una "copper move" in COLOR00 con una in COLOR01. La situazione e`
  64. rappresentata dalla figura seguente:
  65.  
  66. destinazione
  67. della 
  68. "copper move":    | COL.0 | COL.1 | COL.0 | COL.1 | COL.0 | COL.1  - - -
  69.  
  70.  
  71. linea del
  72. bitplane:    000000001111111100000000111111110000000011111111 - - -
  73.  
  74. come vedete c'e` una corrispondenza esatta tra il colore visualizzato e
  75. il registro modificato dalla copperlist. Un registro colore mantiene costante
  76. il suo valore per uno spazio di 16 pixel, ma quel colore viene visualizzato per
  77. i soli 8 pixel del bitplane che lo selezionano (cioe` per i soli 8 pixel a 0
  78. nel caso di COLOR00 e i soli pixel a 1 nel caso di COLOR01). Fin qui abbiamo
  79. utilizzato il nostro bitplane per fare esattamente la stessa cosa che prima
  80. facevamo senza. Ora pero` viene la novita`. Possiamo utilizzare lo scroll
  81. hardware per spostare il bitplane orizzontalmente. Notate che se il valore
  82. di scroll varia da 0 a 7, ogni gruppo di 8 pixel mantiene sempre lo stesso
  83. colore. Infatti il valore contenuto in un registro varia ogni 16 pixel. Con
  84. valori dello scroll da 0 a 7 noi spostiamo il gruppo di 8 pixel sempre
  85. all'interno di questa "fascia" di 16 pixel. Se invece usiamo valori maggiori,
  86. alcuni dei pixel del gruppo usciranno fuori dalla fascia, assumendo pertanto
  87. un nuovo colore.
  88. Guardiamo in dettaglio il fenomeno con l'ausilio di alcune figure. Potete
  89. notare come i registri colore mantengano costante il loro valore per fascie
  90. di 16 pixel. Le fasce dei 2 registri si sovrappongono: le fasce di COLOR01
  91. iniziano e finiscono a meta` di quelle di COLOR00, e viceversa.
  92. Quando usiamo un valore di scroll pari a 0 si ha la seguente situazione:
  93.  
  94. valore in
  95. COLOR01                |    valore 1  |    valore 2  |    valore 3  |   - - 
  96.             V           V          V           
  97. scroll=0:    000000001111111100000000111111110000000011111111 - - -
  98.         ^           ^          ^             ^
  99. valore in    |           |          |             |
  100. COLOR00        |    valore 1  |    valore 2  |    valore 3  |   - - 
  101.  
  102. come vedete ogni gruppo di 8 pixel di valore 0 si trova in corrispondenza dei
  103. primi 8 pixel (cioe` quelli piu` a sinistra) di ogni fascia di 16 per i quali
  104. COLOR00 assume valore costante. Lo stesso discorso vale per i gruppi di 8 pixel
  105. settati a 1 in relazione con le fascie di 16 pixel per i quali COLOR01 rimane
  106. costante. All' aumentare del valore di scroll, i gruppi di 8 pixel si spostano
  107. verso i bordi destri delle fascie. Per es. ecco cosa accade quando lo scroll
  108. e` di 4 pixel:
  109.  
  110. valore in
  111. COLOR01                |    valore 1  |    valore 2  |    valore 3  |   - - 
  112.             V           V          V           
  113. scroll=4:    1111000000001111111100000000111111110000000011111111 - - -
  114.         ^           ^          ^             ^
  115. valore in    |           |          |             |
  116. COLOR00        |    valore 1  |    valore 2  |    valore 3  |   - - 
  117.  
  118. Quando lo scroll e` di 7 pixel, i gruppi di 8 pixel sono allineati con i bordi
  119. destri delle fascie (rispettivamente i pixel a 0 con le fascie di COLOR00 e i
  120. pixel a 1 con le fascie di COLOR01): 
  121.  
  122.  
  123. valore in
  124. COLOR01                |    valore 1  |    valore 2  |    valore 3  |   - - 
  125.             V           V          V           
  126. scroll=7:    1111111000000001111111100000000111111110000000011111111 - - -
  127.         ^           ^          ^             ^
  128. valore in    |           |          |             |
  129. COLOR00        |    valore 1  |    valore 2  |    valore 3  |   - - 
  130.  
  131.  
  132. Non appena lo scroll supera il valore 8, i gruppi di 8 pixel superano i bordi
  133. delle fasce. Questo significa che gli 8 pixel del gruppo non avranno piu` lo
  134. stesso valore. La figura seguente rappresenta la situazione per uno scroll di
  135. 8 pixel.
  136.  
  137. valore in
  138. COLOR01                |    valore 1  |    valore 2  |    valore 3  |   - - 
  139.             V           V          V           
  140. scroll=8:    11111111000000001111111100000000111111110000000011111111 - - -
  141.         ^           ^          ^             ^
  142. valore in    |           |          |             |
  143. COLOR00        |    valore 1  |    valore 2  |    valore 3  |   - - 
  144.  
  145. In questa situazione i primi 7 pixel di ogni gruppo di 8 rientrano in una
  146. fascia e pertanto appaiono con il colore contenuto nel registro colore in
  147. questa fascia, mentre l'ultimo rientra nella fascia seguente e appare del
  148. colore assunto dal registro colore nella nuova fascia. Questo fenomeno crea
  149. dei bruschi cambi di colore che rendono poco gradevole il plasma, dato che 
  150. questo effetto si basa sull'impressione di "mescolamento" dei colori.
  151. Nell'esempio plasm4.s viene applicata questa tecnica.
  152. L'utilizzo dei bitplane ci permette anche di usare delle maschere da
  153. sovrapporre al plasma. Un esempio e` in plasm5.s.
  154. La tecnica vista negli ultimi 2 esempi ha il limite che le oscillazioni
  155. orizzontali sono limitate ad un'ampiezza di 8 pixel. Cio` e` dovuto al fatto
  156. che ogni registro colore rimane costante in una fascia di 16 pixel, e che ogni
  157. gruppo di pixel e` largo 8 pixel: per questo motivo, il gruppo puo` spostarsi
  158. all'interno della fascia di 16-8=8 pixel. Per aumentare l'ampiezza delle
  159. oscillazioni e` necessario allargare le fascie, e per far questo e` necessario
  160. utilizzare piu` registri colore, dato che e` sempre necessario cambiare un
  161. registro ogni 8 pixel. In conclusione, quindi e` necessario usare un maggior
  162. numero di bitplanes. Notate che negli esempi precedenti abbiamo realizzato le
  163. oscillazioni con lo scroll hardware, che ci consente movimenti di massimo 16
  164. pixel. Questa ulteriore limitazione e` superabile facendo oscillare i bitplanes
  165. con il blitter. Naturalmente in questo caso l'oscillzione richiede una routine
  166. molto piu` lenta, e si usano trucchi particolari per realizzarla.
  167. Nell'esempio plasm6.s, che conclude questa "monografia" sul plasma vedremo
  168. come realizzare un plasma con oscillazione orizzontale di 56 pixel.
  169. Tutti i plasmi che abbiamo visto possono essere resi piu` interessanti variando
  170. durante l'esecuzione i parametri che li contraddistinguono e le tabelle che
  171. contengono i colori (o le loro componenti).
  172.  
  173.