From 5d98349199ebf8e02283d08639ea7325a1a54190 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Fri, 5 Apr 2019 12:09:42 -0700 Subject: [PATCH] wip, gl compute teaks --- .../compute/histogram-pyramid/reduction.ts | 2 +- .../compute/marching-cubes/active-voxels.ts | 3 +- .../compute/marching-cubes/isosurface.ts | 10 ++-- .../shader/marching-cubes/isosurface.frag | 3 +- .../structure/visual/gaussian-surface-mesh.ts | 2 +- src/tests/browser/marching-cubes.ts | 46 +++++++++---------- 6 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/mol-gl/compute/histogram-pyramid/reduction.ts b/src/mol-gl/compute/histogram-pyramid/reduction.ts index c33d6e60c..de0568f38 100644 --- a/src/mol-gl/compute/histogram-pyramid/reduction.ts +++ b/src/mol-gl/compute/histogram-pyramid/reduction.ts @@ -85,7 +85,7 @@ export function createHistogramPyramid(ctx: WebGLContext, inputTexture: Texture) // This part set the levels const levels = Math.ceil(Math.log(inputTextureMaxDim) / Math.log(2)) const maxSize = Math.pow(2, levels) - // console.log('levels', levels) + // console.log('levels', levels, 'maxSize', maxSize) const initialTexture = getLevelTexture(ctx, levels) diff --git a/src/mol-gl/compute/marching-cubes/active-voxels.ts b/src/mol-gl/compute/marching-cubes/active-voxels.ts index acdb80660..0ede2cd48 100644 --- a/src/mol-gl/compute/marching-cubes/active-voxels.ts +++ b/src/mol-gl/compute/marching-cubes/active-voxels.ts @@ -76,8 +76,7 @@ export function calcActiveVoxels(ctx: WebGLContext, cornerTex: Texture, gridDime gl.viewport(0, 0, width, height) renderable.render() - // const at = readTexture(ctx, activeVoxelsTex) - // console.log('at', at) + // console.log('at', readTexture(ctx, activeVoxelsTex)) return activeVoxelsTex } \ No newline at end of file diff --git a/src/mol-gl/compute/marching-cubes/isosurface.ts b/src/mol-gl/compute/marching-cubes/isosurface.ts index 9f562de43..7d6922997 100644 --- a/src/mol-gl/compute/marching-cubes/isosurface.ts +++ b/src/mol-gl/compute/marching-cubes/isosurface.ts @@ -78,19 +78,19 @@ function setRenderingDefaults(gl: GLRenderingContext) { gl.disable(gl.BLEND) gl.disable(gl.DEPTH_TEST) gl.depthMask(false) + gl.enable(gl.SCISSOR_TEST) } -export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDimensions: Vec3, transform: Mat4, isoValue: number) { +export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDimensions: Vec3, transform: Mat4, isoValue: number, vertexGroupTexture?: Texture, normalTexture?: Texture) { const { gl, framebufferCache } = ctx const { pyramidTex, height, levels, scale, count } = histogramPyramid const framebuffer = framebufferCache.get(FramebufferName).value - framebuffer.bind() - const vertexGroupTexture = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest') + if (!vertexGroupTexture) vertexGroupTexture = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest') vertexGroupTexture.define(pyramidTex.width, pyramidTex.height) - const normalTexture = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest') + if (!normalTexture) normalTexture = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest') normalTexture.define(pyramidTex.width, pyramidTex.height) // const infoTex = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest') @@ -119,7 +119,7 @@ export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Tex // indexTex.attachFramebuffer(framebuffer, 5) const { drawBuffers } = ctx.extensions - if (!drawBuffers) throw new Error('need draw buffers') + if (!drawBuffers) throw new Error('need WebGL draw buffers') drawBuffers.drawBuffers([ drawBuffers.COLOR_ATTACHMENT0, diff --git a/src/mol-gl/shader/marching-cubes/isosurface.frag b/src/mol-gl/shader/marching-cubes/isosurface.frag index 8ac23b0a6..36bd6d1be 100644 --- a/src/mol-gl/shader/marching-cubes/isosurface.frag +++ b/src/mol-gl/shader/marching-cubes/isosurface.frag @@ -110,10 +110,9 @@ void main(void) { // get index into triIndices table float mcIndex = 16. * edgeIndex + currentVertex; vec4 mcData = texture2D(tTriIndices, vec2(intMod(mcIndex, 64.), floor(mcIndex / 64.)) / 64.); - mcIndex = floor(mcData.a * 255.0 + 0.5); // bit mask to avoid conditionals (see comment below) for getting MC case corner - vec4 m0 = vec4(mcIndex); + vec4 m0 = vec4(floor(mcData.a * 255.0 + 0.5)); // get edge value masks vec4 m1 = vec4(equal(m0, vec4(0., 1., 2., 3.))); diff --git a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts index b817423dd..101dc091d 100644 --- a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts +++ b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts @@ -86,7 +86,7 @@ async function createGaussianSurfaceTextureMesh(ctx: VisualContext, unit: Unit, const compacted = createHistogramPyramid(ctx.webgl, activeVoxelsTex) // ctx.webgl.waitForGpuCommandsCompleteSync() - const gv = createIsosurfaceBuffers(ctx.webgl, activeVoxelsTex, densityTextureData.texture, compacted, densityTextureData.gridDimension, densityTextureData.transform, isoLevel) + const gv = createIsosurfaceBuffers(ctx.webgl, activeVoxelsTex, densityTextureData.texture, compacted, densityTextureData.gridDimension, densityTextureData.transform, isoLevel, textureMesh ? textureMesh.vertexGroupTexture.ref.value : undefined, textureMesh ? textureMesh.normalTexture.ref.value : undefined) // ctx.webgl.waitForGpuCommandsCompleteSync() // const boundingSphere = Sphere3D.zero() diff --git a/src/tests/browser/marching-cubes.ts b/src/tests/browser/marching-cubes.ts index 4ec65b6ca..a95b54dd5 100644 --- a/src/tests/browser/marching-cubes.ts +++ b/src/tests/browser/marching-cubes.ts @@ -61,29 +61,29 @@ async function init() { } const isoValue = Math.exp(-props.smoothness) - // if (true) { - // console.time('gpu gaussian2') - // const densityTextureData2 = await computeGaussianDensityTexture2d(position, box, radius, props, webgl).run() - // webgl.waitForGpuCommandsCompleteSync() - // console.timeEnd('gpu gaussian2') - - // console.time('gpu mc2') - // console.time('gpu mc active2') - // const activeVoxelsTex2 = calcActiveVoxels(webgl, densityTextureData2.texture, densityTextureData2.gridDimension, isoValue) - // webgl.waitForGpuCommandsCompleteSync() - // console.timeEnd('gpu mc active2') - - // console.time('gpu mc pyramid2') - // const compacted2 = createHistogramPyramid(webgl, activeVoxelsTex2) - // webgl.waitForGpuCommandsCompleteSync() - // console.timeEnd('gpu mc pyramid2') - - // console.time('gpu mc vert2') - // const gv2 = createIsosurfaceBuffers(webgl, activeVoxelsTex2, densityTextureData2.texture, compacted2, densityTextureData2.gridDimension, densityTextureData2.transform, isoValue) - // webgl.waitForGpuCommandsCompleteSync() - // console.timeEnd('gpu mc vert2') - // console.timeEnd('gpu mc2') - // } + if (true) { + console.time('gpu gaussian2') + const densityTextureData2 = await computeGaussianDensityTexture2d(position, box, radius, props, webgl).run() + webgl.waitForGpuCommandsCompleteSync() + console.timeEnd('gpu gaussian2') + + console.time('gpu mc2') + console.time('gpu mc active2') + const activeVoxelsTex2 = calcActiveVoxels(webgl, densityTextureData2.texture, densityTextureData2.gridDimension, isoValue) + webgl.waitForGpuCommandsCompleteSync() + console.timeEnd('gpu mc active2') + + console.time('gpu mc pyramid2') + const compacted2 = createHistogramPyramid(webgl, activeVoxelsTex2) + webgl.waitForGpuCommandsCompleteSync() + console.timeEnd('gpu mc pyramid2') + + console.time('gpu mc vert2') + createIsosurfaceBuffers(webgl, activeVoxelsTex2, densityTextureData2.texture, compacted2, densityTextureData2.gridDimension, densityTextureData2.transform, isoValue) + webgl.waitForGpuCommandsCompleteSync() + console.timeEnd('gpu mc vert2') + console.timeEnd('gpu mc2') + } console.time('gpu gaussian') const densityTextureData = await computeGaussianDensityTexture2d(position, box, radius, props, webgl).run() -- GitLab