我已经充实了一个循环,为使用着色器的基于浏览器的可视化中的每个不同视图动态生成纹理大小。我知道为了将我的值传递给着色器所需的最小像素数;但是我需要将它们扩展到2个大小的幂,然后确保它们的x和y尺寸也是1:1,2:1或1:2比率的2的幂。现在我的循环是无限的,我想我将需要继续增加2像素数的总功率,直到我达到满足我的一个比率的大小。
我的问题是:是否有更有效或直接的方式来实现我在这里尝试做的事情?
var motifMinBufferSize = 80000;
var bufferSize; // the total number of texels that will be in the computation buffers (must be a power of two)
var dimensions;
function initValues() {
bufferSize = setBufferSize();
dimensions = setPositionsTextureSize();
}
function setBufferSize() {
var buffer = motifMinBufferSize;
// fill out the buffers to a power of two - necessary for the computation textures in the shaders
var powCount = 1;
var powOf2 = 2;
while ( buffer > powOf2 ) {
powOf2 *= 2;
powCount++;
}
while ( buffer < powOf2 ) {
buffer += 1;
}
}
function setPositionsTextureSize() {
var dimensions = {
texWidth : null,
texHeight : null
};
var foundDimensions = false;
var powOf2 = 2;
while (foundDimensions === false) {
var candidateWidth = bufferSize/powOf2;
if ( candidateWidth === powOf2 || candidateWidth/2 === powOf2 || candidateWidth*2 === powOf2 ) {
dimensions.texWidth = candidateWidth;
dimensions.textHeight = powOf2;
foundDimensions = true;
} else {
powOf2 *= 2;
}
}
return dimensions;
}
答案 0 :(得分:1)
您的缓冲区必须包含2 ^ n个元素,因为缓冲区的宽度和高度都是2的幂。满足持有要求的最小n
使用对数计算至少motifMinBufferSize
个元素:n = Math.ceil(Math.log2(motifMinBufferSize))
。
假设缓冲区的高度为2 ^ h,缓冲区的宽度为2 ^ w。我们知道w和h最多可以相差一个(由于缓冲区尺寸比例的限制)。我们也知道2 ^ n = 2 ^ w * 2 ^ h,这意味着n = w + h。由于w和h相差最多1,因此它们基本上都是n的一半。因此我们可以得到:
function getBufferDimensions(minBufferSize) {
var n = Math.ceil(Math.log2(minBufferSize));
var w = Math.ceil(n / 2);
var h = n - w;
return {
width: Math.pow(2, w),
height: Math.pow(2, h),
};
}