webgl - html和webgl混合
问题描述
我试图了解如何从画布上的 webgl 绘图和 html 页面上的结果计算颜色。
这是一个绘制两个正方形的代码。第二个的结束从第一个开始。
我使用 Color Cop 应用程序检查浏览器中生成的颜色。(一开始我制作了我用 Gimp 检查过的截图)
'use strict';
let canvas=document.querySelector('#canvas');
let gl=canvas.getContext("webgl",{
premultipliedAlpha:false // straight Alpha
});
let vs=`
uniform vec2 pos_u;
void main() {
gl_Position=vec4(pos_u,0.,1.);
gl_PointSize = 63.;
}
`;
let fs=`
precision highp float;
uniform vec4 col_u;
void main() {
gl_FragColor = col_u ;
}
`;
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vs);
gl.compileShader(vertexShader);
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fs);
gl.compileShader(fragmentShader);
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.viewport(0,0,canvas.width,canvas.height);
gl.useProgram(program);
let colLoc = gl.getUniformLocation(program,'col_u');
let posLoc = gl.getUniformLocation(program,'pos_u');
gl.clearColor(0.4,0,0.3,0.8);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.blendFunc(gl.SRC_COLOR,gl.ONE);
gl.enable(gl.BLEND);
// FIRST SQUARE
let r=0.5;
let g=0.2;
let b=0;
let a=0.4;
gl.uniform4f(colLoc, r,g,b,a);
gl.uniform2f(posLoc,-1+251/300,-1+149/150);
gl.drawArrays(gl.POINTS,0,1);
// SECOND SQUARE
r=0.4;
g=0/255;
b=76/255;
a=0.3;
gl.uniform4f(colLoc, r,g,b,a);
gl.uniform2f(posLoc,-1+299/300,-1+149/150);
gl.drawArrays(gl.POINTS,0,1);
#canvas{
background-color:rgb(255,255,255);
}
<canvas id="canvas"></canvas>
这是第一个正方形的webgl混合
颜色(RGBA) | sourceFactor (=fragColor) | sfactor(=fragColor) | 目的地颜色(=清除颜色) | dfactor =(一) |
---|---|---|---|---|
0,65 | 0,5 | 0,5 | 0,4 | 1 |
0,04 | 0,2 | 0,2 | 0,0 | 1 |
0,30 | 0,0 | 0,0 | 0,3 | 1 |
0,96 | 0,4 | 0,4 | 0,8 | 1 |
...和 html 混合
co = Cs * as + Cb * ab * ( 1 – as )
ao = as + ab * ( 1 – as )
合作 | 彩色警察 | CS | Cb(=画布颜色) |
---|---|---|---|
0,664 | 0,663 | 0,650 | 1 |
0,078 | 0,078 | 0,040 | 1 |
0,328 | 0,325 | 0,300 | 1 |
敖 | 彩色警察 | 作为 | 抗体 |
---|---|---|---|
1 | 0,96 | 1 |
Color Cop 返回的值接近我的计算
这是第一个正方形的第二个正方形的 webgl 混合
颜色(RGBA) | sourceFactor (=fragColor) | sfactor(=fragColor) | 目的地颜色(=清除颜色) | dfactor =(一) |
---|---|---|---|---|
0,824 | 0,4 | 0,4 | 0,664 | 1 |
0,078 | 0,0 | 0,0 | 0,078 | 1 |
0,417 | 0,298 | 0,298 | 0,328 | 1 |
1,0 | 0,3 | 0,3 | 0,1 | 1 |
...和 html 混合
co = Cs * as + Cb * ab * ( 1 – as )
ao = as + ab * ( 1 – as )
合作 | 彩色警察 | CS | Cb(=画布颜色) |
---|---|---|---|
0,824 | 0,812 | 0,824 | 1 |
0,078 | 0,039 | 0,078 | 1 |
0,417 | 0,388 | 0,417 | 1 |
敖 | 彩色警察 | 作为 | 抗体 |
---|---|---|---|
1 | 1,00 | 1 |
在那里,co 和 Color Cop 之间的值更加不同
为什么画布上的像素颜色值与理论值如此接近,而其他像素上的像素颜色差异更大?...毫无疑问,我没有很好地理解这个理论
解决方案
推荐阅读
- c# - 在运行时确定是否应构建服务
- css - 使用 http.get 显示 html 和 css
- python - Chromedriver 弹出验证消息 Python 填充
- html - 使用 CSS 覆盖图像的矩形
- jira - 哪些字段维护 Jira 和 Aha 之间的链接!一体化
- html - 如何使用一个搜索栏应用多个过滤器并在搜索栏中显示这些过滤器?
- amazon-web-services - openapi 发送动态文件名以响应文件
- apache - Apache LDAPS 配置
- c# - 在 Visual Studio 中添加的第三方 dll:您是否缺少 using 指令或程序集引用
- javascript - 节点列表是数组吗?