2016-11-25 2 views
1

Я разработал цикл для динамического создания размеров текстур для каждого другого представления, которое у меня есть в визуализации на основе браузера с использованием шейдеров. Я знаю минимальное количество пикселей, которое мне нужно, чтобы передать мои значения в шейдеры; однако мне нужно масштабировать их до 2-х размеров, а затем убедитесь, что их размеры x и y также равны степеням двух с соотношением 1: 1, 2: 1 или 1: 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; 

} 

ответ

1

Ваш буфер должен содержать 2^n элементов, так как ширина и высота буфера равны двум. Наименьшее значение 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), 
    }; 
} 
+0

Очень элегантный - спасибо! – gromiczek