Hi Guys,
Is someone able to help me figure out why in starling graphics extension alpha does not work properly. It works only for pure black colors. For any other colors when applying alpha it converts it to some other brighter color.
Here is the code base:
https://bitbucket.org/hardcoremore/starlinggraphicsextension/src/master/
Here is the code that draws triangles:
public function set color(value:uint):void
{
_color = value;
colorVector[0] = (_color >> 16) / 255;
colorVector[1] = ((_color & 0x00FF00) >> 8) / 255;
colorVector[2] = (_color & 0x0000FF) / 255;
}
private static var textureLen:int;
private static var i:int;
public function drawTriangles(context:Context3D,
matrix:Matrix3D,
vertexBuffer:VertexBuffer3D,
indexBuffer:IndexBuffer3D,
alpha:Number = 1,
numTriangles:int = -1):void
{
context.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
context.setVertexBufferAt(1, vertexBuffer, 3, Context3DVertexBufferFormat.FLOAT_4);
context.setVertexBufferAt(2, vertexBuffer, 7, Context3DVertexBufferFormat.FLOAT_2);
if(program == null && _vertexShader && _fragmentShader)
{
program = Program3DCache.getProgram3D(context, _vertexShader, _fragmentShader);
}
context.setProgram(program);
textureLen = _textures.length;
for(i = 0; i < 8; i++)
{
context.setTextureAt( i, i < textureLen ? _textures[i].base : null );
}
context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, matrix, true);
_vertexShader.setConstants(context, 4);
// Multiply display obect's alpha by material alpha.
// this has correct value. even when this is lower than 1 alpha is not displayed properly
colorVector[3] = _alpha*alpha;
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, colorVector);
_fragmentShader.setConstants(context, 1);
context.drawTriangles(indexBuffer, 0, numTriangles);
}
And here is all the AGAL used:
package starling.display.shaders.fragment
{
import flash.display3D.Context3DProgramType;
import starling.display.shaders.AbstractShader;
/*
* A pixel shader that multiplies a single texture with constants (the color transform).
*/
public class TextureFragmentShader extends AbstractShader
{
public function TextureFragmentShader()
{
var agal:String =
"tex ft1, v1, fs0 <2d, repeat, linear> \n" +
"mul oc, ft1, fc0";
compileAGAL( Context3DProgramType.FRAGMENT, agal );
}
}
}
package starling.display.shaders.fragment
{
import flash.display3D.Context3DProgramType;
import starling.display.shaders.AbstractShader;
/*
* A pixel shader that multiplies a single texture with constants (the color transform).
*/
public class TextureFragmentShader extends AbstractShader
{
public function TextureFragmentShader()
{
var agal:String =
"tex ft1, v1, fs0 <2d, repeat, linear> \n" +
"mul oc, ft1, fc0";
compileAGAL( Context3DProgramType.FRAGMENT, agal );
}
}
}
package starling.display.shaders.fragment
{
import flash.display3D.Context3DProgramType;
import starling.display.shaders.AbstractShader;
/*
* A pixel shader that multiplies a single texture with constants (the color transform).
*/
public class TextureFragmentShader extends AbstractShader
{
public function TextureFragmentShader()
{
var agal:String =
"tex ft1, v1, fs0 <2d, repeat, linear> \n" +
"mul oc, ft1, fc0";
compileAGAL( Context3DProgramType.FRAGMENT, agal );
}
}
}
package starling.display.shaders.vertex
{
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.utils.getTimer;
import starling.display.shaders.AbstractShader;
public class AnimateUVVertexShader extends AbstractShader
{
public var uSpeed :Number = 1;
public var vSpeed :Number = 1;
public function AnimateUVVertexShader( uSpeed:Number = 1, vSpeed:Number = 1 )
{
this.uSpeed = uSpeed;
this.vSpeed = vSpeed;
var agal:String =
"m44 op, va0, vc0 \n" + // Apply matrix
"mov v0, va1 \n" + // Copy color to v0
"sub vt0, va2, vc4 \n" +
"mov v1, vt0 \n"
compileAGAL( Context3DProgramType.VERTEX, agal );
}
override public function setConstants( context:Context3D, firstRegister:int ):void
{
var phase:Number = getTimer()/1000;
var uOffset:Number = phase * uSpeed;
var vOffset:Number = phase * vSpeed;
context.setProgramConstantsFromVector( Context3DProgramType.VERTEX, firstRegister, Vector.<Number>([ uOffset, vOffset, 0, 0 ]) );
}
}
}
package starling.display.shaders.vertex
{
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.utils.getTimer;
import starling.display.shaders.AbstractShader;
public class AnimateUVVertexShader extends AbstractShader
{
public var uSpeed :Number = 1;
public var vSpeed :Number = 1;
public function AnimateUVVertexShader( uSpeed:Number = 1, vSpeed:Number = 1 )
{
this.uSpeed = uSpeed;
this.vSpeed = vSpeed;
var agal:String =
"m44 op, va0, vc0 \n" + // Apply matrix
"mov v0, va1 \n" + // Copy color to v0
"sub vt0, va2, vc4 \n" +
"mov v1, vt0 \n"
compileAGAL( Context3DProgramType.VERTEX, agal );
}
override public function setConstants( context:Context3D, firstRegister:int ):void
{
var phase:Number = getTimer()/1000;
var uOffset:Number = phase * uSpeed;
var vOffset:Number = phase * vSpeed;
context.setProgramConstantsFromVector( Context3DProgramType.VERTEX, firstRegister, Vector.<Number>([ uOffset, vOffset, 0, 0 ]) );
}
}
}
package starling.display.shaders.vertex
{
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.utils.getTimer;
import starling.display.shaders.AbstractShader;
public class AnimateUVVertexShader extends AbstractShader
{
public var uSpeed :Number = 1;
public var vSpeed :Number = 1;
public function AnimateUVVertexShader( uSpeed:Number = 1, vSpeed:Number = 1 )
{
this.uSpeed = uSpeed;
this.vSpeed = vSpeed;
var agal:String =
"m44 op, va0, vc0 \n" + // Apply matrix
"mov v0, va1 \n" + // Copy color to v0
"sub vt0, va2, vc4 \n" +
"mov v1, vt0 \n"
compileAGAL( Context3DProgramType.VERTEX, agal );
}
override public function setConstants( context:Context3D, firstRegister:int ):void
{
var phase:Number = getTimer()/1000;
var uOffset:Number = phase * uSpeed;
var vOffset:Number = phase * vSpeed;
context.setProgramConstantsFromVector( Context3DProgramType.VERTEX, firstRegister, Vector.<Number>([ uOffset, vOffset, 0, 0 ]) );
}
}
}
Is there something in this AGAL code that is suspicious that could make alpha not working properly.