Vao Abstraction
This commit is contained in:
		
							parent
							
								
									6ac30925d0
								
							
						
					
					
						commit
						badd6e7f5f
					
				
					 3 changed files with 57 additions and 18 deletions
				
			
		| 
						 | 
					@ -82,4 +82,33 @@ export class GLProgram{
 | 
				
			||||||
    unuse(gl:WebGL2RenderingContext):void{
 | 
					    unuse(gl:WebGL2RenderingContext):void{
 | 
				
			||||||
        gl.useProgram(null);
 | 
					        gl.useProgram(null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class VertexArray{
 | 
				
			||||||
 | 
					    readonly vao:WebGLVertexArrayObject;
 | 
				
			||||||
 | 
					    constructor(vao:WebGLVertexArrayObject){
 | 
				
			||||||
 | 
					        this.vao = vao;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    bind(gl:WebGL2RenderingContext){
 | 
				
			||||||
 | 
					        gl.bindVertexArray(this.vao);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    unbind(gl:WebGL2RenderingContext){
 | 
				
			||||||
 | 
					        gl.bindVertexArray(null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    addBuffer(gl:WebGL2RenderingContext,va:VertexBuffer,loc:number,layout:{
 | 
				
			||||||
 | 
					        /**count of one element */
 | 
				
			||||||
 | 
					        count: GLint,
 | 
				
			||||||
 | 
					        type: GLenum,
 | 
				
			||||||
 | 
					        normalized: GLboolean,
 | 
				
			||||||
 | 
					        stride: GLsizei,
 | 
				
			||||||
 | 
					        offset: GLintptr
 | 
				
			||||||
 | 
					    }){
 | 
				
			||||||
 | 
					        this.bind(gl);
 | 
				
			||||||
 | 
					        va.bind(gl);
 | 
				
			||||||
 | 
					        gl.enableVertexAttribArray(loc);
 | 
				
			||||||
 | 
					        gl.vertexAttribPointer(loc,layout.count,layout.type,layout.normalized,layout.stride,layout.offset);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export function createVertexArray(gl:WebGL2RenderingContext){
 | 
				
			||||||
 | 
					    return new VertexArray(gl.createVertexArray());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ export class Renderer2D implements RenderProgram{
 | 
				
			||||||
    uniforms : UniformSet;
 | 
					    uniforms : UniformSet;
 | 
				
			||||||
    program: G.GLProgram;
 | 
					    program: G.GLProgram;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    vao: WebGLVertexArrayObject;
 | 
					    vao: G.VertexArray;
 | 
				
			||||||
    positionBuffer: G.VertexBuffer;
 | 
					    positionBuffer: G.VertexBuffer;
 | 
				
			||||||
    indexBuffer: G.IndexBuffer;
 | 
					    indexBuffer: G.IndexBuffer;
 | 
				
			||||||
    constructor(gl: WebGL2RenderingContext){
 | 
					    constructor(gl: WebGL2RenderingContext){
 | 
				
			||||||
| 
						 | 
					@ -45,17 +45,22 @@ export class Renderer2D implements RenderProgram{
 | 
				
			||||||
            0,1,2,
 | 
					            0,1,2,
 | 
				
			||||||
            2,3,0
 | 
					            2,3,0
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        this.vao = gl.createVertexArray();
 | 
					        this.vao = G.createVertexArray(gl);
 | 
				
			||||||
        const posLoc = this.program.getAttribLocation(gl,"pos"); 
 | 
					        const posLoc = this.program.getAttribLocation(gl,"pos");
 | 
				
			||||||
        gl.bindVertexArray(this.vao);
 | 
					        this.vao.bind(gl);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        this.positionBuffer = G.createVertexBuffer(gl,position);
 | 
					        this.positionBuffer = G.createVertexBuffer(gl,position);
 | 
				
			||||||
        this.positionBuffer.bind(gl);
 | 
					        this.vao.addBuffer(gl,this.positionBuffer,posLoc,{
 | 
				
			||||||
        gl.enableVertexAttribArray(posLoc);
 | 
					            count:2,
 | 
				
			||||||
        gl.vertexAttribPointer(posLoc,2,gl.FLOAT,false,0,0);
 | 
					            type:gl.FLOAT,
 | 
				
			||||||
 | 
					            normalized:false,
 | 
				
			||||||
 | 
					            stride:0,
 | 
				
			||||||
 | 
					            offset:0
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.indexBuffer = G.createIndexBuffer(gl,index);
 | 
					        this.indexBuffer = G.createIndexBuffer(gl,index);
 | 
				
			||||||
        this.indexBuffer.bind(gl);
 | 
					        this.indexBuffer.bind(gl);
 | 
				
			||||||
 | 
					        this.vao.unbind(gl);
 | 
				
			||||||
        this.setUniform(this.uniforms);
 | 
					        this.setUniform(this.uniforms);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    useProgram(){
 | 
					    useProgram(){
 | 
				
			||||||
| 
						 | 
					@ -69,9 +74,9 @@ export class Renderer2D implements RenderProgram{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const location = this.program.getUniformLocation(gl,"u_color");//u_color 변수 위치를 참조
 | 
					        const location = this.program.getUniformLocation(gl,"u_color");//u_color 변수 위치를 참조
 | 
				
			||||||
        gl.uniform4f(location, this.uniforms.redcolor, 0.3, 0.8, 1.0); //해당 위치에 0.2, 0.3, 0.8, 1.0 데이터를 전달
 | 
					        gl.uniform4f(location, this.uniforms.redcolor, 0.3, 0.8, 1.0); //해당 위치에 0.2, 0.3, 0.8, 1.0 데이터를 전달
 | 
				
			||||||
 | 
					        this.vao.bind(gl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        gl.bindVertexArray(this.vao);
 | 
					 | 
				
			||||||
        this.indexBuffer.bind(gl);
 | 
					 | 
				
			||||||
        gl.drawElements(gl.TRIANGLES,this.indexBuffer.count,gl.UNSIGNED_SHORT,0);
 | 
					        gl.drawElements(gl.TRIANGLES,this.indexBuffer.count,gl.UNSIGNED_SHORT,0);
 | 
				
			||||||
 | 
					        this.vao.unbind(gl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import { RenderProgram } from "./program";
 | 
					import { RenderProgram } from "./program";
 | 
				
			||||||
import {createProgramFromSource, ProgramError, ShaderError} from "./gl_util";
 | 
					import {createProgramFromSource, ProgramError, ShaderError} from "./gl_util";
 | 
				
			||||||
import { createIndexBuffer, createVertexBuffer, GLProgram, IndexBuffer, VertexBuffer } from "./glWrapper";
 | 
					import { createIndexBuffer, createVertexArray, createVertexBuffer, GLProgram, IndexBuffer, VertexArray, VertexBuffer } from "./glWrapper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const vertex_shader_code = `#version 300 es
 | 
					const vertex_shader_code = `#version 300 es
 | 
				
			||||||
layout(location=0) in vec4 pos;
 | 
					layout(location=0) in vec4 pos;
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ void main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class TriangleRenderer implements RenderProgram{
 | 
					export class TriangleRenderer implements RenderProgram{
 | 
				
			||||||
    readonly program : GLProgram;
 | 
					    readonly program : GLProgram;
 | 
				
			||||||
    vao : WebGLVertexArrayObject;
 | 
					    vao : VertexArray;
 | 
				
			||||||
    indexBuffer : IndexBuffer;
 | 
					    indexBuffer : IndexBuffer;
 | 
				
			||||||
    constructor(gl: WebGL2RenderingContext){try{
 | 
					    constructor(gl: WebGL2RenderingContext){try{
 | 
				
			||||||
        this.program = new GLProgram(createProgramFromSource(gl,vertex_shader_code,frag_shader_code));
 | 
					        this.program = new GLProgram(createProgramFromSource(gl,vertex_shader_code,frag_shader_code));
 | 
				
			||||||
| 
						 | 
					@ -43,17 +43,22 @@ export class TriangleRenderer implements RenderProgram{
 | 
				
			||||||
            0.0,0.75]);
 | 
					            0.0,0.75]);
 | 
				
			||||||
        this.indexBuffer = createIndexBuffer(gl,[0,1,2]);
 | 
					        this.indexBuffer = createIndexBuffer(gl,[0,1,2]);
 | 
				
			||||||
        const posLoc = this.program.getAttribLocation(gl,"pos");
 | 
					        const posLoc = this.program.getAttribLocation(gl,"pos");
 | 
				
			||||||
        this.vao = gl.createVertexArray();
 | 
					        this.vao = createVertexArray(gl);
 | 
				
			||||||
        gl.bindVertexArray(this.vao);
 | 
					        this.vao.bind(gl);
 | 
				
			||||||
        gl.enableVertexAttribArray(posLoc);
 | 
					        this.vao.addBuffer(gl,vertex,posLoc,{
 | 
				
			||||||
        vertex.bind(gl);
 | 
					            count: 2,
 | 
				
			||||||
        gl.vertexAttribPointer(posLoc,2,gl.FLOAT,false,0,0);
 | 
					            type: gl.FLOAT,
 | 
				
			||||||
 | 
					            normalized: false,
 | 
				
			||||||
 | 
					            stride: 0,
 | 
				
			||||||
 | 
					            offset: 0
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
        this.indexBuffer.bind(gl);
 | 
					        this.indexBuffer.bind(gl);
 | 
				
			||||||
 | 
					        this.vao.unbind(gl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    draw(gl: WebGL2RenderingContext): void {
 | 
					    draw(gl: WebGL2RenderingContext): void {
 | 
				
			||||||
        this.program.use(gl);
 | 
					        this.program.use(gl);
 | 
				
			||||||
        gl.bindVertexArray(this.vao);
 | 
					        this.vao.bind(gl);
 | 
				
			||||||
        this.indexBuffer.bind(gl);
 | 
					
 | 
				
			||||||
        gl.drawElements(gl.TRIANGLES,this.indexBuffer.count,gl.UNSIGNED_SHORT,0);
 | 
					        gl.drawElements(gl.TRIANGLES,this.indexBuffer.count,gl.UNSIGNED_SHORT,0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue