根据基本体顶点剪裁WEBGL片段着色器

根据基本体顶点剪裁WEBGL片段着色器,webgl,fragment-shader,Webgl,Fragment Shader,我是WEBGL新手,我读了很多关于片段着色器的帖子。但是,我无法确定如何访问片段着色器中的基本体顶点(或每个顶点的标志) 我的目标是,如果片段的至少一个基本顶点被剪裁,则丢弃该片段 感谢您的帮助您无法直接访问片段着色器中的顶点。默认情况下,片段着色器获得的唯一数据是正在光栅化的当前像素的屏幕坐标(画布/帧缓冲区坐标)和深度缓冲区值。您必须传入的所有其他数据 在我头顶的顶点着色器中,可以计算是否剪裁了顶点,并将该信息作为变量传递给片段着色器。如果没有剪辑,您将通过0,如果剪辑,您将通过1。变向得到

我是WEBGL新手,我读了很多关于片段着色器的帖子。但是,我无法确定如何访问片段着色器中的基本体顶点(或每个顶点的标志)

我的目标是,如果片段的至少一个基本顶点被剪裁,则丢弃该片段


感谢您的帮助

您无法直接访问片段着色器中的顶点。默认情况下,片段着色器获得的唯一数据是正在光栅化的当前像素的屏幕坐标(画布/帧缓冲区坐标)和深度缓冲区值。您必须传入的所有其他数据

在我头顶的顶点着色器中,可以计算是否剪裁了顶点,并将该信息作为变量传递给片段着色器。如果没有剪辑,您将通过0,如果剪辑,您将通过1。变向得到插值,因此如果在片段着色器中变化>0,则其中一个顶点被剪裁

const vs=`
属性向量4位置;
一致mat4矩阵;
可变浮动夹;
void main(){
gl_位置=矩阵*位置;
剪裁=(
任何(少于(gl_Position.xyz,-gl_Position.www))||
任何(大于(gl_Position.xyz,gl_Position.www))
) ? 1.0
: 0.0;
}
`;
常数fs=`
高精度浮点;
可变浮动夹;
void main(){
如果(剪裁>0.0){
丢弃;
}
gl_FragColor=gl_FrontFacing?vec4(1,0,0,1):vec4(0,0,1,1);
}
`;
常数m4=twgl.m4;
const gl=document.querySelector('canvas').getContext('webgl');
//编译着色器、链接程序、查找位置
const prgInfo=twgl.createProgramInfo(gl[vs,fs]);
//为以下各项调用gl.createBuffer、gl.bindBuffer、gl.bufferData
//球体的位置、法线、texcoord和索引。
const bufferInfo=twgl.primitives.createSphereBufferInfo(gl,1,8,8);
函数渲染(时间){
twgl.resizeCanvasToDisplaySize(总图画布);
总帐启用(总帐深度测试);
总图视口(0,0,总图画布宽度,总图画布高度);
//为每个属性调用gl.bindBuffer、gl.enableVertexAttribute数组、gl.VertexAttribute指针
twgl.setBuffersAndAttributes(总账、prgInfo、bufferInfo);
总账使用程序(prgInfo程序);
常数fov=60*Math.PI/180;
const aspect=gl.canvas.clientWidth/gl.canvas.clientHeight;
常数近=0.1;
常数far=5.0;
const mat=m4.透视图(视野、方位、近距离、远距离);
m4.翻译(材料[
数学罪(时间/1200),
数学·辛(时间/1300),
数学单(时间/1400)-1.8,
],mat);
m4.rotateX(垫,时间/1000,垫);
m4.旋转(垫,时间/1100,垫);
//呼叫总装
twgl.设置制服(prgInfo{
矩阵:mat,
});
//调用gl.DrawArray或gl.drawElements
twgl.drawBufferInfo(总账,bufferInfo);
请求动画帧(渲染);
}
请求动画帧(渲染)
canvas{边框:1px纯黑;}

不能直接访问片段着色器中的顶点。默认情况下,片段着色器获得的唯一数据是正在光栅化的当前像素的屏幕坐标(画布/帧缓冲区坐标)和深度缓冲区值。您必须传入的所有其他数据

在我头顶的顶点着色器中,可以计算是否剪裁了顶点,并将该信息作为变量传递给片段着色器。如果没有剪辑,您将通过0,如果剪辑,您将通过1。变向得到插值,因此如果在片段着色器中变化>0,则其中一个顶点被剪裁

const vs=`
属性向量4位置;
一致mat4矩阵;
可变浮动夹;
void main(){
gl_位置=矩阵*位置;
剪裁=(
任何(少于(gl_Position.xyz,-gl_Position.www))||
任何(大于(gl_Position.xyz,gl_Position.www))
) ? 1.0
: 0.0;
}
`;
常数fs=`
高精度浮点;
可变浮动夹;
void main(){
如果(剪裁>0.0){
丢弃;
}
gl_FragColor=gl_FrontFacing?vec4(1,0,0,1):vec4(0,0,1,1);
}
`;
常数m4=twgl.m4;
const gl=document.querySelector('canvas').getContext('webgl');
//编译着色器、链接程序、查找位置
const prgInfo=twgl.createProgramInfo(gl[vs,fs]);
//为以下各项调用gl.createBuffer、gl.bindBuffer、gl.bufferData
//球体的位置、法线、texcoord和索引。
const bufferInfo=twgl.primitives.createSphereBufferInfo(gl,1,8,8);
函数渲染(时间){
twgl.resizeCanvasToDisplaySize(总图画布);
总帐启用(总帐深度测试);
总图视口(0,0,总图画布宽度,总图画布高度);
//为每个属性调用gl.bindBuffer、gl.enableVertexAttribute数组、gl.VertexAttribute指针
twgl.setBuffersAndAttributes(总账、prgInfo、bufferInfo);
总账使用程序(prgInfo程序);
常数fov=60*Math.PI/180;
const aspect=gl.canvas.clientWidth/gl.canvas.clientHeight;
常数近=0.1;
常数far=5.0;
const mat=m4.透视图(视野、方位、近距离、远距离);
m4.翻译(材料[
数学罪(时间/1200),
数学·辛(时间/1300),
数学单(时间/1400)-1.8,
],mat);
m4.rotateX(垫,时间/1000,垫);
m4.旋转(垫,时间/1100,垫);
//呼叫总装
twgl.设置制服(prgInfo{
矩阵:mat,
});
//调用gl.DrawArray或gl.drawElements
twgl.drawBufferInfo(总账,bufferInfo);
请求动画帧(渲染);
}
请求动画帧(渲染)
canvas{边框:1px纯黑;}