Clipping-planes in OpenGL ES 2.0

来源:互联网 发布:private在java 编辑:程序博客网 时间:2024/05/27 20:50

I need to clip a few hundred objects under a clipping plane in OpenGL ES 2.0 and would appreciate ideas from people more experienced with this subset of OpenGL.

In OpenGL ES 1.x there is glClipPlane. On the desktop you have glClipPlane, or gl_ClipDistance in your shader. Neither of these two are available in OpenGL ES 2.0. It seems that this kind of functionality disappeared completely with 2.0.

It seems the only way to do this is either A) run the plane equation in the fragment shader, or B) write a very complex vertex shader that positions vertices on the plane if they are behind it.

(A) would be slow compared to glClipPlane, since "regular" clipping is done after the vertex shader and before the fragment shader, each fragment would still have to be partially processed and discarded.

(B) would be very hard to make compatible between shaders, since we can't discard vertices we have to align them with the plane and adjust attributes for those that are "cut". It's not possible to interpolate between vertices in the shader without sending all vertices in a texture and sample it, which would be extremely expensive. Often it would probably be impossible to interpolate the data correcly anyway.

I've also thought of aligning the near plane with the clipping plane which would be an efficient solution.

And drawing a plane after rendering the whole scene and checking for depth-fail will not work either (unless you are looking close to perpendicular to the plane).

What works for a single object is to draw the plane to the depth buffer and then render the object with glDepthFunc(GL_GREATER), but as expected it does not work when one of the objects is behind another. I tried to build on to this concept but eventually ended up with something very similar to shadow volumes and just as expensive.

So what am I missing? How would you do plane clipping in OpenGL ES 2.0?



5down vote

Apparently I was on to something when I attempted to do clipping using the projection matrix. Exactly how to do this is described in this paper I found: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf


5down vote

Apparently I was on to something when I attempted to do clipping using the projection matrix. Exactly how to do this is described in this paper I found: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf


Here is two solutions I've found on Vuforia SDK forums.

  1. Using shaders by Harri Smatt:

    uniform mat4 uModelM;uniform mat4 uViewProjectionM;attribute vec3 aPosition;varying vec3 vPosition;void main() {  vec4 pos = uModelM * vec4(aPosition, 1.0);  gl_Position = uViewProjectionM * pos;  vPosition = pos.xyz / pos.w;}

    precision mediump float;varying vec3 vPosition;void main() {  if (vPosition.z < 0.0) {    discard;  } else {    // Choose actual color for rendering..  }}
  2. Using quad in depth buffer by Alessandro Boccalatte:

    • disable color writing (i.e. set the glColorMask(false, false, false, false);)
    • render a quad which matches the marker shape (i.e. just a quad with the same size and position/orientation of the marker); this will only be rendered into the depth buffer (because we disabled color buffer writing in the previous step)
    • enable back the color mask (glColorMask(true, true, true, true);)
    • render your 3D models

5down vote

Apparently I was on to something when I attempted to do clipping using the projection matrix. Exactly how to do this is described in this paper I found: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf




1down vote

I don't know if this applies to OpenGL ES, but OpenGL has the gl_ClipDistance varying output enabled by glEnable(GL_CLIP_DISTANCE0). Once enabled, the primitive is clipped such that gl_ClipDistance[0] >= 0 after the vertex and geometry shaders.

The clip distance can be specified as just a dot product with a world-space plane equation:

http://github.prideout.net/clip-planes/


5down vote

Apparently I was on to something when I attempted to do clipping using the projection matrix. Exactly how to do this is described in this paper I found: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf

1down vote

I don't know if this applies to OpenGL ES, but OpenGL has the gl_ClipDistance varying output enabled by glEnable(GL_CLIP_DISTANCE0). Once enabled, the primitive is clipped such that gl_ClipDistance[0] >= 0 after the vertex and geometry shaders.

The clip distance can be specified as just a dot product with a world-space plane equation:

http://github.prideout.net/clip-planes/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 西安儿童医院网上挂号预约 安徽省立医院预约挂号 重庆儿童医院预约挂号 南京儿童医院预约挂号 郑大一附院预约挂号网 济宁附属医院预约挂号 湘雅二医院预约挂号 怎样在网上预约医院挂号 就医160网上预约挂号 天津市总医院预约挂号平台 绵阳中心医院预约挂号系统 朝阳医院网上预约挂号 东莞人民医院预约挂号 广州中山二院预约挂号 南昌一附医院预约挂号 常州中医院预约挂号 杭州市中医院预约挂号 天津骨科医院预约挂号 积水潭网上预约挂号 武汉一医院网上预约挂号 怎么在网上预约挂号医院 保定省医院预约挂号 福建医护网预约挂号 第一人民医院网上挂号 珠海人民医院预约挂号 苏州中医院预约挂号 北京积水潭医院挂号 广州市统一预约挂号系统 无锡四院网上预约挂号 芜湖中医院预约挂号 青岛中心医院预约挂号 武汉中医院网上挂号 茂名人民医院预约挂号 广州市统一预约挂号平台 北京市统一预约挂号平台 苏州中医院网上挂号 深圳市160网上预约挂号 深圳160就医网预约挂号 珠海中医院预约挂号 青岛海慈医院预约挂号 第一医院网上预约挂号