설계가 잘못된 거지만
생성자에서 데이터 가져와야 할 때 쓰게 되네
생성자 쓰기 앞서서 가져오는 게 뭐 더 맞겠지만;
import { gl } from "./core.ts";
import { glVertexBuffer } from "./vertexBuffer.ts";
class SimpleShader {
private compileShader!: WebGLProgram;
private vertexPositionRef!: GLint;
private vertexShader!: WebGLShader;
private fragmentShader!: WebGLShader;
constructor(vertexShaderPath: string, fragmentShaderPath: string) {
this.vertexShader = loadAndCompileShader(
vertexShaderPath,
gl.VERTEX_SHADER,
);
this.fragmentShader = loadAndCompileShader(
fragmentShaderPath,
gl.FRAGMENT_SHADER,
);
this.compileShader = gl.createProgram() as WebGLProgram;
gl.attachShader(this.compileShader, this.vertexShader);
gl.attachShader(this.compileShader, this.fragmentShader);
gl.linkProgram(this.compileShader);
this.vertexPositionRef = gl.getAttribLocation(
this.compileShader,
"vertex_position",
);
}
activate() {
gl.useProgram(this.compileShader);
gl.bindBuffer(gl.ARRAY_BUFFER, glVertexBuffer);
gl.vertexAttribPointer(this.vertexPositionRef, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.vertexPositionRef);
}
}
function loadAndCompileShader(
filePath: string,
shaderType: GLenum,
): WebGLShader {
const request = new XMLHttpRequest();
request.open("GET", filePath, false);
try {
request.send();
} catch (error) {
throw new Error(`Failed to load shader: ${filePath}`);
}
const shaderSource = request.responseText;
const compiledShader = gl.createShader(shaderType) as WebGLShader;
gl.shaderSource(compiledShader, shaderSource);
gl.compileShader(compiledShader);
return compiledShader;
}
export default SimpleShader;
import { glVertexBuffer } from "./vertexBuffer.ts";
class SimpleShader {
private compileShader!: WebGLProgram;
private vertexPositionRef!: GLint;
private vertexShader!: WebGLShader;
private fragmentShader!: WebGLShader;
constructor(vertexShaderPath: string, fragmentShaderPath: string) {
this.vertexShader = loadAndCompileShader(
vertexShaderPath,
gl.VERTEX_SHADER,
);
this.fragmentShader = loadAndCompileShader(
fragmentShaderPath,
gl.FRAGMENT_SHADER,
);
this.compileShader = gl.createProgram() as WebGLProgram;
gl.attachShader(this.compileShader, this.vertexShader);
gl.attachShader(this.compileShader, this.fragmentShader);
gl.linkProgram(this.compileShader);
this.vertexPositionRef = gl.getAttribLocation(
this.compileShader,
"vertex_position",
);
}
activate() {
gl.useProgram(this.compileShader);
gl.bindBuffer(gl.ARRAY_BUFFER, glVertexBuffer);
gl.vertexAttribPointer(this.vertexPositionRef, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.vertexPositionRef);
}
}
function loadAndCompileShader(
filePath: string,
shaderType: GLenum,
): WebGLShader {
const request = new XMLHttpRequest();
request.open("GET", filePath, false);
try {
request.send();
} catch (error) {
throw new Error(`Failed to load shader: ${filePath}`);
}
const shaderSource = request.responseText;
const compiledShader = gl.createShader(shaderType) as WebGLShader;
gl.shaderSource(compiledShader, shaderSource);
gl.compileShader(compiledShader);
return compiledShader;
}
export default SimpleShader;
댓글 0