88 uniform mat4 uMMatrix ;
99 uniform mat4 uVMatrix ;
1010 uniform mat4 uPMatrix ;
11+ uniform mat3 uNMatrix ;
12+
13+ uniform vec3 uCorAmbiente ;
14+ uniform vec3 uDirecaoLuz ;
15+ uniform vec3 uCorDifusa ;
16+
17+ uniform bool uUsarLuz ;
1118
1219 varying vec2 vTextureCoord ;
20+ varying vec3 vPotenciaLuz ;
1321
1422 void main ( void )
1523 {
1624 gl_Position = uPMatrix * uVMatrix * uMMatrix * vec4 ( aVertexPosition , 1.0 ) ;
1725 vTextureCoord = aTextureCoord ;
26+
27+ if ( ! uUsarLuz ) {
28+ vPotenciaLuz = vec3 ( 1.0 , 1.0 , 1.0 ) ;
29+ } else
30+ {
31+ vec3 normalTransformado = uNMatrix * aVertexNormal ;
32+ float potenciaLuz = max ( dot ( normalTransformado , uDirecaoLuz ) , 0.0 ) ;
33+ vPotenciaLuz = uCorAmbiente + uCorDifusa * potenciaLuz ;
34+ }
1835 }
1936 </ script >
2037 < script id ="shader-fs " type ="x-shader/x-fragment ">
2138 precision mediump float ;
2239 varying vec2 vTextureCoord ;
40+ varying vec3 vPotenciaLuz ;
2341
2442 uniform sampler2D uSampler ;
2543
2644 void main ( void )
2745 {
28- gl_FragColor = texture2D ( uSampler , vec2 ( vTextureCoord . s , vTextureCoord . t ) ) ;
46+ vec4 corTextura = texture2D ( uSampler , vec2 ( vTextureCoord . s , vTextureCoord . t ) ) ;
47+ gl_FragColor = vec4 ( corTextura . rgb * vPotenciaLuz , corTextura . a ) ;
2948 }
3049 </ script >
3150
4160 var cuboVertexPositionBuffer ;
4261 var cuboVertexTextureCoordBuffer ;
4362 var cuboVertexIndexBuffer ;
63+ var cuboVertexNormalBuffer ;
4464
4565 var mMatrix = mat4 . create ( ) ;
4666 var mMatrixPilha = [ ] ;
5474
5575 var z = - 5.0 ;
5676
57- var filtro = 0 ;
58-
5977 var ultimo = 0 ;
6078
61- var caixaTexturas = Array ( ) ;
79+ var caixaTextura ;
6280 var teclasPressionadas = { } ;
81+
82+ var luzCheckBox ;
83+ var vermelhoInput ;
84+ var verdeInput ;
85+ var azulInput ;
6386
6487 // Iniciar o ambiente quando a página for carregada
6588 $ ( function ( )
94117
95118 function eventoTeclaPress ( evento ) {
96119 teclasPressionadas [ evento . keyCode ] = true ;
97-
98- if ( String . fromCharCode ( evento . keyCode ) == "F" )
99- filtro = ( filtro + 1 ) % 3 ;
100120 return false ;
101121 }
102122
135155 function iniciarTextura ( )
136156 {
137157 var imagemCaixa = new Image ( ) ;
138- for ( var i = 0 ; i < 3 ; i ++ )
139- {
140- var textura = gl . createTexture ( ) ;
141- textura . image = imagemCaixa ;
142- caixaTexturas . push ( textura ) ;
143- }
158+ var caixaTextura = gl . createTexture ( ) ;
159+ caixaTextura . image = imagemCaixa ;
144160 imagemCaixa . onload = function ( )
145161 {
146- tratarTextura ( caixaTexturas ) ;
162+ tratarTextura ( caixaTextura ) ;
147163 }
148164 imagemCaixa . src = "caixa.gif" ;
149165 shaderProgram . samplerUniform = gl . getUniformLocation ( shaderProgram , "uSampler" ) ;
150166 }
151- function tratarTextura ( texturas )
167+ function tratarTextura ( textura )
152168 {
153169 gl . pixelStorei ( gl . UNPACK_FLIP_Y_WEBGL , true ) ;
154- gl . bindTexture ( gl . TEXTURE_2D , texturas [ 0 ] ) ;
155- gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , gl . RGBA , gl . UNSIGNED_BYTE , texturas [ 0 ] . image ) ;
170+ gl . bindTexture ( gl . TEXTURE_2D , textura ) ;
171+ gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , gl . RGBA , gl . UNSIGNED_BYTE , textura . image ) ;
156172 gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MAG_FILTER , gl . NEAREST ) ;
157173 gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MIN_FILTER , gl . NEAREST ) ;
158174
159- gl . bindTexture ( gl . TEXTURE_2D , texturas [ 1 ] ) ;
160- gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , gl . RGBA , gl . UNSIGNED_BYTE , texturas [ 1 ] . image ) ;
161- gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MAG_FILTER , gl . LINEAR ) ;
162- gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MIN_FILTER , gl . LINEAR ) ;
163-
164- gl . bindTexture ( gl . TEXTURE_2D , texturas [ 2 ] ) ;
165- gl . texImage2D ( gl . TEXTURE_2D , 0 , gl . RGBA , gl . RGBA , gl . UNSIGNED_BYTE , texturas [ 2 ] . image ) ;
166- gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MAG_FILTER , gl . LINEAR ) ;
167- gl . texParameteri ( gl . TEXTURE_2D , gl . TEXTURE_MIN_FILTER , gl . LINEAR_MIPMAP_NEAREST ) ;
168- gl . generateMipmap ( gl . TEXTURE_2D ) ;
169-
170175 gl . bindTexture ( gl . TEXTURE_2D , null ) ;
171176 }
172177
210215 shaderProgram . vertexTextureCoordAttribute = gl . getAttribLocation ( shaderProgram , "aTextureCoord" ) ;
211216 gl . enableVertexAttribArray ( shaderProgram . vertexTextureCoordAttribute ) ;
212217
218+ shaderProgram . vertexNormalAttribute = gl . getAttribLocation ( shaderProgram , "aNormal" ) ;
219+ gl . enableVertexAttribArray ( shaderProgram . vertexNormalAttribute ) ;
220+
213221 shaderProgram . pMatrixUniform = gl . getUniformLocation ( shaderProgram , "uPMatrix" ) ;
214222 shaderProgram . vMatrixUniform = gl . getUniformLocation ( shaderProgram , "uVMatrix" ) ;
215223 shaderProgram . mMatrixUniform = gl . getUniformLocation ( shaderProgram , "uMMatrix" ) ;
224+ shaderProgram . usarLuzUniform = gl . getUniformLocation ( shaderProgram , "uUsarLuz" ) ;
225+ shaderProgram . corAmbienteUniform = gl . getUniformLocation ( shaderProgram , "uCorAmbiente" ) ;
226+ shaderProgram . corDifusaUniform = gl . getUniformLocation ( shaderProgram , "uCorDifusa" ) ;
227+ shaderProgram . direcaoLuzUniform = gl . getUniformLocation ( shaderProgram , "uDirecaoLuz" ) ;
216228
217229
218230 }
361373 gl . bufferData ( gl . ELEMENT_ARRAY_BUFFER , new Uint16Array ( indices ) , gl . STATIC_DRAW ) ;
362374 cuboVertexIndexBuffer . itemSize = 1 ;
363375 cuboVertexIndexBuffer . numItems = 36 ;
376+
377+ cuboVertexNormalBuffer = gl . createBuffer ( ) ;
378+ gl . bindBuffer ( gl . ARRAY_BUFFER , cuboVertexNormalBuffer ) ;
379+ var vertexNormals = [
380+ // Frente
381+ 0.0 , 0.0 , 1.0 ,
382+ 0.0 , 0.0 , 1.0 ,
383+ 0.0 , 0.0 , 1.0 ,
384+ 0.0 , 0.0 , 1.0 ,
385+
386+ // Trás
387+ 0.0 , 0.0 , - 1.0 ,
388+ 0.0 , 0.0 , - 1.0 ,
389+ 0.0 , 0.0 , - 1.0 ,
390+ 0.0 , 0.0 , - 1.0 ,
391+
392+ // Topo
393+ 0.0 , 1.0 , 0.0 ,
394+ 0.0 , 1.0 , 0.0 ,
395+ 0.0 , 1.0 , 0.0 ,
396+ 0.0 , 1.0 , 0.0 ,
397+
398+ // Base
399+ 0.0 , - 1.0 , 0.0 ,
400+ 0.0 , - 1.0 , 0.0 ,
401+ 0.0 , - 1.0 , 0.0 ,
402+ 0.0 , - 1.0 , 0.0 ,
403+
404+ // Direita
405+ 1.0 , 0.0 , 0.0 ,
406+ 1.0 , 0.0 , 0.0 ,
407+ 1.0 , 0.0 , 0.0 ,
408+ 1.0 , 0.0 , 0.0 ,
409+
410+ // Esquerda
411+ - 1.0 , 0.0 , 0.0 ,
412+ - 1.0 , 0.0 , 0.0 ,
413+ - 1.0 , 0.0 , 0.0 ,
414+ - 1.0 , 0.0 , 0.0 ,
415+ ] ;
416+ gl . bufferData ( gl . ARRAY_BUFFER , new Float32Array ( vertexNormals ) , gl . STATIC_DRAW ) ;
417+ cubeVertexNormalBuffer . itemSize = 3 ;
418+ cubeVertexNormalBuffer . numItems = 24 ;
364419 }
365420
366421 function iniciarAmbiente ( )
367422 {
368423 gl . clearColor ( 0.0 , 0.0 , 0.0 , 1.0 ) ;
369424 gl . enable ( gl . DEPTH_TEST ) ;
425+ luzCheckBox = document . getElementById ( "luz" ) ;
426+ vermelhoInput = document . getElementById ( "vermelho" ) ;
427+ verdeInput = document . getElementById ( "verde" ) ;
428+ azulInput = document . getElementById ( "azul" ) ;
370429 }
371430
372431 function desenharCena ( )
386445 gl . vertexAttribPointer ( shaderProgram . vertexPositionAttribute , cuboVertexPositionBuffer . itemSize , gl . FLOAT , false , 0 , 0 ) ;
387446 gl . bindBuffer ( gl . ARRAY_BUFFER , cuboVertexTextureCoordBuffer ) ;
388447 gl . vertexAttribPointer ( shaderProgram . vertexTextureCoordAttribute , cuboVertexTextureCoordBuffer . itemSize , gl . FLOAT , false , 0 , 0 ) ;
448+ gl . bindBuffer ( gl . ARRAY_BUFFER , cuboVertexNormalBuffer ) ;
449+ gl . vertexAttribPointer ( shaderProgram . vertexNormalAttribute , cuboVertexNormalBuffer . itemSize , gl . FLOAT , false , 0 , 0 ) ;
389450
390451 gl . activeTexture ( gl . TEXTURE0 ) ;
391- gl . bindTexture ( gl . TEXTURE_2D , caixaTexturas [ filtro ] ) ;
452+ gl . bindTexture ( gl . TEXTURE_2D , caixaTextura ) ;
392453 gl . uniform1i ( shaderProgram . samplerUniform , 0 ) ;
393454
455+ var luz = luzCheckBox . checked ;
456+ gl . uniform1i ( shaderProgram . usarLuzUniform , luz ) ;
457+ if ( luz )
458+ {
459+ gl . uniform3f ( shaderProgram . corAmbienteUniform ,
460+ parseFloat ( document . getElement ) ) ;
461+ }
462+
394463 gl . bindBuffer ( gl . ELEMENT_ARRAY_BUFFER , cuboVertexIndexBuffer ) ;
395464 setMatrixUniforms ( ) ;
396465 gl . drawElements ( gl . TRIANGLES , cuboVertexIndexBuffer . numItems , gl . UNSIGNED_SHORT , 0 ) ;
452521
453522 < body >
454523 < canvas id ="licao01-canvas " width ="500 " height ="500 "> </ canvas >
524+ < form >
525+ < input type ="checkbox " name ="luz " value ="luz " checked > < label for ="luz "> Luz</ label > < br >
526+
527+ </ form >
455528 </ body >
456529</ html >
0 commit comments