Browse Source

wip, gl compute teaks

Alexander Rose 6 years ago
parent
commit
5d98349199

+ 1 - 1
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)
 

+ 1 - 2
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
 }

+ 5 - 5
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,

+ 1 - 2
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.)));

+ 1 - 1
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()

+ 23 - 23
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()