TextureState: Difference between revisions

From WebGL Public Wiki
Jump to navigation Jump to search
No edit summary
use syntaxhighlight
Line 3: Line 3:
Imagine textures are defined like this
Imagine textures are defined like this


<code>
<syntaxhighlight lang="javascript">
     Texture2D = function() {
     Texture2D = function() {
       this.levels = [];
       this.levels = [];
Line 9: Line 9:
     };
     };


</code>
</syntaxhighlight>


And the WebGLRenderingContext is defined like this
And the WebGLRenderingContext is defined like this


<code>
<syntaxhighlight lang="javascript">
     WebGLRenderingContext = function() {
     WebGLRenderingContext = function() {
       // activeTexture is just an index into textureUnits
       // activeTexture is just an index into textureUnits
Line 26: Line 26:
       ];
       ];
     };
     };
</code>
</syntaxhighlight>


Then [[Reference:activeTexture|activeTexture]] would be implemented like this
Then [[Reference:activeTexture|activeTexture]] would be implemented like this


<code>
<syntaxhighlight lang="javascript">
     WebGLRenderingContext.prototype.activeTexture = function(texture) {
     WebGLRenderingContext.prototype.activeTexture = function(texture) {
       this.activeTexture = texture - this.TEXTURE0;
       this.activeTexture = texture - this.TEXTURE0;
     };
     };
</code>
</syntaxhighlight>


[[Reference:bindTexture|bindTexture]] would be implemented like this
[[Reference:bindTexture|bindTexture]] would be implemented like this
<code>
<syntaxhighlight lang="javascript">
     WebGLRenderingContext.prototype.bindTexture = function(target, texture) {
     WebGLRenderingContext.prototype.bindTexture = function(target, texture) {
       this.textureUnits[this.activeTexture][target] = texture;
       this.textureUnits[this.activeTexture][target] = texture;
     };
     };
</code>
</syntaxhighlight>


And texture functions like [[Reference::texParameteri|texParameter]] or [[Reference::texImage2D|texImage2D]] would be implemented like this
And texture functions like [[Reference::texParameteri|texParameter]] or [[Reference::texImage2D|texImage2D]] would be implemented like this


<code>
<syntaxhighlight lang="javascript">
     WebGLRenderingContext.prototype.texParameteri = function(target, pname, value) {
     WebGLRenderingContext.prototype.texParameteri = function(target, pname, value) {
       var texture = this.textureUnits[this.activeTexture][target];
       var texture = this.textureUnits[this.activeTexture][target];
       texture.state[pname] = value;
       texture.state[pname] = value;
     };
     };
</code>
</syntaxhighlight>

Revision as of 06:48, 7 August 2012

I hope this pseudo code sample will help make it clearer how activeTexture, bindTexture, and the various texture functions in WebGL effect the state of textures.

Imagine textures are defined like this

    Texture2D = function() {
      this.levels = [];
      this.state = {};
    };

And the WebGLRenderingContext is defined like this

    WebGLRenderingContext = function() {
      // activeTexture is just an index into textureUnits
      this.activeTexture = 0;
  
      // these are the textureUnits for this context.
      this.textureUnits = [
        { TEXTURE_2D: default2DTexture, TEXTURE_CUBE_MAP: defaultCubeMapTexture, },
        { TEXTURE_2D: default2DTexture, TEXTURE_CUBE_MAP: defaultCubeMapTexture, },
        { TEXTURE_2D: default2DTexture, TEXTURE_CUBE_MAP: defaultCubeMapTexture, },
        ...
      ];
    };

Then activeTexture would be implemented like this

    WebGLRenderingContext.prototype.activeTexture = function(texture) {
      this.activeTexture = texture - this.TEXTURE0;
    };

bindTexture would be implemented like this

    WebGLRenderingContext.prototype.bindTexture = function(target, texture) {
      this.textureUnits[this.activeTexture][target] = texture;
    };

And texture functions like texParameter or texImage2D would be implemented like this

    WebGLRenderingContext.prototype.texParameteri = function(target, pname, value) {
      var texture = this.textureUnits[this.activeTexture][target];
      texture.state[pname] = value;
    };