Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2014年8月26日

OpenGL Programing Guide

何年も前に買った本(1995年8月10日第4刷となってる)で,中に含まれるサンプルを実行できる様にしてみた.
OpenGL Programing Guide
サンプルのソースで,<gl\glut.h> のインクルードは最初に移動.


glut
opengl.org
  GLUT and OpenGL Utility Libraries
    GLUT – The OpenGL Utility Toolkit
      Nate Robin’s GLUT for Windows page
glut32.dll は,system32 などへ.
glut.h は,~\Include\gl へ.
glut32.lib は,~\Lib へ.


セレクション
::glRenderMode(GL_SELECT) の後の ::glRenderMode(GL_RENDER) で,セレクションヒット数が得られる.
::glGetIntegerv(GL_RENDER_MODE) で現在のモードを取得可能.
セレクションバッファの内容
  名前の深さ?
  Z min
  Z max
  名前 …


2014/09/04
時間がかかったがなんとか GLUT ではできた.


2014/09/08
今度は,VXxxxView を使用した SDI.exe での手順.
ビューの OnDropFiles で,ファイルの種類により glRenderMode GL_SELECT , GL_RENDER を呼ぶ様に変更.
  CMainFrame::OnDropFile で条件により CXxxxView::OnDropFile を呼び出し.
  glGetIntegerv(GL_RENDER_MODE,…) で GL_SELECT が返ってこない.
    wglMakeCurrent を呼んでなかったので,効果がなかった.
  今度は,GL_SELECT にならない.GL_INVALID_OPERATION となる.
    ヘルプにある様に,glSelectBuffer を呼んでなかった.
CPickSView::OnDropFiles
  GetOpGLP()->MakeCurrent(TRUE) ;
  if (…) {
    ::glSelectBuffer(BUFSIZE,selBuf) ;
    ::glRenderMode(GL_SELECT) ;
    }
  else {
    ::glRenderMode(GL_RENDER) ;
    }
  GetOpGLP()->MakeCurrent(FALSE) ;


2014/09/10

PickS.2014.09.09.zip
マウスの Y 方向の位置が合ってない.
その exe を Win 7 環境で動かすと,

デバッグ用に ::glGetIntegerv(GL_RENDER_MODE,…) のために GetOpGLP()->MakeCurrent(…) していた.
  MakeCurrent(FALSE) で SwapBuffers を呼んでいる.


マウスの Y 方向は,縦長だと合っていそう.横長だとその長い分だけ Y 方向にずれている?

コの字型の平面方向で,座標はそれなりにとれている.::gluUnProject の z は Depth / 0xffffffff .
gulUnProject の y の与え方が違っていた.
viewPort[3] – pt.y としていたが,それではダメみたいで,GetClientRect の Height() としてうまくいってそう.
PickS.2014.09.10.zip
まだ ::gluPickMatrix の方がうまくできてない.


2014/09/11
平面図にして,1 つの直方体がウィンドウいっぱいに表示される状態で選択すると,

どうもピック領域のサイズが,ウィンドウの大きさになっているような感じ.
20 Picking and Using Selection 20. ピッキングとセレクションの使い方 を参考にしているが,…


::gluPickMatrix を呼ぶタイミングが悪かったのが原因.
ある程度予想はしていたが,OpGL::Projection の中のため,その関数を分割する必要がありそう.
その関数内の OpenGL の呼び出しは,
  ::glMatrixMode(GL_PROJECTION) ;
  ::glLoadIdentity() ;
  //  ここ
  ::glOrtho(r.l,r.r,r.b,r.t, zNear,zFar) ;  /  ::gluPerspective(deg(angle),aspect, zNear,zFar) ;
  ::glViewport((GLint)win.l,(GLint)win.b,(GLint)(win.r-win.l),(GLint)(win.t-win.b)) ;
glLoadIdentity() の後に ::gluPickMatrix を呼ばなければならない.
PickS.2014.09.11.zip


2014/09/18
汎用的なコードにするため,コードを見直しているがなかなか進まない.
例えば,マウスの移動で選択されているものを表示しようとすると,テクスチャありでは遅くて使えない.
また,その時の表示で PgonsA の描画を抜き出したコードだと何とか見れるが PartsA::Draw 相当だと遅い.
PickS.2014.09.18.zip


この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。