Files
Kepler/engine/renderPasses/deferred.js
2025-11-17 17:18:43 +01:00

273 lines
7.5 KiB
JavaScript
Executable File

import framebuffer from '../framebuffer.js';
import sampler2D from '../sampler2D.js';
import {math, vector3, matrix4} from '../math.js';
class deferred {
constructor( ) {
this.realtime = true;
this.render_type = "deferred";
}
setViewport( viewport ){
this.viewport = viewport;
this.gl = viewport.gl;
}
prepare() {
// Framebuffer
this.framebuffer = new framebuffer();
this.framebuffer.setViewport( this.viewport );
this.framebuffer.width = this.viewport.width;
this.framebuffer.height = this.viewport.height;
// Samplers
this.diffuseSampler = new sampler2D();
this.diffuseSampler.type = this.gl.FLOAT;
this.diffuseSampler.internalFormat = this.gl.RGBA32F;
this.normalSampler = new sampler2D();
this.normalSampler.type = this.gl.FLOAT;
this.normalSampler.internalFormat = this.gl.RGBA32F;
this.infoSampler = new sampler2D();
this.infoSampler.type = this.gl.FLOAT;
this.infoSampler.internalFormat = this.gl.RGBA32F;
this.tangentSampler = new sampler2D();
this.tangentSampler.type = this.gl.FLOAT;
this.tangentSampler.internalFormat = this.gl.RGBA32F;
// Sampler
var materialSampler = new sampler2D();
this.framebuffer.addSampler(this.diffuseSampler);
this.framebuffer.addSampler(this.normalSampler);
this.framebuffer.addSampler(this.infoSampler);
this.framebuffer.create();
}
render() {
var camera = this.viewport.mainCamera;
var viewProjection = camera.worldViewProjection;
var mode = 0;
this.gl.enableVertexAttribArray(0);
this.gl.enableVertexAttribArray(1);
this.gl.enableVertexAttribArray(2);
//this.gl.enableVertexAttribArray(3);
//this.gl.enableVertexAttribArray(4);
if(this.renderToViewport)
this.gl.bindFramebuffer( this.gl.FRAMEBUFFER, null );
else
this.gl.bindFramebuffer( this.gl.FRAMEBUFFER, this.framebuffer.glFramebuffer );
if(mode == 1) {
var sampler = this.framebuffer.samplers[0];
var texture = sampler.cubeTexture;
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.framebuffer.framebuffers[3]);
this.gl.framebufferRenderbuffer(this.gl.FRAMEBUFFER, this.gl.DEPTH_ATTACHMENT, this.gl.RENDERBUFFER, this.framebuffer.renderbuffers[3]);
this.gl.texImage2D(face, 0, this.gl.RGBA, 1024, 1024, 0, this.gl.RGBA, this.gl.FLOAT, null);
this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, face, texture, 0);
}
this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
this.gl.viewport(0, 0, this.viewport.width, this.viewport.height);
this.gl.clearColor( 0, 0, 0, 1 );
this.gl.enable(this.gl.DEPTH_TEST);
this.gl.enable(this.gl.CULL_FACE);
var scene = this.viewport.scene;
var entitys = scene.getEntitys();
for(var e = 0;e<entitys.length;e++) {
var entity = entitys[e];
this.gl.disableVertexAttribArray(3);
this.gl.disableVertexAttribArray(4);
if(entity.type == "Actor") {
var mesh = entity.mesh;
var material = mesh.material;
var shader = mesh.material.shader;
shader.update( this.viewport );
if(material.alpha == 1.0) {
if(this.render_type == "deferred")
shader.setUniform("render_type", 1);
else
shader.setUniform("render_type", 0);
var world = entity.getUpdatedWorldMatrix();
shader.setUniform("viewProjection", matrix4.mul(world, viewProjection) );
shader.setUniform("world", world );
//shader.setUniform("mode", mode );
shader.setUniform("cameraPosition", this.viewport.mainCamera.eye );
shader.setUniform("worldInverseTranspose", world );
if(material.displacementMaps.length > 0)
shader.setUniform("view", this.viewport.mainCamera.view );
// note: needs a smooting out mesh->material->shader update cycle only at startup right before render loop
mesh.setViewport(this.viewport );
mesh.createBuffers( );
material.setViewport( this.viewport );
material.updateShader( );
shader.update( this.viewport );
var attribute = shader.getAttributeByName('position');
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, mesh.vertexPositionBuffer);
this.gl.vertexAttribPointer(attribute, 3, this.gl.FLOAT, false, 0, 0);
var attribute = shader.getAttributeByName('normal');
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, mesh.vertexNormalBuffer);
this.gl.vertexAttribPointer(attribute, 3, this.gl.FLOAT, false, 0, 0);
var attribute = shader.getAttributeByName('textcoord');
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, mesh.textureCoordBuffer);
this.gl.vertexAttribPointer(attribute, 2, this.gl.FLOAT, false, 0, 0);
if(material.normals.length > 0) {
if(mesh.tangentBuffer) {
this.gl.enableVertexAttribArray(3);
this.gl.enableVertexAttribArray(4);
var attribute = shader.getAttributeByName('tangent');
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, mesh.tangentBuffer);
this.gl.vertexAttribPointer(attribute, 3, this.gl.FLOAT, false, 0, 0);
var attribute = shader.getAttributeByName('bitangent');
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, mesh.binormalBuffer);
this.gl.vertexAttribPointer(attribute, 3, this.gl.FLOAT, false, 0, 0);
}
}
var texureID = 0;
/*
if( material.textures.length > 0 ) {
var textureSampler = material.textures[0];
var texture = textureSampler.getTexture();
var textureUniform = shader.getUniformByName('diffuseSampler');
this.gl.activeTexture( this.gl.TEXTURE0 );
this.gl.bindTexture( this.gl.TEXTURE_2D, texture.glTexture );
this.gl.uniform1i(textureUniform, 0);
} else {
//shader.setUniform("diffuseColor", material.diffuseColor);
}
if(material.normals.length > 0) {
var textureSampler = material.normals[0];
var texture = textureSampler.getTexture();
var textureUniform = shader.getUniformByName('normalSampler');
this.gl.activeTexture( this.gl.TEXTURE0 + 1);
this.gl.bindTexture( this.gl.TEXTURE_2D, texture.glTexture );
this.gl.uniform1i(textureUniform, 1);
}
if(material.roughnessMaps.length > 0) {
var textureSampler = material.roughnessMaps[0];
var texture = textureSampler.getTexture();
if(texture) {
//console.log("texturetexture", texture);
var textureUniform = shader.getUniformByName('roughnessSampler');
this.gl.activeTexture( this.gl.TEXTURE0 + 2);
this.gl.bindTexture( this.gl.TEXTURE_2D, texture.glTexture );
this.gl.uniform1i(textureUniform, 2);
}
}
if(material.displacementMaps.length > 0) {
var textureSampler = material.displacementMaps[0];
var texture = textureSampler.getTexture();
var textureUniform = shader.getUniformByName('heightSampler');
this.gl.activeTexture( this.gl.TEXTURE0 + 3);
this.gl.bindTexture( this.gl.TEXTURE_2D, texture.glTexture );
this.gl.uniform1i(textureUniform, 3);
}
*/
this.gl.bindBuffer( this.gl.ELEMENT_ARRAY_BUFFER, mesh.vertexIndexBuffer);
this.gl.drawElements( mesh.draw_type, mesh.vertexIndexBuffer.numItems, this.gl.UNSIGNED_INT, 0 );
}
}
}
this.gl.disable(this.gl.DEPTH_TEST);
this.gl.disableVertexAttribArray(0);
this.gl.disableVertexAttribArray(1);
this.gl.disableVertexAttribArray(2);
this.gl.disableVertexAttribArray(3);
this.gl.disableVertexAttribArray(4);
}
}
export {deferred as default};