Javascript 我需要在webgl中创建平滑的alpha转换

Javascript 我需要在webgl中创建平滑的alpha转换,javascript,html,webgl,render,Javascript,Html,Webgl,Render,需要从三个颜色顶点创建平滑的alpha过渡,而不中断。我做错了什么 var vertexShaderText= [ “精密中泵浮动;”, '', '属性向量2 vertPosition;', '属性vec4 vertColor;', “可变vec4 fragColor;”, '', “void main()”, '{', “fragColor=vertColor;”, “gl_位置=向量4(顶点位置,0.0,1.0);”, '}' ].join('\n'); var fragmentShad

需要从三个颜色顶点创建平滑的alpha过渡,而不中断。我做错了什么

var vertexShaderText=
[
“精密中泵浮动;”,
'',
'属性向量2 vertPosition;',
'属性vec4 vertColor;',
“可变vec4 fragColor;”,
'',
“void main()”,
'{',
“fragColor=vertColor;”,
“gl_位置=向量4(顶点位置,0.0,1.0);”,
'}'
].join('\n');
var fragmentShaderText=
[
“精密中泵浮动;”,
'',
“可变vec4 fragColor;”,
“void main()”,
'{',
“gl_FragColor=FragColor;”,
'}'
].join('\n');
var InitDemo=函数(){
log(“这正在工作”);
var canvas=document.getElementById('opengl_输出');
var gl=canvas.getContext('webgl');
如果(!gl){
log('WebGL不受支持,返回实验性WebGL');
gl=canvas.getContext('experimental-webgl');
}
如果(!gl){
警报(“您的浏览器不支持WebGL”);
}
gl.clearColor(0.0,0.0,0.0,1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
//
//创建着色器
// 
var vertexShader=gl.createShader(gl.VERTEX\u着色器);
var fragmentShader=gl.createShader(gl.FRAGMENT\u着色器);
gl.shaderSource(vertexShader,vertexShaderText);
gl.shaderSource(fragmentShader,fragmentShaderText);
gl.compileShader(顶点着色器);
if(!gl.getShaderParameter(vertexShader,gl.COMPILE_状态)){
console.error('error compileding vertex shader!',gl.getshaderingfolog(vertexShader));
返回;
}
gl.compileShader(碎片着色器);
if(!gl.getShaderParameter(fragmentShader,gl.COMPILE_状态)){
console.error('error compileding fragment shader!',gl.getshaderingfolog(fragmentShader));
返回;
}
var program=gl.createProgram();
gl.attachShader(程序,顶点着色器);
gl.attachShader(程序、碎片着色器);
总账链接程序(程序);
if(!gl.getProgramParameter(程序、总账链接状态)){
console.error('error linking program!',gl.getProgramInfoLog(program));
返回;
}
总账验证程序(程序);
if(!gl.getProgramParameter(程序,gl.VALIDATE_状态)){
console.error('error validating program!',gl.getProgramInfoLog(program));
返回;
}
//
//创建缓冲区
//
var triangleVertices=
[/X,Y,R,G,B,A
0.0, 0.5,    1.0, 0.0, 0.0, 1.0,
-0.5, -0.5,  0.0, 1.0, 0.0, 0.0001,
0.5, -0.5,   0.0, 0.0, 1.0, 1.0
];
var triangleVertexBufferObject=gl.createBuffer();
gl.bindBuffer(gl.ARRAY\u BUFFER,triangleVertexBufferObject);
gl.bufferData(gl.ARRAY\u BUFFER、新Float32Array(triangleVertices)、gl.STATIC\u DRAW);
var positionAttribLocation=gl.getAttribLocation(程序“vertPosition”);
var colorAttributeLocation=gl.getAttributeLocation(程序“vertColor”);
gl.VertexAttribute指针(
PositionAttriblLocation,//属性位置
2,//每个属性的元素数
gl.FLOAT,//元素类型
德国劳埃德船级社假,
每个元素6*Float32Array.BYTES\u,//单个顶点的大小
0//从单个顶点开始到该属性的偏移
);
gl.VertexAttribute指针(
ColorAttributeLocation,//属性位置
4,//每个属性的元素数
gl.FLOAT,//元素类型
德国劳埃德船级社假,
每个元素6*Float32Array.BYTES\u,//单个顶点的大小
2*Float32Array.BYTES\u PER\u元素//从单个顶点开始到该属性的偏移量
);
总账启用(总账混合);
总帐blendFunc(总帐一,总帐零);
gl.EnableVertexAttributeArray(位置属性定位);
gl.EnableVertexAttributeArray(ColorAttributeLocation);
//
//主渲染循环
//
gl.useProgram(程序);
总图数组(总图三角形,0,3);
};
InitDemo()

默认的alpha合成是

或者您必须禁用预乘法放大器

var gl=canvas.getContext('webgl',{premultipledalpha:false});
必须将RGB颜色通道乘以片段着色器中的ALPHA通道:

gl_FragColor=vec4(FragColor.rgb*FragColor.a,FragColor.a);

var vertexShaderText=
[
“精密中泵浮动;”,
'',
'属性向量2 vertPosition;',
'属性vec4 vertColor;',
“可变vec4 fragColor;”,
'',
“void main()”,
'{',
“fragColor=vertColor;”,
“gl_位置=向量4(顶点位置,0.0,1.0);”,
'}'
].join('\n');
var fragmentShaderText=
[
“精密中泵浮动;”,
'',
“可变vec4 fragColor;”,
“void main()”,
'{',
“gl_FragColor=vec4(FragColor.rgb*FragColor.a,FragColor.a);”,
'}'
].join('\n');
var InitDemo=函数(){
log(“这正在工作”);
var canvas=document.getElementById('opengl_输出');
var gl=canvas.getContext('webgl'/*,{premultipledalpha:false}*/);
如果(!gl){
log('WebGL不受支持,返回实验性WebGL');
gl=canvas.getContext('experimental-webgl'/*,{premultipledalpha:false}*/);
}
如果(!gl){
警报(“您的浏览器不支持WebGL”);
}
gl.clearColor(0.0,0.0,0.0,1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
//
//创建着色器
// 
var vertexShader=gl.createShader(gl.VERTEX\u着色器);
var fragmentShader=gl.createShader(gl.FRAGMENT\u着色器);
gl.shaderSource(vertexShader,vertexShaderText);
gl.shaderSource(fragmentShader,fragmentShaderText);
gl.compileShader(顶点着色器);
if(!gl.getShaderParameter(vertexShader,gl.COMPILE_状态)){
console.error('error compileding vertex shader!',gl.getshaderingfolog(vertexShader));
返回;
}
gl.compileShader(碎片着色器);
if(!gl.getShaderParameter(fragmentShader,gl.COMPILE_状态)){
console.error('error compileding fragment shader!',gl.getshaderingfolog(fragmentShader));
返回;
}
var program=gl.createProgram();
gl.attachShader(程序,顶点着色器);
gl.attachShader(程序、碎片着色器);
总账链接程序(程序);
if(!gl.getProgramParameter(程序、总账链接状态)){
console.error('error linking program!',gl.getProgramInfoLog(program));
返回;
}
总账验证程序(程序);
如果(!gl.getProgramParameter(pro