pass float array views

This commit is contained in:
Magnus Ulimoen 2019-07-21 13:26:26 +02:00
parent 4b5b13452b
commit e16f136a59
2 changed files with 20 additions and 64 deletions

43
main.js
View File

@ -6,6 +6,10 @@ async function run() {
const canvas = document.getElementById("glCanvas"); const canvas = document.getElementById("glCanvas");
const gl = canvas.getContext("webgl"); const gl = canvas.getContext("webgl");
const float_in_image = gl.getExtension("OES_texture_float");
if (!float_in_image) {
console.warn("Floats are not supported in images for your device, please warn the author about this incompatability");
}
if (gl === null) { if (gl === null) {
alert("Unable to initialise WebGL"); alert("Unable to initialise WebGL");
@ -28,7 +32,8 @@ async function run() {
uniform sampler2D uSampler; uniform sampler2D uSampler;
void main() { void main() {
gl_FragColor = vec4(texture2D(uSampler, vVertexPosition).a, 0.0, 0.0, 1.0); mediump float c = texture2D(uSampler, vVertexPosition).a;
gl_FragColor = vec4((c + 1.0)/2.0, 0.0, 0.0, 1.0);
} }
`; `;
@ -82,16 +87,15 @@ async function run() {
const width = 40; const width = 40;
const height = 50; const height = 50;
let universe = Universe.new(width, height); const universe = Universe.new(width, height);
let t = performance.now(); const t = performance.now();
universe.set_initial(t/1000.0); universe.set_initial(t/1000.0);
let drawable = universe.get_drawable();
const field = new Uint8Array(wasm.memory.buffer, const field = new Float32Array(wasm.memory.buffer,
drawable.get_pointer(), universe.get_ptr(),
drawable.width()*drawable.height()); width*height);
const texture = gl.createTexture(); const texture = gl.createTexture();
{ {
@ -100,7 +104,7 @@ async function run() {
const internalFormat = gl.ALPHA; const internalFormat = gl.ALPHA;
const border = 0; const border = 0;
const srcFormat = gl.ALPHA; const srcFormat = gl.ALPHA;
const srcType = gl.UNSIGNED_BYTE; const srcType = gl.FLOAT;
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
} }
@ -113,7 +117,7 @@ async function run() {
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.useProgram(programInfo.program); gl.useProgram(programInfo.program);
@ -133,26 +137,17 @@ async function run() {
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
{ // Binding uniforms
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.uniform1i(programInfo.uniformLocation.sampler, 0);
}
universe.set_initial(t/1000.0); universe.set_initial(t/1000.0);
let drawable = universe.get_drawable(); const field = new Float32Array(wasm.memory.buffer,
universe.get_ptr(),
const field = new Uint8Array(wasm.memory.buffer, width*height);
drawable.get_pointer(),
drawable.width()*drawable.height());
{ {
gl.bindTexture(gl.TEXTURE_2D, texture);
const level = 0; const level = 0;
const internalFormat = gl.ALPHA; const internalFormat = gl.ALPHA;
const border = 0; const border = 0;
const srcFormat = gl.ALPHA; const srcFormat = internalFormat;
const srcType = gl.UNSIGNED_BYTE; const srcType = gl.FLOAT;
gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field); gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
} }
@ -160,8 +155,6 @@ async function run() {
const vertexCount = 4; const vertexCount = 4;
gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount); gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount);
drawable.free();
window.requestAnimationFrame(drawMe); window.requestAnimationFrame(drawMe);
} }

View File

@ -16,13 +16,6 @@ pub struct Universe {
field: Vec<f32>, field: Vec<f32>,
} }
#[wasm_bindgen]
pub struct Drawable {
width: u32,
height: u32,
field: Vec<u8>,
}
const WAVESPEED: f32 = 1.0; const WAVESPEED: f32 = 1.0;
fn func(x: f32, y: f32, t: f32) -> f32 { fn func(x: f32, y: f32, t: f32) -> f32 {
@ -52,37 +45,7 @@ impl Universe {
} }
} }
pub fn get_drawable(&self) -> Drawable { pub fn get_ptr(&mut self) -> *mut u8 {
// let fmin = self.field.iter().fold(0.0f32, |acc, x| acc.min(*x)); self.field.as_mut_ptr() as *mut u8
let fmin = -1.0;
// let fmax = self.field.iter().fold(0.0f32, |acc, x| acc.max(*x));
let fmax = 1.0;
let field = self
.field
.iter()
.map(|x| (u8::max_value() as f32 * (x - fmin) / (fmax - fmin)) as u8)
.collect::<Vec<_>>();
Drawable {
width: self.width,
height: self.height,
field,
}
}
}
#[wasm_bindgen]
impl Drawable {
pub fn get_pointer(&mut self) -> *mut u8 {
self.field.as_mut_ptr()
}
pub fn width(&self) -> u32 {
self.width
}
pub fn height(&self) -> u32 {
self.height
} }
} }