- 2024年10月
- 2021年5月
- 2020年8月
- 2020年6月
- 2020年5月
- 2019年1月
- 2018年8月
- 2018年6月
- 2018年5月
- 2018年3月
- 2018年1月
- 2017年12月
- 2017年11月
- 2017年10月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2016年11月
- 2013年9月
- 2013年8月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年11月
- 2012年10月
- 2012年9月
- 2012年6月
- 2012年5月
- 2012年4月
- 2012年2月
- 2011年7月
- 2011年5月
- 2011年4月
- 2011年2月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年9月
- 2010年8月
- 2010年7月
- 2010年6月
- 2010年5月
- 2010年4月
- 2010年3月
- 2010年2月
- 2010年1月
- 2009年12月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
OpenGL ES 2.0 プログラミングガイド / magicien
ふと思い出してこの本を開いてみたところ、WebGLでのClipPlaneの実現方法が載っていた。ES 1.1にはあったけど、2.0で無くなった機能をどう実装するか、という話が一通り載っていて、シェーダのプログラムもコピペしてそのまま使えるレベル。
そのうちの一つが、ユーザ定義クリップ面の話。
クリップ面の式を
Ax + By + Cz + D = 0としたとき、
v_clipPlane = (A, B, C, D)として次のシェーダを書けばOK。
( (A, B, C)はクリップ面に対する法線、Dは原点(0, 0)とクリップ面との距離になる。
例えば、Y=0平面をクリップ面としたいなら、v_clipPlane=(0,1,0,0))
頂点シェーダ:
uniform vec4 v_clipPlane; uniform mat4 matViewProjection; attribute vec4 rm_Vertex; varying float v_clipDist; void main(void) { v_clipDist = dot(rm_Vertex.xyz, u_clipPlane.xyz) + u_clipPlane.w; gl_Position = matViewProjection * rm_Vertex; }
フラグメントシェーダ:
precision mediump float; varying float v_clipDist; void main(void) { if(v_clipDist < 0.0) discard; gl_FragColor = vec4(0.5, 0.5, 1.0, 0.0); }
頂点(rm_Vertex)毎にクリップ面との距離(v_clipDist)を計算しておく。
v_clipDist が 0 より小さい点はクリップ面の裏側にあることになるため、描画しない(discard)。
もっと難しい計算が必要だと思ったけど、恐ろしく簡単に実装できた。
この記事のURL: https://darkhorse2.0spec.jp/163/
2012/05/19(Sat) 22:44:29