Skip to content

Commit 20a753a

Browse files
committed
Docs
1 parent b6cb613 commit 20a753a

4 files changed

Lines changed: 23 additions & 29 deletions

File tree

doc/docs.html

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ <h3>
6868
<p>Al fine di organizzare la scena, si è scelto di utilizzare uno schema ben definito per ogni oggetto che dovrà essere renderizzato.</p>
6969
<pre>
7070
var oggetto = {
71+
[name:] //Nome per riconoscere l'oggetto in fase di debug
7172
parts : [ //Array contenente tutte le parti(componenti) dell' oggetto
7273
{
7374
[type:] //Tipo dell'oggetto (es. Carrozzeria, RuotaAnterioreSX ecc...)
@@ -96,7 +97,7 @@ <h3>Processo di rendering</h3>
9697
<li>Caricare gli shader</li>
9798
<li>Calcolare le matrici di manipolazione locali di ogni oggetto</li>
9899
<li>Impostare i buffer per attributes e uniforms webGL</li>
99-
<li>Effettuare il rendering tramite la <i>gl.drawArrays</i></li>
100+
<li>Effettuare il rendering tramite la <i>gl.drawArrays</i> o la <i>gl.drawElements</i> a seconda della necessità</li>
100101
</ul>
101102
Sequenza di chiamate in pseudocodice:
102103
<pre>
@@ -177,17 +178,23 @@ <h3>Impostazioni grafiche e ombre</h3>
177178
<li>Alta(con ombre)[shadows]: aggiunta di shadow mapping all'impostazione high</li>
178179
</ul>
179180
Come modello di illuminazione è stato utilizzata una versione semplificata di quello di phong, dove per ogni materiale anzichè dover specificare le componenti
180-
Ka,Kd,Ks basta specificare il colore con le usuali componenti rgba in aggiunta all'usuale fattore "lucentezza" (shininess). E' stata fatta questa scelta
181-
in conseguenza del fatto che la libreria glm_light non effettua il caricamento dei materiali dai file .obj quindi sono stati inseriti direttamente nel codice
182-
sorgente, per questo motivo si è optato per la più semplice specifica tramite componenti rgba che comunque con l'aggiunta della componente shininess fornisce
183-
un risultato "accettabile" (anche se evidentemente lontano dal fotorealismo).
184-
Per ognuna delle impostazioni è stata definita un apposita coppia di shader(vertex/fragment) all'interno del file <i>shaders.js</i>,
185-
lo shader corrispondente viene caricato ad ogni ciclo di rendering tramite la funzione <i>setupShaders(gfxSettings)</i>.
186-
Nel file <i>shaders.js</i> è presente anche uno shader (<i>shadowProjection</i>) utilizzato per il calcolo della depth texture utilizzata per lo shadow mapping.
187-
Il calcolo della depth texture avviene ad ogni ciclo di rendering (se le ombre sono abilitate) prima del rendering della scena.
188-
Nel file <i>shaders.js</i> è stato anche definito uno shader per il rendering dello skybox.
181+
Ka,Kd,Ks basta specificare il colore con le usuali componenti rgba in aggiunta all'usuale fattore "lucentezza" (shininess). <br/>
182+
E' stata fatta questa scelta in conseguenza del fatto che la libreria glm_light non effettua il caricamento dei materiali dai file .obj quindi sono stati inseriti
183+
direttamente nel codice sorgente, per questo motivo si è optato per la più semplice specifica tramite componenti rgba che comunque con l'aggiunta della componente
184+
shininess fornisce un risultato "accettabile" (anche se evidentemente lontano dal fotorealismo). <br/>
185+
Per ognuna delle impostazioni (low/high/shadows) è stata definita un apposita coppia di shader(vertex/fragment) all'interno del file <i>shaders.js</i>,
186+
lo shader corrispondente viene caricato ad ogni ciclo di rendering tramite la funzione <i>setupShaders(gfxSettings)</i>. <br/>
187+
Nel file <i>shaders.js</i> è presente anche uno shader (<i>shadowProjection</i>) utilizzato per il calcolo della depth texture utilizzata per lo shadow mapping.
188+
Il calcolo della depth texture avviene ad ogni ciclo di rendering (se le ombre sono abilitate) prima del rendering della scena. <br/>
189+
Nel file <i>shaders.js</i> è stato anche definito uno shader per il rendering dello skybox. <br/>
190+
<br/>
191+
<h4>NOTA ombre su dispositivi mobili:</h4>
192+
Le ombre causano parecchi artefatti sui dispositivi mobili a causa della precisione dimezzata dei float su molti dispositivi. Questo inoltre porta alla necessità di un valore di bias molto alto.
193+
(Per ulteriori info: <a href="https://stackoverflow.com/questions/25509968/shadow-mapping-in-webgl-without-webgl-depth-texture-on-android-devices">Discussione stackoverflow</a>) <br/>
194+
<br/>
195+
Per ridurre il problema ho cercato di ridurre il più possibile la differenza tra i valori near/far della camera utilizzata per la depth projection in modo da contenere perfettamente la scena ad ogni modo il problema
196+
è completamente risolto. Inoltre avendo utilizzato una "luce punto", la camera richiede un FoV abbastanza grande (in modo da comprire l'intera scena) e questo comporta una scarsa precisione. <br/>
189197

190-
NOTA: le ombre non sono attualmente supportate su dispositivi mobile (vedi: <a href="https://stackoverflow.com/questions/25509968/shadow-mapping-in-webgl-without-webgl-depth-texture-on-android-devices">Discussione stackoverflow</a>)
191198
</p>
192199
</div>
193200
</body>

game.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function start(){
8080

8181
// Metodo di rendering
8282
function drawScene(elapsed) {
83-
if(!gl.ext) showDepthBuffer = false;
83+
if(!gl.ext) showDepthBuffer = false; //Se l'estensione WEBGL_depth_texture nonè disponibile disattivo le ombre
8484
if(!showDepthBuffer)
8585
webglUtils.resizeCanvasToDisplaySize(gl.canvas);
8686
gl.enable(gl.CULL_FACE);
@@ -107,7 +107,7 @@ function drawScene(elapsed) {
107107
gl.viewport(0,0,getDepthTextureSize(), getDepthTextureSize());
108108
}
109109
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
110-
if(gl.ext && (showDepthBuffer || gfxSettings === 'shadows')){//Calcola ombre solo se attive e impostazione su high (illuminazione abilitata)
110+
if(gl.ext && (showDepthBuffer || gfxSettings === 'shadows')){//Calcola ombre solo se attive e impostazione su high (illuminazione abilitata) (e estensione disponibile)
111111
if(!showDepthBuffer)
112112
setupShaders(gl, 'shadowProjection'); //Imposto lo shader per la proizione delle ombre
113113
else
@@ -118,7 +118,7 @@ function drawScene(elapsed) {
118118
});
119119
}
120120
if(showDepthBuffer)
121-
return;
121+
return; //Se è attivo il debug del'depthBuffer salto il normale processo di rendering
122122
/* Rendering della scena */
123123
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
124124
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);

my-webgl-lib.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,10 @@ function getTransparentTexture(){
268268
////////////////////
269269
// OMBRE
270270
////////////////////
271-
let depthTextureSize; //Risoluzione ombre
271+
let depthTextureSize; //Risoluzione texture per ombre
272272
let depthTexture, depthFramebuffer;
273273

274+
// Imposta la massima risoluzione grafica supportata per la depth projection (cap a 8192px)
274275
function getDepthTextureSize(){
275276
if(depthTextureSize === undefined){
276277
depthTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); //Ottengo la dimensione massima in base a quella supportata dalla GPU

shaders.js

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,6 @@ var shaderScripts = {
7171
gl_FragColor = tex + u_color * (1.-tex.a);
7272
gl_FragColor.rgb *= light;
7373
gl_FragColor.rgb += specularLight;
74-
75-
//DEBUG
76-
//gl_FragColor = vec4(normalize(v_projectedTexcoord.xyz), 1.);
77-
//gl_FragColor = vec4(normal, 1.0);
78-
//float val = shadowLight;
79-
//gl_FragColor = vec4(val, val, val, 1.0);
80-
//gl_FragColor = texture2D(u_depthTexture, vec2(gl_FragCoord.x/1184., gl_FragCoord.y/998.));
8174
}`,
8275
},
8376
shadows : {
@@ -161,13 +154,6 @@ var shaderScripts = {
161154
gl_FragColor = tex + u_color * (1.-tex.a);
162155
gl_FragColor.rgb *= light;
163156
gl_FragColor.rgb += specularLight * shadowLight;
164-
165-
//DEBUG
166-
//gl_FragColor = vec4(normalize(v_projectedTexcoord.xyz), 1.);
167-
//gl_FragColor = vec4(normal, 1.0);
168-
//float val = shadowLight;
169-
//gl_FragColor = vec4(val, val, val, 1.0);
170-
//gl_FragColor = texture2D(u_depthTexture, vec2(gl_FragCoord.x/1184., gl_FragCoord.y/998.));
171157
}`,
172158
},
173159
skybox: {

0 commit comments

Comments
 (0)