私はWebGLとElectronで小さな2Dゲームを構築しようとしています。何らかの理由で、レンダリングを1回だけ呼び出すと、私のテクスチャがトリプルレンダリングされています。私はなぜか、どういうわけかテクスチャを間違ってロードしているとその問題を引き起こしているのかどうかを判断できないようです。なぜWebGLは1回ではなく3回テクスチャを描画しますか?
私のコードの最終的な結果は以下の通りです:
export function render(tex: texture_t, _x: number, _y: number): void {
if (!is_valid(tex)) {
throw new Error('Invalid value - bad texture');
}
if (shader_program == null) {
shader_program = program_create_from_sources(default_v_shader, default_f_shader);
}
const gl = tex.context.context;
if (index_buffer == null) {
index_buffer = gl.createBuffer();
if (index_buffer == null) {
throw new Error('Failed to create default index buffer');
}
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(index_data), gl.STATIC_DRAW);
} else {
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);
}
gl.useProgram(shader_program.native);
if (vertex_buffer == null) {
vertex_buffer = gl.createBuffer();
if (vertex_buffer == null) {
throw new Error('Failed to create default vertex buffer');
}
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertex_data), gl.STATIC_DRAW);
} else {
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
}
gl.enableVertexAttribArray(shader_program.attributes.vertex_model);
gl.vertexAttribPointer(shader_program.attributes.vertex_model, 3, gl.FLOAT, false, 0, 0);
if (uv_buffer == null) {
uv_buffer = gl.createBuffer();
if (uv_buffer == null) {
throw new Error('Failed to create default UV buffer');
}
gl.bindBuffer(gl.ARRAY_BUFFER, uv_buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(uv_data), gl.STATIC_DRAW);
} else {
gl.bindBuffer(gl.ARRAY_BUFFER, uv_buffer);
}
gl.enableVertexAttribArray(shader_program.attributes.uv_model);
gl.vertexAttribPointer(shader_program.attributes.uv_model, 2, gl.FLOAT, false, 0, 0);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, tex.native);
gl.uniform1i(shader_program.uniforms.texture, 0);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
gl.disableVertexAttribArray(shader_program.attributes.uv_model);
gl.disableVertexAttribArray(shader_program.attributes.vertex_model);
}
ロードコード:(x
とy
パラメータがまだ使用されていない)、次のように
私のレンダリングコードは次のとおりです。
export function create_empty(): texture_t {
const ctx = context_get_current();
if (ctx == null) {
throw new Error('Invalid operation - no rendering context');
}
const gl = ctx.context;
const nat: WebGLTexture|null = gl.createTexture();
if (nat == null) {
throw new Error('Invalid operation - unable to create texture');
}
return {
native: nat,
width: 0,
height: 0,
source: null,
context: ctx
};
}
export async function create_from_image(src: string): Promise<texture_t> {
const p = new Promise<texture_t>((resolve, reject) => {
const tex = create_empty();
const gl = tex.context.context;
const img = new Image();
img.addEventListener('load',() => {
gl.bindTexture(gl.TEXTURE_2D, tex.native);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
tex.source = img.src;
tex.width = img.width;
tex.height = img.height;
resolve(tex);
});
img.addEventListener('error', (err) => {
destroy(tex);
reject(err);
});
img.src = src;
});
return p;
}
主な機能: