Javascript 这些顶点如何在剪辑坐标(-1,1)中结束?

Javascript 这些顶点如何在剪辑坐标(-1,1)中结束?,javascript,glsl,webgl,webgl2,Javascript,Glsl,Webgl,Webgl2,嗨,伙计们,这些天我一直在学习webGl,并在webGl2上阅读这本教科书 这是本书的一个例子 “严格使用”; //一组实用程序函数,用于应用程序中的通用操作 常量utils={ //查找并返回给定ID的DOM元素 getCanvas(id){ const canvas=document.getElementById(id); 如果(!画布){ 错误(`此页上没有id为${id}的画布。`); 返回null; } 返回画布; }, //给定canvas元素,返回WebGL2上下文 getGLC

嗨,伙计们,这些天我一直在学习webGl,并在webGl2上阅读这本教科书

这是本书的一个例子

“严格使用”;
//一组实用程序函数,用于应用程序中的通用操作
常量utils={
//查找并返回给定ID的DOM元素
getCanvas(id){
const canvas=document.getElementById(id);
如果(!画布){
错误(`此页上没有id为${id}的画布。`);
返回null;
}
返回画布;
},
//给定canvas元素,返回WebGL2上下文
getGLContext(画布){
返回canvas.getContext('webgl2')| | console.error('webgl2在浏览器中不可用');
},
//给定一个canvas元素,将其扩展到窗口大小
//并确保在窗口更改时自动调整大小
自动ResizeCanvas(画布){
const expandFullScreen=()=>{
canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
};
expandFullScreen();
//当浏览器触发调整大小事件时调整屏幕大小
window.addEventListener(“调整大小”,展开全屏);
},
//给定WebGL上下文和着色器脚本的id,
//返回已编译的着色器
getShader(gl,id){
常量脚本=document.getElementById(id);
如果(!脚本){
返回null;
}
const shaderString=script.text.trim();
让着色器;
if(script.type==='x-shader/x-vertex'){
着色器=gl.createShader(gl.VERTEX\u着色器);
}else if(script.type=='x-shader/x-fragment'){
着色器=gl.createShader(gl.FRAGMENT\u着色器);
}否则{
返回null;
}
gl.shaderSource(着色器,shaderString);
gl.compileShader(着色器);
if(!gl.getShaderParameter(着色器,gl.COMPILE_状态)){
console.error(gl.getShaderInfoLog(着色器));
返回null;
}
返回着色器;
},
//将颜色从0-255规格化为0-1
标准化颜色(颜色){
返回color.map(c=>c/255);
},
//将颜色从0-1取消规格化为0-255
非规范化颜色(颜色){
返回color.map(c=>c*255);
},
//返回所提供顶点的计算法线。
//注:索引必须完全定义——没有三角形,只有三角形。
计算数值(vs,ind){
常数
x=0,
y=1,
z=2,
ns=[];
//对于每个顶点,初始化法线x、法线y、法线z
对于(假设i=0;itypeof v==='function';
const isFolder=v=>
!行动(五)&&
typeof v==“对象”&&
(v.value==null | | v.value==未定义);
常量isColor=v=>
(typeof v==='string'&&&v.indexOf('#'))||
(数组isArray(v)和&v.length>=3);
Object.key(设置).forEach(key=>{
常量设置值=设置[键];
if(isAction(设置值)){
状态[键]=设置值;
返回gui.add(状态、键);
}
如果(isFolder(设置值)){
//如果它是一个文件夹,则以文件夹作为根设置元素递归调用
返回utils.configureControls(设置值{
gui:gui.addFolder(键)
});
}
常数{
价值
闵,
最大值,
步
选项,
onChange=()=>null,
}=设定值;
//设定状态
状态[键]=值;
let控制器;
//我们可以在dat.GUI上设置许多其他值
//API,但出于我们的目的,我们只需要一些
如果(选项){
controller=gui.add(状态、键、选项);
}else if(isColor(值)){
控制器=gui.addColor(状态,键)
}否则{
controller=gui.add(状态、键、最小值、最大值、步长)
}
controller.onChange(v=>onChange(v,state))
});
},
//计算给定顶点集的切线
计算
  gl_Position = uProjectionMatrix * uModelViewMatrix * vec4(aVertexPosition, 1.0);