【问题标题】:Check if a fragment is within a specified area检查片段是否在指定区域内
【发布时间】:2013-12-27 10:11:35
【问题描述】:

考虑以下场景。

我将 pMin 和 pMax 从世界空间转换为视口空间。 pMin 和 pMax 所包围的区域跟随用户鼠标在平面上滑动(较大的矩形)。

片段着色器内部是否有方法来确定片段是否位于内部区域内?我尝试与 gl_FragCoord.x 和 gl_FragCoord.z 进行比较,但结果不正确。

if((gl_FragCoord.x < splitMax.x && gl_FragCoord.x > splitMin.x) 
&& (gl_FragCoord.z < splitMax.z && gl_FragCoord.z > splitMin.z)){
    //within area following the mouse
} else {
   //outside of area following the mouse
}

在级联阴影贴图中,阴影贴图的选择基于片段的 z 值以及它是否位于计算出的平截头体分割 z 值内。我正在尝试做同样的事情,只是我希望我的查找也考虑 x 坐标。

【问题讨论】:

  • 您确定要使用gl_FragCoord.z(片段的深度值[0,1]),而不是gl_FragCoord.y(片段的y值[0.5,FRAME_HEIGHT-0.5])?
  • 您确定您使用的是正确的坐标系吗?在 OpenGL 中,xy 对齐屏幕的宽度和高度方向,z 是深度值。/
  • 我正在尝试将内部矩形移动到以 [0,1,0] 作为其向上向量的平面上。所以是的,我想使用 z 将其移向和远离查看器。
  • 这是我想要的,但在片段着色器中(因为稍后会查找阴影贴图)。 antongerdelan.net/opengl/images/zones.png我应该在哪个空间做这个?我没有尝试在片段着色器中取消投影窗口坐标。我对 pMaxWorld 做了以下操作:pMaxPerspectiveSpace = proj * view * pMaxpMaxNDC = pMax/pMax.wvp = viewportpMaxWindowSpace.x = (vp.w * pMaxNDC.x)/2 + (vp.x+vp.w)/2
  • 前段时间我做了类似的事情,虽然我的问题有点不同,但我不再使用 gl_FragCoord 并将 Alpha 贴图渲染到纹理,然后从该纹理中采样,如果 Alpha 是低于某个阈值,我丢弃了该片段。这允许更复杂的形状。

标签: opengl shadows


【解决方案1】:

感谢 freenode 上##opengl 中的一个人,我设法通过以下方式使其工作:

顶点着色器:将传入的顶点变换到世界空间

out vec4 worldPos;
...
worldPos = modelMatrix * vec4(vertex, 1.0);

片段着色器:在世界空间坐标中发送pMin和pMax

in vec3 pMin, pMax;
in vec4 worldPos;
...
if((worldPos.x > pMin.x && worldPos.x < pMax.x) && (worldPos.z > pMin.z && worldPos.z < pMax.z)){
   FragColor = vec4(1.0, 0.0, 0.0, 1.0);
} else {
   FragColor is scene lighting
}

结果:

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多