提交 a53ad5a7 编写于 作者: N Nicolas Garcia Belmonte 提交者: Mr.doob

Added normals to WebGLRenderer

上级 78561a35
......@@ -6,7 +6,7 @@
THREE.WebGLRenderer = function () {
var _canvas = document.createElement( 'canvas' ), _gl, _program,
viewMatrix = new THREE.Matrix4();
viewMatrix = new THREE.Matrix4(), normalMatrix;
this.domElement = _canvas;
this.autoClear = true;
......@@ -30,8 +30,8 @@ THREE.WebGLRenderer = function () {
this.render = function ( scene, camera ) {
var face, faceColor, object, material,
vertexArray, faceArray, colorArray, vertexIndex,
var face, faceColor, object, material, normal,
vertexArray, faceArray, colorArray, normalArray, vertexIndex,
o, ol, f, fl, m, ml, i, v1, v2, v3, v4;
if ( this.autoClear ) {
......@@ -51,12 +51,14 @@ THREE.WebGLRenderer = function () {
vertexArray = [];
faceArray = [];
colorArray = [];
normalArray = [];
vertexIndex = 0;
for ( f = 0, fl = object.geometry.faces.length; f < fl; f++ ) {
face = object.geometry.faces[ f ];
faceColor = face.color;
normal = face.normal;
if ( face instanceof THREE.Face3 ) {
......@@ -68,6 +70,10 @@ THREE.WebGLRenderer = function () {
vertexArray.push( v2.x, v2.y, v2.z );
vertexArray.push( v3.x, v3.y, v3.z );
normalArray.push( n.x, n.y, n.z );
normalArray.push( n.x, n.y, n.z );
normalArray.push( n.x, n.y, n.z );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
......@@ -88,6 +94,11 @@ THREE.WebGLRenderer = function () {
vertexArray.push( v3.x, v3.y, v3.z );
vertexArray.push( v4.x, v4.y, v4.z );
normalArray.push( n.x, n.y, n.z );
normalArray.push( n.x, n.y, n.z );
normalArray.push( n.x, n.y, n.z );
normalArray.push( n.x, n.y, n.z );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
......@@ -110,6 +121,10 @@ THREE.WebGLRenderer = function () {
_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
_gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( vertexArray ), _gl.STATIC_DRAW );
object.__webGLNormalBuffer = _gl.createBuffer();
_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
_gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( normalArray ), _gl.STATIC_DRAW );
object.__webGLColorBuffer = _gl.createBuffer();
_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLColorBuffer );
_gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( colorArray ), _gl.STATIC_DRAW );
......@@ -128,12 +143,18 @@ THREE.WebGLRenderer = function () {
_program.viewMatrixArray = new Float32Array( viewMatrix.flatten() );
_program.projectionMatrixArray = new Float32Array( camera.projectionMatrix.flatten() );
normalMatrix = Matrix4.makeInvert(viewMatrix).transpose();
_program.normalMatrixArray = new Float32Array( normalMatrix.flatten() );
_gl.uniformMatrix4fv( _program.viewMatrix, false, _program.viewMatrixArray );
_gl.uniformMatrix4fv( _program.projectionMatrix, false, _program.projectionMatrixArray );
_gl.uniformMatrix4fv( _program.normalMatrix, false, _program.normalMatrixArray );
_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
_gl.vertexAttribPointer( _program.position, 3, _gl.FLOAT, false, 0, 0 );
_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
_gl.vertexAttribPointer( _program.normal, 3, _gl.FLOAT, false, 0, 0 );
for ( m = 0, ml = object.material.length; m < ml; m++ ) {
......@@ -225,10 +246,12 @@ THREE.WebGLRenderer = function () {
_gl.attachShader( _program, getShader( "vertex", [
"attribute vec3 position;",
"attribute vec3 normal;",
"attribute vec4 color;",
"uniform mat4 viewMatrix;",
"uniform mat4 projectionMatrix;",
"uniform mat4 normalMatrix;",
"varying vec4 vcolor;",
"void main(void) {",
......@@ -250,6 +273,7 @@ THREE.WebGLRenderer = function () {
_program.viewMatrix = _gl.getUniformLocation( _program, "viewMatrix" );
_program.projectionMatrix = _gl.getUniformLocation( _program, "projectionMatrix" );
_program.normalMatrix = _gl.getUniformLocation( _program, "normalMatrix" );
_program.color = _gl.getAttribLocation( _program, "color" );
_gl.enableVertexAttribArray( _program.color );
......@@ -257,6 +281,9 @@ THREE.WebGLRenderer = function () {
_program.position = _gl.getAttribLocation( _program, "position" );
_gl.enableVertexAttribArray( _program.position );
_program.normal = _gl.getAttribLocation( _program, "normal" );
_gl.enableVertexAttribArray( _program.normal );
_program.viewMatrixArray = new Float32Array(16);
_program.projectionMatrixArray = new Float32Array(16);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册