This shows you the differences between two versions of the page.
vdvac:lab2 [2024/03/25 14:34] anca.morar [Etapa 2] |
vdvac:lab2 [2024/03/25 15:41] (current) anca.morar [Etapa 2] |
||
---|---|---|---|
Line 7: | Line 7: | ||
**Figura 1** | **Figura 1** | ||
- | {{:vdvac:lab2_fig1.png?480|}} | + | {{:vdvac:lab2_fig1.png?550|}} |
===== Concepte teoretice ===== | ===== Concepte teoretice ===== | ||
Line 38: | Line 38: | ||
</code> | </code> | ||
- | * Atunci culorile punctelor reprezintă chiar coordonatele lor. În Figura 2.stânga se văd fețele față ale cubului și în dreapta, fețele spate: | + | * Atunci culorile punctelor reprezintă chiar coordonatele lor. În Figura 2, stânga, se văd fețele față ale cubului și în dreapta, fețele spate: |
* punctele de pe fețele față sunt punctele în care razele intră în volum | * punctele de pe fețele față sunt punctele în care razele intră în volum | ||
* punctele de pe fețele spate sunt punctele în care razele ies din volum | * punctele de pe fețele spate sunt punctele în care razele ies din volum | ||
**Figura 2** | **Figura 2** | ||
+ | |||
{{:vdvac:lab2_fig2.png?400|}} | {{:vdvac:lab2_fig2.png?400|}} | ||
==== Etapa 1 ==== | ==== Etapa 1 ==== | ||
- | **Determinarea punctelor de ieșire din volum ale razelor** | + | **Determinarea punctelor de ieșire ale razelor din volum** |
* Se desenează într-un framebuffer (nu în cel default)<code>frameBuffer->Bind(); </code> | * Se desenează într-un framebuffer (nu în cel default)<code>frameBuffer->Bind(); </code> | ||
* Se rasterizează fețele din spate ale cubului încadrator<code>glEnable(GL_CULL_FACE); | * Se rasterizează fețele din spate ale cubului încadrator<code>glEnable(GL_CULL_FACE); | ||
Line 55: | Line 56: | ||
==== Etapa 2 ==== | ==== Etapa 2 ==== | ||
- | **Determinarea punctelor de ieșire din volum ale razelor** | + | **Determinarea punctelor de intrare ale razelor în volum ** |
* Se desenează în buffer-ul default<code>FrameBuffer::BindDefault();</code> | * Se desenează în buffer-ul default<code>FrameBuffer::BindDefault();</code> | ||
Line 77: | Line 78: | ||
* ''ExitPointCoord '' se folosește în **fragment shader** pentru accesarea texturii create în prima etapă. | * ''ExitPointCoord '' se folosește în **fragment shader** pentru accesarea texturii create în prima etapă. | ||
* pentru indexarea texturii se obțin coordonatecoordonate ''ExitFragCoord'' cu valori cuprinse între 0 și 1: | * pentru indexarea texturii se obțin coordonatecoordonate ''ExitFragCoord'' cu valori cuprinse între 0 și 1: | ||
- | {{:vdvac:lab2_fig3.png?250|}} | + | {{ :vdvac:lab2_fig3.png?270 |}} |
* Punctul de intrare se obține din culoarea fragmentului curent (în VS): <code>EntryPoint = v_color;</code> | * Punctul de intrare se obține din culoarea fragmentului curent (în VS): <code>EntryPoint = v_color;</code> | ||
Line 86: | Line 88: | ||
* Se modulează opacitatea și culoarea | * Se modulează opacitatea și culoarea | ||
* Se realizează compunere din față în spate<code>colorAcum.rgb += (1.0 - colorAcum.a) * colorSample.rgb; | * Se realizează compunere din față în spate<code>colorAcum.rgb += (1.0 - colorAcum.a) * colorSample.rgb; | ||
- | colorAcum.a += (1.0 - colorAcum.a) * colorSample.a;</code> | + | colorAcum.a += (1.0 - colorAcum.a) * colorSample.a;</code> |
* Se verifică dacă raza curentă a ieșit din volum sau dacă opacitatea acumulată a ajuns la 1 | * Se verifică dacă raza curentă a ieșit din volum sau dacă opacitatea acumulată a ajuns la 1 | ||
- | ==== Cerinte laborator ==== | + | ==== Cerințe laborator ==== |
- | - Să se completeze variabila ''frag_color'' pentru a fi transmisă mai departe către fragment shader (în ''VertexShader_backface.glsl'' | + | - Să se completeze valoarea variabilei ''frag_color'' pentru a fi transmisă mai departe către fragment shader (în ''VertexShader_backface.glsl'') |
- Să se calculeze corect culoarea ''out_color'' ca să se afișeze fețele spate ale volumului încadrator (în ''FragmentShader_backface.glsl'') | - Să se calculeze corect culoarea ''out_color'' ca să se afișeze fețele spate ale volumului încadrator (în ''FragmentShader_backface.glsl'') | ||
- Să se trimită către fragment shader ''EntryPoint'' și ''ExitPointCoord'' (în ''VertexShader_raycasting.glsl'') | - Să se trimită către fragment shader ''EntryPoint'' și ''ExitPointCoord'' (în ''VertexShader_raycasting.glsl'') | ||
Line 98: | Line 100: | ||
- Să se calculeze vectorul cu care se înaintează pe rază (de la punctul de eșantionare curent la următorul) | - Să se calculeze vectorul cu care se înaintează pe rază (de la punctul de eșantionare curent la următorul) | ||
- Să se calculeze valoarea scalară a eșantionului curent (în funcție de textura ''VolumeTex'' și de coordonata de textură ''voxelCoord'') | - Să se calculeze valoarea scalară a eșantionului curent (în funcție de textura ''VolumeTex'' și de coordonata de textură ''voxelCoord'') | ||
- | - Să se calculeze culoarea eșantionului curent (în funcție de textura ''TransferFunc'' și de coordonata de textură valoarea scalară curentă) | + | - Să se calculeze culoarea eșantionului curent (în funcție de textura ''TransferFunc'' și de coordonata de textură dată de valoarea scalară curentă) |
- | - Să se actualizeze poziția eșantionului curent | + | - Să se actualizeze poziția eșantionului |
- Să se actualizeze lungimea parcursă pe rază | - Să se actualizeze lungimea parcursă pe rază | ||
+ | |||
+ | |||
+ | ==== Demo ==== | ||
+ | |||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="430" height="250" src="https://www.youtube.com/embed/Bl_fSKLk-Cs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> | ||
+ |