步驟按順序來,不然會無法拾取,返回-1:
1, 初始化命名緩衝, glselectbuffer(buffer_size, buffer);
2, 設定渲染模式為gl_select
3, 初始化命名堆疊, glinitnames(), glpushname(0);
示例:void select_object(cpoint point, csize sz){
gluint namebuffer[max_buffer];
glint hits;
glint viewport[4];
glgetintegerv(gl_viewport, viewport);
glselectbuffer(max_buffer, namebuffer);
glrendermode(gl_select);
//初始化名稱棧
glinitnames();
glpushname(0);
glmatrixmode(gl_projection);
glpushmatrix();
glloadidentity();
glupickmatrix(point.x, viewport[3] - point.y, sz.cx, sz.cy, viewport);
gluperspective(fangle, faspect, fnear, ffar);
prender->gldraw(getdc()->getsafehdc());
glmatrixmode(gl_projection);
glpopmatrix();
glflush();
hits = glrendermode(gl_render);
if(hits>0)
{ gluint rs, depth = uint_max;
for(int loop=0; loop
glloadname(id);
這樣在namebuffer裡就會有你可能選中的模型,namebuffer儲存三類資訊:
1.命中發生時名稱棧裡的個數
2.兩個整數,命中物件的深度最大值和最小值
3.名字項,就是繪製的時候的id
所以namebuffer中每四個代表乙個選中的模型。
OPENGL 射線選擇
用過opengl的人,應該都知道,opengl是自帶拾取功能的,但用過的人應該也知道,這功能確實不好用。opengl自帶的選擇功能主要有兩種,名字堆疊 拾取 和讀深度值判斷選擇,但這兩種方法在實際專案中,未必都好用。方法一 名字堆疊的方法,需要切換渲染模式,操作命名堆疊,計算揀選矩陣,檢查選中記錄。...
OpenGL學習 顏色的選擇
opengl支援兩種顏色模式 一種是rgba,一種是顏色索引模式。無論哪種顏色模式,計算機都必須為每乙個畫素儲存一些資料。不同的是,rgba模式中,資料直接就代表了顏色 而顏色索引模式中,資料代表的是乙個索引,要得到真正的顏色,還必須去查索引表。1.rgba顏色 rgba模式中,每乙個畫素會儲存以下...
OpenGL 選擇和反饋
注釋 1,本節內容在opengl 3.1以後已經廢除了,當初opengl其實也就是想讓硬體做,達到加速目的。但現在其實都是軟體做,而且效能更高。因為軟體做的話,有八叉樹之類的,可以先剔除一大部分物體。2,opengl中的選擇和反饋是與普通渲染方式不同的一種特殊的渲染方式。我們使用時一般是先在幀快取中...