使用 gl_FragCoord 在四边形中创建一个洞

发布于 2024-10-26 07:19:56 字数 655 浏览 8 评论 0原文

我正在学习 WebGL,并且想要执行以下操作:

使用片段着色器创建一个带有方孔的 3D 四边形。

看来我需要根据 gl_FragCoord 适当地设置 gl_FragColor

我应该:

a) 将 gl_FragCoord 从窗口坐标转换为模型坐标,进行适当的几何检查,并设置颜色。

或者

b) 以某种方式将孔信息从顶点着色器传递到片段着色器。也许使用纹理坐标。我对这部分不清楚。

我对实现上述任一内容感到模糊,因此我希望获得有关其中任一内容的一些编码提示。

我的背景是一个 OpenGL 旧计时器,他没有跟上新的着色语言范例,现在正在努力赶上......

编辑(27/03/2011):

我已经能够成功地实现上述基于在 tex 坐标提示上。我在下面的链接中写了这个示例:

带孔的四边形- 示例

带孔的四边形 - 示例

I am learning WebGL, and would like to do the following:

Create a 3D quad with a square hole in it using a fragment shader.

It looks like I need to set gl_FragColor based on gl_FragCoord appropriately.

So should I:

a) Convert gl_FragCoord from window coordinates to model coordinates, do the appropriate geometry check, and set color.

OR

b) Somehow pass the hole information from the vertex shader to the fragment shader. Maybe use a texture coordinate. I am not clear on this part.

I am fuzzy about implementing either of the above, so I'd appreaciate some coding hints on either.

My background is that of an OpenGL old timer who has not kept up with the new shading language paradigm, and is now trying to catch up...

Edit (27/03/2011):

I have been able to successfully implement the above based on the tex coord hint. I've written up this example at the link below:

Quads with holes - example

Quads with holes - example

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扶醉桌前 2024-11-02 07:19:56

最简单的方法是使用纹理坐标。只需将 Corrds 作为额外的属性数组提供,然后使用变量传递到片段着色器。着色器应包含以下内容:

顶点:

attribute vec3 aPosition;
attribute vec2 aTexCoord;

varying vec2 vTexCoord;

void main(){
     vTexCoord=aTexCoord;
     .......
}

片段:

varying vec2 vTexCoord;

void main(){
     if(vTexCoord.x>{lower x limit} && vTexCoord.x<{upper x limit} && vTexCoord.y>{lower y limit} && vTexCoord.y<{upper y limit}){
discard; //this tell GFX to discard this fragment entirly
}
.....
}

The easiest way would be with texture coords. Simply supply the corrds as an extra attribute array then pass through to the fragment shader using a varying. The shaders should contain something like:

vertex:

attribute vec3 aPosition;
attribute vec2 aTexCoord;

varying vec2 vTexCoord;

void main(){
     vTexCoord=aTexCoord;
     .......
}

fragment:

varying vec2 vTexCoord;

void main(){
     if(vTexCoord.x>{lower x limit} && vTexCoord.x<{upper x limit} && vTexCoord.y>{lower y limit} && vTexCoord.y<{upper y limit}){
discard; //this tell GFX to discard this fragment entirly
}
.....
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文