2016-04-01 2 views
0

Мой код работает, но мне интересно, почему!свяжите текстуру, прежде чем нарисовать ее (webgl)

У меня есть 2 текстура:

uniform sampler2D uSampler0; 
    uniform sampler2D uSampler1; 


    void main() { 
     vec4 color0 = texture2D(uSampler0, vTexCoord); 
     vec4 color1 = texture2D(uSampler1, vTexCoord); 
     gl_FragColor = color0 * color1; 
    } 

и моего JS код

gl.activeTexture(gl.TEXTURE0); 
    gl.bindTexture(gl.TEXTURE_2D,my_texture_ZERO); 
    gl.uniform1i(program.uSampler0,0); 

    gl.activeTexture(gl.TEXTURE1); 
    gl.bindTexture(gl.TEXTURE_2D,my_texture_ONE); 
    gl.uniform1i(program.uSampler1); 

    // uncomment one of the 3, it works. 
    // gl.bindTexture(gl.TEXTURE_2D, my_texture_ZERO); 
    // gl.bindTexture(gl.TEXTURE_2D, my_texture_ONE); 
    // gl.bindTexture(gl.TEXTURE_2D, texture_FOR_PURPOSE_ONLY); 

    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); 

перед gl.draw, я протестировал 3 привязок, каждой из работы!

Итак, я не понимаю, что такое настоящий трубопровод.

Спасибо за некоторые пояснения

ответ

0

Это работает правильно, потому что в представленном коде вы отправляете соответствующие формы для пробоотборников.

Первая текстура была установлена ​​на единицу 0, вызвав glActiveTexture (GL_TEXTURE0) и после этого была связана. Затем был сделан переключатель в unit1.

В этот момент в каждом блоке были две отдельные связанные текстуры.

В конце эти единицы были переданы в качестве униформы для пробоотборников - вот как указать, какая текстура должна быть в пробоотборнике: в этом случае передача 0, соответствующая блоку GL_TEXTURE0, первой форме и аналогичности для второго равномерного ,

Возможно, даже без раскола этих линий - все должно работать.

+0

ОК, но он не работает, если я создаю: 'gl.bindTexture (gl.TEXTURE_2D, null)', так что за привязка перед тем, как нарисовать? –

+0

Связывание означает установку текстуры в активном блоке. Вы ранее активировали единицу 0, вызывая glActiveTexture (GL_TEXTURE0); , Как вы могли догадаться, GL_TEXTURE0 указывает на 0 единиц. После этого вы связали текстуру, вызвав glBindTexture. Если вы вызываете glBindTexture с нулевым (или 0, чтобы быть явным), вы удаляете текстуру из единицы. Также имейте в виду, что вы можете переключать активные блоки, но, переключая активные блоки, вы не отказываетесь от изменений в ранее активном блоке, поэтому там привязана текстура - остается там. – spectre

+0

Okk ... и если перед выполнением привязки нет явного активного блока, тогда по умолчанию связывается с единицей 0. –

0

Эта строка недействительна

gl.uniform1i(program.uSampler1); 

Вы не передавая значение для пробоотборника

Путь WebGL текстурных блоков работы они глобальное состояние внутри WebGL

gl.activeTexture устанавливает текстуру активировать все другие эффекты текстурных команд. Для каждой текстурной единицы есть 2 точки привязки, TEXTURE_2D и TEXTURE_CUBE_MAP.

Вы можете думать об этом как этот

gl = { 
    activeTextureUnit: 0, 
    textureUnits: [ 
    { TEXTURE_2D: null: TEXTURE_CUBE_MAP: null, }, 
    { TEXTURE_2D: null: TEXTURE_CUBE_MAP: null, }, 
    { TEXTURE_2D: null: TEXTURE_CUBE_MAP: null, }, 
    ... 
    ], 
}; 

gl.activeTexture просто делает это

gl.activeTexture = function(unit) { 
gl.activeTextureUnit = unit - gl.TEXTURE0; 
}; 

gl.bindTexture делает это

gl.bindTexture = function(bindPoint, texture) { 
    gl.textureUnits[gl.activeTextureUnit][bindPoint] = texture; 
}; 

gl.texImage2D и gl.texParamteri посмотреть, какую текстуру, чтобы работать с подобным это

gl.texImage2D = function(bindPoint, .....) { 
    var texture = gl.textureUnits[gl.activeTextureUnit][bindPoint]; 
    // now do something with texture 

Другими словами, внутри WebGL существует глобальный массив текстурных блоков. gl.activeTexture и gl.bindTexture манипулируют этим массивом.

gl.texXXX манипулировать самими текстурами, но они косвенно ссылаются на текстуры через этот массив.

gl.uniform1i(someSamplerLocation, unitNumber) устанавливает форму шейдера, чтобы посмотреть на определенный индекс в этом массиве текстурных единиц.

+0

отлично, я собираюсь использовать его как «справочную карту»! –

Смежные вопросы