javascript - 在 WebGL 中只绘制网格的一部分

标签 javascript webgl mesh fragment-shader

我有一个可以旋转和四处移动的网格。我只想画一部分。

例如:

GameImage

在我的 WebGL 游戏中,我有一个轨道图网格,我只想显示红色圆圈(左上角)中的部分,其余部分我不想绘制。

我应该考虑使用片段着色器吗?或者我能以某种方式告诉轨道图网格只绘制圆圈​​中的部分吗?

谢谢!

PS:如果我能在圆圈周围淡出轨道图,而不是仅仅将其切断,那就太好了。 :-)

最佳答案

有几种方法可以实现这一点,对于简单的矩形切口,您可以使用 scissor testing像这样:

gl.enable(gl.SCISSOR_TEST);
gl.scissor(0,gl.canvas.clientHeight-256,256,256);
// draw track here
gl.disable(gl.SCISSOR_TEST);

对于圆形切口,您可以使用模板缓冲区,将磁盘绘制到模板缓冲区,启用模板并绘制轨道,但这需要您使用带有附加模板缓冲区的帧缓冲区来设置渲染管道,这可能是有点压倒性,只给出了一个锐利的切口。

使用自定义片段着色器并与上述剪刀矩形混合似乎是这里最明智的解决方案,如前所述设置剪刀,然后在片段着色器中:

void main(void) {
    // do what you need to do to get the final color
    gl_FragColor.rgb = finalColor;
    gl_FragColor.a = smoothstep(128.,100.,length(min(vec2(gl_FragCoord.x,resolution.y-gl_FragCoord.y),256.)-128.));
}

我们在这里做的是计算当前像素到剪刀区域中心的距离(假设屏幕左上角为 256x256),然后在 100 到 128 之间进行线性淡出 结果是一个看起来像这样的面具:

result

请注意,从技术上讲,我们不再需要剪刀测试,因为片段着色器中的 mask 会遮盖圆形区域之外的所有内容。然而,保留剪刀测试可确保我们只在需要的地方进行片段着色器工作。

关于javascript - 在 WebGL 中只绘制网格的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533043/

相关文章:

具有新偏移量的three.js webgl自定义着色器共享纹理

c++ - 如何将平面网格转换为CGAL中的排列

c++ - 哪些库用于 3d 表面网格

javascript - ExtJS : Getting the response from a JSONP proxy?

javascript - 获取错误 Dropzone 已经附加了 Angular Directive(指令)

javascript - 从 JavaScript 字符串中获取整数

css - Famo.us css 3d 转换

javascript - js文件合并为单文件制作模式。如何单独加载

javascript - 将位图字符转换为三 Angular 形

javascript - 具有统一面的程序圆形网格