copyteximage2D в терминах конечного автомата

#webgl

#webgl

Вопрос:

я не знаю, как работает copyteximage2D, я хотел бы получить объяснение в терминах конечного автомата webgl :

благодаря gman у меня есть это :

 gl = { 
    activeTextureUnit: 0,
    textureUnits: [],
};

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

gl.bindTexture = function(bindPoint, texture) {
    var textureUnit = this.textureUnits[this.activeTextureUnit];
    switch (bindPoint) {
       case this.TEXTURE_2D:
         textureUnit.texture2D = texture;
         break;
       case ....
    }
};
gl.copyTexImage2D = function( target, level, iformat, x, y, w,h,b) {
.....
..... gman please your code here thanks very much!!!
.....
}
  

Ответ №1:

copyTexImage2D копирует из текущего фреймбуфера или холста в заданную цель текущего текстурного блока

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

gl.bindFramebuffer = function(bindPoint, framebuffer) {
  this.framebufferBindPoints[bindPoint] = 
     framebuffer ? framebuffer : gl.canvas.internalFramebuffer;
}; 

gl.copyTexImage2D = function( target, level, iformat, x, y, w,h,b) {
  var textureUnit = this.textureUnits[this.activeTextureUnit];
  var texture = textureUnit[target];
  var framebuffer = this.framebufferBindPoints[gl.FRAMEBUFFER];
  // copy from framebuffer into texture
}
  

Комментарии:

1. приятно!! Итак, если перед gl.copyTex .. я поставил fbPV2 = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, fbPV2); gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, pvTex2, 0); так, что pvTex2 будет скопирован в текстуру, привязанную к текущему textureUnit ?

2. Yes pxTex2 будет источником для любой текстуры, в которую вы решите скопировать texImage2D.

3. хорошо! теперь я сталкиваюсь с другой проблемой: pvTex2 — это текстура с плавающей точкой. Кажется, это может быть проблемой? или, может быть, проблема в том, что я не создал generatemimap (или не установил фильтр) после copyTexImage2D ?

4. хорошо, generatemimap тривиален. И я предполагаю, что из того, что я нахожу, copyteximage2D не работает с текстурами с плавающей точкой. Итак, я собираюсь использовать шейдер и нарисовать текстуру в фреймбуфере, чтобы получить копию!

5. Куда вы копируете из float в float? Я не помню ограничений с головы до ног. Да, копирование с помощью шейдера является распространенным решением. Chrome даже делает это за кулисами для определенных ситуаций.