«GL_SEPARATE_SPECULAR_COLOR 最新 GL_CLAMP_TO_EDGE, GL_CLAMP_T..»

床井研究室

※このブログは遅くとも 2027 年 3 月に管理者の定年退職により閉鎖します (移転先は管理者本人共々模索中)

■ 2008年08月21日 [OpenGL] 丸い点を描く

2010年04月04日 15:23更新

Microsoft も Apple も・・・

学生さんの手持ちのパソコンが OS に Vista を搭載したものに移行しつつあるので,研究室のパソコンの OS もそろそろ Vista への移行を考えないといけないなあと思っているのですが,ほとんどのパソコンはメモリが 512MB しかなく,ビデオカードも古いので,Vista を満足に動かせそうにありません.メモリの増設やビデオカードの交換ということも考えたのですが,CPU 自体古いものが多いので,効果があるかどうかわかりません.Microsoft からは Vista が XP よりいかに優れているかということを訴えるダイレクトメールがくるのですが,その最後には「Vista の性能を活かすには新しいパソコンを買いましょう」みたいなことが平気で書いてあります (-_-#).そんな余裕があるわけないので,学生さんには当分 XP で我慢してもらうしかないかなぁ.

一方,自宅では Mac を使っているのですが,CPU は未だ PowerPC です.これもリプレースしたいのですが,今の Mac の CPU は Intel なので,手持ちの PowerPC 用ソフトウェアは Rosetta で動かさざるを得ません.これだと数値計算が中心の CG ソフトなんかはちょっと使い物にならないと思います.小遣いを貯めてソフトウェアも Universal 版にアップグレードすればいいのですが,中には Canvas のように Universal 版に移行せずに Mac 版の開発をやめてしまったものもあります.Canvas は Version 3.5 の時代(16年前か!)から使っている私の手に馴染んだソフトウェアなので,これが使えなくなるのはつらいものがあります.私も当分この PowerPC Mac mini を使い続けるしかないのかなぁ.

点を丸くしたい

書き忘れたと思っていたことの二つ目です.GL_POINT で描く点の大きさを glPointSize() で指定すると,点の形が正方形になってしまいます.

正方形の点

Point Sprite を使ってみるでは,点に丸くくり抜くためのアルファチャンネルを付けたテクスチャを貼り付けて,アルファテストを使って丸くしていましたが,テクスチャを使わない場合は点にアンチエリアシングを設定するだけで丸い点を描くことができます.

/* 点にアンチエリアシング処理を行う */
glEnable(GL_POINT_SMOOTH);

これで点は次のような形になります.

丸くなったの点

本当にアンチエリアシングを有効にする(点の周囲のぎざぎざを取る)には,アルファブレンディングも有効にする必要があります.

/* アンチエリアシング処理の品質を最高にする */
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
 
/* アルファブレンディングを有効にする */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

ただし,点同士が重なっている場合,点を奥から順番に描かなければ,このアンチエリアシングは正しい結果が得られません(重なっている部分で境界線が見え隠れします).

アンチエリアシング処理をした点
コメント(14) [コメントを投稿する]
Seagul-X 2008年08月21日 12:59

久々の連続更新ですね。更新されなくてもこのサイトは現在までの掲載分だけでも非常に参考になるので、毎日のようにお邪魔しています。これからも、無理のない程度でかまいませんので、のんびり更新していただけたら、と思います。<br><br>話は変わりますが、SIGGRAPH 2008 で OpenGL 3.0 と GLSL 1.3 の仕様が明らかになりましたね。OpenGL.org のサイトには何故か OpenGL 3.0 の仕様書しかなく、両方手に入れるためには Khronos Group のサイトの OpenGL のページに行かないといけませんが。<br><br>http://www.khronos.org/opengl/<br><br>一時は全面的に更新されるはずだった API が、いくつかの参加企業の反発で、結局 2.0 とたいして変わらない仕様に巻き戻ってしまったようです。それでも Vertex Array Object など、いくつかの新機能がありますが。

とこ 2008年08月21日 22:43

 Seagul-X さま,いつもありがとうございます.ご心配をおかけして,申し訳ありません.暇なときに(今が暇という訳ではないんですが)焦らず,のんびりやっていこうと思います.<br> OpenGL 3.0 と GLSL 1.3 の情報ありがとうございます.早速ダウンロードして眺めてみました.まだざっとしか見てませんが,OpenGL の方は FBO が標準機能に入ったり順当に機能拡張されている感じですね(この程度?って気もしますが).しかし,Appendix E の The Deprecation Model を読んでいて目が点になりました.Begin/End の代わりに Vartex Array を使えとか,OpenGL ES みたいなことが書いてあります.この他にも(使い慣れた)非常にたくさんの機能が deprecate になっていて,これからどうしようという感じです.<br> GLSL 1.3 の方も attribute や varying の代わりに in, out を使えとか,ftransform は使うなとか(これは一度仕様から削除されたみたいですが),結構びっくりするようなことが書いてあります.テクスチャ関係のビルトイン関数も変わってますね.キャッチアップが大変だなぁ.

Seagul-X 2008年08月22日 13:00

これでも、本来進められていた仕様と比べると相当古いものに戻ってしまった感じです。全面的にオブジェクトモデルを取り入れた、DirectX や M3G(Mobile 3D Graphics) のような仕様になるはずでしたから。もちろん、後方互換性は切り捨てです。<br><br>結局、いまの GPU のアーキテクチャに OpenGL のモデル(特にディスプレイリストなど)が合わない、ということなんですよね。1.0 が制定された頃はたしかに CPU からグラフィックスサブシステムまでが遠くてバンド幅も小さかったのでディスプレイリストのようにポツポツとデータを送る(その合間にサブシステム側で色々加工ができる)モデルは合っていたと思いますが。<br><br>今回のアップデートはこういうふうになりましたが、ネットを見ると非難轟々なので、次(いつでしょうかね?)はそういった方向に舵を切ることになると思われます。

とこ 2008年08月24日 23:26

 そうなんですか.うーむ.確かに,現時点までの OpenGL の平板な構造は古くさくて,オブジェクト指向なプログラミングモデルにきれいに収まらない場面が時々あります.実際,Begin/End なんてのはもう無くてもいいかとも思います(チュートリアルを書くときやアプリケーション側でメモリを確保したくないときなんかは便利なんですが).<br> ただ,DirectX が(PRT なんてものまで仕様に含んでしまうような)ゲームやグラフィックスアプリケーションのフレームワークなのに対して,OpenGL はあくまでグラフィックスハードウェアの機能を呼び出す API に過ぎないと思うので,これにあまり複雑な構造を持たせることに対しては,まだまだ抵抗感があります.そういうものは,Open Scene Graph のような,より上位のライブラリで実装すればいいと考えていたからです.<br> でも,GPU が高機能化して GPU 上のプロセッサやメモリなどのリソース管理が複雑になってきたので,従来の平板なモデルではグラフィックスハードウェアの機能を網羅して抽象化することが既に困難になっているのかも知れませんね.であれば,もともと OpenGL は伝統的なグラフィックスパイプラインをシンプルに抽象化したものでしたから,新しいグラフィックスハードウェアに対しても,エレガントな抽象化が行われることを期待します.プログラマのニーズから離れて教条主義的な構造化が行われてしまうと,かつての PHIGS のように使われなくなってしまうかも知れませんから.

Seagul-X 2008年08月25日 13:05

>そういうものは,Open Scene Graph のような,より上位のライブラリで実装すればいいと考えていたからです. <br><br>あー、すみません。どうも誤解をまねく書きかただったみたいですね。たしかに DirectX と M3G を挙げるとシーングラフなどの上位機能の話になっちゃいますね。<br><br>そうではなくて、従来の(というか、3.0 も戻っちゃったわけですが)ステートひとつ変更するごとに API をひとつ叩く、というふうじゃなくて、機能単位でいくつかのステートをまとめたオブジェクトを作り、オブジェクト単位で一気にステートを更新する、という感じです。CPU と GPU が近くなり転送速度も上がっているので、1回のステート変更のコストが相対的に高くなってしまい、1回のコールで複数のステートを変更したほうがよくなったわけです。<br><br>まぁ、頂点情報なんかで VBO でやっていることをステートにまで広げた、というところですかね。

とこ 2008年08月25日 16:29

 すみません,ありがとうございます.理解しました.私はネット上でのディスカッション全然見てなかったので,流れを全然把握しておりませんでした.またひとつ恥をさらしてしまいました.<br> 遅まきながら pipeline なんかも読んでみました.おっしゃっていたのは,"Most context state will be moved into an object" ということなんですね.OpenGL Longs Peak で約束されていたものが全然実現されなかったんで,みんな怒っているというわけですね.

Seagul-X 2009年03月25日 18:26

こんにちは。昨年の SIGGRAPH で OpenGL 3.0 が発表されてまだ 1 年経っていませんが、早くも OpenGL 3.1 と GLSL 1.4 の仕様がリリースされました。<br><br>http://www.khronos.org/news/press/releases/khronos-releases-streamlined-opengl-3.1-specification/<br><br>入手はこちらから↓<br>http://www.khronos.org/opengl/<br><br>3.0 で Deprecated になった固定機能の部分がざっくり削られて、extension に移動しています。まぁ、PC の GL ドライバとしては、この extension をサポートするものがほとんどでしょうから後方互換はおおむね保たれるでしょうが、コアの部分はかなり身軽になりましたね。<br>以前も書いたと思いますが、携帯・組み込み機用の OpenGL ES では 2.0 で既に固定機能が削られているので、Texture3D などの違いがまだまだたくさん残ってはいるものの、これで OpenGL と OpenGL ES がだいぶ近くなった感じがします。<br><br>Mozilla Foundation からの提案で web で使える 3D API を策定するというニュースも同時にはいってきたので、その関連もあるかもしれません。Mindows Mobile や iPhone, Android など、PC と同じように web を見られる携帯端末が増えてきているので、PC と携帯機で 3D API があまり違ってしまうと難しくなるでしょうから。<br><br>http://techon.nikkeibp.co.jp/article/NEWS/20090325/167686/<br>http://journal.mycom.co.jp/news/2009/03/25/023/index.html

とこ 2009年03月25日 22:22

 Seagul-X さま,ありがとうございます!お心遣い感謝しております.<br><br>> 3.0 で Deprecated になった固定機能の部分がざっくり削られて<br><br> まだ何も読んでないんですが,これは 3.0 でいう前方互換コンテキストがデフォルトになるということでしょうか.やっぱり,そうなってしまいましたか.もちろん,その方が美しいと思います.でも,これからはちゃんと CG の勉強をしておかないと,OpenGL が使えないということになってしまいますね.<br><br>> Mozilla Foundation からの提案で web で使える 3D API を策定する<br><br> こっちの方は CNET Japan で知りましたけど,面白くなってきました.ただ,素の OpenGL はグラフィックスハードウェアを制御する API でしかないので,仮に JavaScript に組み込むとすれば,形状やテクスチャなどのデータをどうハンドリングするのか興味があります.

Seagul-X 2009年03月27日 13:13

>形状やテクスチャなどのデータをどうハンドリングするのか<br><br>Khronos Group とは別になるのですが、JCP(Java Community Process) に M3G(Mobile 3D Graphics API) の規格をまとめている Expert Group があります。組織としては別だといっても、参加企業をみると Khronos Group で OpenGL ES の策定に参加している企業と重なっているので、実質はあまり変わらないものだと思います。<br>M3G 1.1(JSR 184) は元々ソフトウェアレンダリングを想定した規格らしく、レンダリングに関しては OpenGL ES 1.0 の機能よりかなり小さいものですが、現在 M3G 2.0(JSR 297) の仕様が策定されているところで、こちらは shader とかを含め OpenGL ES 2.0 の機能がほぼ全部使えるようになる模様です。<br>それに加えて Animation, Morphing, Skinning 機能を持った Schenegraph が作れ、ファイル形式も決められているのでこれを流用する、というのもありえるかもしれません。<br><br><br>話は変わりますが、昨年の SIGGRAPH Asia 2008 でのスライドを見つけました。OpenGL の歴史から最近の動向までを俯瞰できる、かなりボリュームのあるものです。<br><br>http://www.slideshare.net/Mark_Kilgard/sigraph-asia-2008-modern-opengl-presentation<br><br>OpenGL が標準になる過程で消えていった競合ライブラリが載っていたりして、「昔これ使ったことがあるなぁ」と感慨深いです。

とこ 2009年04月02日 11:25

 なるほど,M3G にそういうものがあるんですね.また,仮に native にサポートされなくても,サポートするライブラリが jQuery のように JavaScript ベースでいろいろ出てきそうですね.実は VRML や X3D の状況を見てきたので,scene graph ベースになったりしたら同じ轍を踏むんじゃないかと気が気でなかったりします.OpenGL の機能を自在に使えるフルプログラマブルな環境だとうれしいです.<br> <br>> 昨年の SIGGRAPH Asia 2008 でのスライドを見つけました<br><br> ありがとうございます.見ました.面白かったです.CORE とか GKS とかありましたねー.GKS-3D に行くかと思ったら PHIGS が出てきて,そうこうしているうちに X-Window ベースのワークステーションが出てきて PEX が載って…という流れを覚えています.<br> 初めて Personal IRIS を使ったとき,最初は PHIGS+ を勉強しようとしたんですが,ディスプレイリストの作り方がワケワカメだったんでめげました.それで IRIS GL を使ってみたらとっても簡単だったので,専らこっちを使うようになりました.グラフィックスサブシステムが RS-232C でつながってるわけじゃないのだから,Immediate mode でいいじゃんとか思ってました.このスライドの中盤でも議論してますけど,そのときはこの部分がまたボトルネックになるなんて思ってもみませんでした.<br> "Modern OpenGL" では,バッファオブジェクトを作って,それをマップして更新するってのがスジだってのはわかるんですけど,初めて OpenGL を教えるとき,そこから入るのはちょっと敷居が高い気がします.また教材を工夫しないといけないなぁ.スライドの前半の後半部分は OpenGL 3.0 の売り込みに力が入ってますけど,これを読んでも,やっぱりプログラミングのスタイルを変えたり勉強しなおさないといけないことがたくさんありますねぇ.ふぅ…<br><br># ところで,Mark Kilgard 禿げちゃったなー (^_^;)<br><br># あう,これを書いているうちに SGI がまた Chapter 11 申請してた…<br># 買収されて今度こそ本当に SGI が消えちゃうかなぁ…

Seagul-X 2009年04月23日 12:15

Mozilla Foundation と Khronos Group が…とか云ってる間に、すかさず Google が O3D なんてのを出してきましたね。<br><br>http://code.google.com/intl/ja-JP/apis/o3d/<br><br>相変わらずのフットワークの軽さで、これがデファクトスタンダードになっちゃう可能性も出てきましたね。サンプルを見てもかなり色々できるようで面白そうです。<br>ただ、このままだと携帯機器にはちょっとつらいかなぁ…まぁ、携帯機器もすぐ能力が上がってくるとは思うんですが。iPhone や Android の登場でこれまでと使われ方が変わってきましたから。

とこ 2009年04月23日 13:00

 早速プラグイン入れてみました.いろいろとできますね.デモもたくさん用意されていて,さすが Google と思いました.オブジェクトは COLLADA なんですね.で,やっぱりシーングラフ API になってると.でも,ベタな書き方もできそうですね.シェーダもかけるみたいですが,HLSL/Cg ベースみたいですね (;_;)<br> ところで,ざあっと読んだときに,どこかに .tgz アーカイブに入っている画像データを扱えると書いてあった気がするんですが,今見たら見つからない.どこに書いてあったんだろう?

Seagul-X 2009年08月04日 13:00

こんにちは。今度は OpenGL 3.2 の仕様がリリースされました。<br>変更された箇所が色分けされたバージョンのドキュメントが同時に公開されています。これは便利。今後のリリースも、これ、やってくれるといいですね。<br><br>まだ、ごくごく大雑把にしか目を通していません(それも Core Profile だけ)が、<br><br>・GLSL 1.50 サポート<br>・64bit 整数<br>・with Adjacency(隣接プリミティブがある、くらいの意味?)な Lines, Line Strips, Triangles, Triangle Strips プリミティブ<br>・glVertexAttribPointer() で BGRA 順のデータ並びをサポート<br>・DrawElements に BaseVertex や Range が追加されたバリエ−ション<br>・おなじく Buffer Object にも Base, Range を指定して bind する機能<br>・Multisample 用として明示されたテクスチャ(まだ GLSL の仕様をみてないので使い方はわかりません)<br>・同期オブジェクトと Fences<br>・Seamless Cube Map Filtering<br><br>そして、なんといっても最大の要素は Geometry Shader ですね。<br>以前は Primitive Shader という名前で追加されるような話がありました。「意地でも DirectX と違う名前にしたいんかい」と思ってましたが^^;<br>ここも詳細はまだみてません。早く GLSL の仕様書もみなくっちゃ…

とこ 2009年08月04日 14:27

Seagul-X さん,いつもありがとうございます.<br>さっき Press Releases だけちらっと見ました.<br><br>> ... and easier portability of Direct3D applications.<br><br>って書いてあったんで,「そういう方向なのか」と思ってしまいました.<br><br>> ... including geometry shaders in the OpenGL core;<br><br>という話にしても.<br><br>> ... multisampling rendering flexibility by enabling shaders to directly process texture samples.<br><br>この間,テクスチャに Sobel オペレータをかけてサンプリングするシェーダを書いたんですが,きれいに書けませんでした.これで,もしかしたら書きやすくなるかも?


編集 «GL_SEPARATE_SPECULAR_COLOR 最新 GL_CLAMP_TO_EDGE, GL_CLAMP_T..»