Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不混合webgl中启用透明度的情况下渲染对象_Javascript_Html_Css_Webgl - Fatal编程技术网

Javascript 如何在不混合webgl中启用透明度的情况下渲染对象

Javascript 如何在不混合webgl中启用透明度的情况下渲染对象,javascript,html,css,webgl,Javascript,Html,Css,Webgl,我试图用两个单独的gl.drawArraycall渲染两个对象。我希望对象的透明部分不可见。我还想在另一个对象上渲染一个对象,这样第一个绘制的对象在与第二个对象重叠的地方不可见 我在渲染循环中使用此设置: gl.clearColor(0, 0, 0, 1); // https://stackoverflow.com/questions/18439897/webgl-fragment-shader-opacity gl.blendFunc(gl.SRC_ALPHA, gl.ONE); gl

我试图用两个单独的
gl.drawArray
call渲染两个对象。我希望对象的透明部分不可见。我还想在另一个对象上渲染一个对象,这样第一个绘制的对象在与第二个对象重叠的地方不可见

我在渲染循环中使用此设置:

 gl.clearColor(0, 0, 0, 1);
 // https://stackoverflow.com/questions/18439897/webgl-fragment-shader-opacity
 gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
 gl.enable(gl.BLEND);
 gl.disable(gl.DEPTH_TEST);
我不确定混合函数的作用,但我使用它们以启用透明度。但这会导致两个对象混合并产生黄色。(一个对象为红色,另一个为绿色)。如果我最后画红色,我想画红色,反之亦然,同时启用透明度

const fShaderSource2=`version 300 es
精密中泵浮子;
外显vec4外显色;
void main(){
outColor=vec4(0.0,1.0,0.0,1.0);
}
`;
常量fShaderSource=`#版本300 es
精密中泵浮子;
外显vec4外显色;
均匀的二维u_纹理;
void main(){
outColor=纹理(u_纹理,vec2(0.0));
}
`;
const vShaderSource=`#版本300 es
精密中泵浮子;
在vec2 a_位置;
void main(){
gl_位置=vec4(a_位置,0,1);
}
`;
main(document.getElementById('app'));
主要功能(要素){
const canvas=document.createElement('canvas'),
gl=canvas.getContext('webgl2');
元素。追加(画布);
const displayWidth=canvas.clientWidth,
displayHeight=canvas.clientHeight;
canvas.width=显示宽度;
canvas.height=显示高度;
let graphics=新图形({width:displayWidth,height:displayHeight},gl);
新循环(()=>{
graphics.render();
}).start();
}
功能图形(状态,gl){
常数{宽度,高度}=状态;
gl.clearColor(0,0,0,0);
gl.blendFunc(gl.SRC_ALPHA,gl.ONE);
总账启用(总账混合);
gl.禁用(gl.深度测试);
设minibatch=[];
const redText=makeGlQuad(gl,fShaderSource,canvasTexture());
const greenText=makeGlQuad(gl,fShaderSource2);
this.render=()=>{
minibatch.push(红色文本);
minibatch.push(绿色文本);
总图视口(0,0,总图画布宽度,总图画布高度);
总账清除(总账颜色缓冲位);
minibatch.forEach(({
节目,,
重新定位,
沃,
glTexture
}) => {
gl.useProgram(程序);
gl.uniform2f(重新聚合位置,gl.canvas.width,gl.canvas.height);
if(纹理){
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D,glTexture);
}
bindVertexArray总帐(vao);
gl.绘图阵列(gl.三角形,0,6);
});
minibatch=[];
};
}
函数makeGlQuad(gl、fShaderSource、纹理){
让vShader=createShader(gl,gl.VERTEX_着色器,vShaderSource);
设fShader=createShader(gl,gl.FRAGMENT_着色器,fShaderSource);
让程序=创建程序(gl、vShader、fShader);
设posAttrLocation=gl.getAttriblLocation(程序,“a_位置”);
设posBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY\u BUFFER,posBuffer);
/*
(-1, 1).( 1, 1)
.
(-1,-1).( 1,-1)
*/
让位置=[
-1, 1,
-1, -1,
1, -1,
-1, 1,
1,-1,
1, 1
];
总账缓冲数据(总账数组缓冲区、新Float32Array(位置)、总账静态绘图);
设vao=gl.createVertexArray();
bindVertexArray总帐(vao);
gl.EnableVertexAttributeArray(posAttrLocation);
设大小为2,
类型=gl.FLOAT,
正常化=错误,
步幅=0,
偏移量=0;
总账VertexAttributePointer(posAttrLocation,
大小,
类型,
规范化
大步走
抵消);
让我们来看看纹理;
如果(纹理){
glTexture=gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D,glTexture);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_字节,纹理);
//gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,1,1,0,gl.RGBA,gl.UNSIGNED_字节,新的Uint8Array([0,0,255,255]);
gl.texParameteri(gl.TEXTURE_2D、gl.TEXTURE_WRAP_S、gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE\u 2D、gl.TEXTURE\u WRAP\u T、gl.CLAMP\u至边缘);
gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MIN\u过滤器,gl.LINEAR);
}
让resUniformLocation=gl.getUniformLocation(程序,“u_分辨率”);
设texUniformLocation=gl.getUniformLocation(程序,“u_纹理”);
返回{
节目,,
重新定位,
沃,
glTexture
}
}
函数canvasTexture(){
返回CanVastexture(256,256,(宽,高,画布,ctx)=>{
ctx.fillStyle='红色';
ctx.fillRect(0,0,w,h);
ctx.font='50pt漫画版';
ctx.fillStyle='白色';
ctx.textAlign='中心';
ctx.textb基线='中间';
ctx.fillText(“标签”,w/2,50);
返回画布;
});
具有CanVasTexture(宽度、高度、f)的函数{
var canvas=document.createElement('canvas');
画布宽度=宽度;
canvas.height=高度;
f(宽度、高度、画布、canvas.getContext('2d'));
const纹理=画布;
//document.body.append(画布);
返回纹理;
}
}
函数createShader(gl、类型、源){
让着色器=gl.createShader(类型);
gl.shaderSource(着色器,源);
gl.compileShader(着色器);
让success=gl.getShaderParameter(着色器,gl.COMPILE\u状态);
如果(成功){
返回着色器;
}
console.error(gl.getShaderInfoLog(着色器));
gl.deleteShader(着色器);
返回null;
};
函数createProgram(gl、vShader、fShader){
让程序=gl.createProgram();
gl.attachShader(程序,vShader);
gl.attachShader(程序,fShader);
总账链接程序(程序);
让success=gl.getProgramParameter(程序,gl.LINK\u状态);
如果(成功){
返回程序;
}
控制台错误(gl.getProgramInfoLog(程序));
总账删除程序(程序);
返回null;
}
//循环库
函数循环(fn){
const perf=window.performance!==未定义?window.performance:日期;
const now=()=>perf.now();
const raf=window.requestAnimationFrame;
让running=false,
lastUpdate=now(),
帧=0;
this.start=()