[英]How to draw 2d object and 3d object on the same screen
我試圖繪制一個按鈕,以便以后可以單擊它。 但是我遇到了一些問題,即當我在Draw2d函數中取消注釋選定的零件時,屏幕變黑,而我的3d對象消失了。 任何想法為什么以及如何解決這個問題? 我想添加帶有注釋部分的按鈕,該按鈕顯示在不同的區域(左,頂部屏幕),如果我像在此處對其進行注釋,則其顯示在我的3d對象的中心,並且沒有邊框。 只有標簽。
void Draw2D()
{
glPushMatrix();
glDisable(GL_DEPTH_TEST);
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
//glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
ButtonDraw(&MyButton);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
}
這是我的源代碼: Source.cpp
我還要問是否有人知道如何創建輸入字段? 因為我還在學習,所以很容易獲得贊賞。
目前尚不清楚繪制循環的外觀,以及在其中設置矩陣,繪制3d材質和繪制2d材質的位置。 但是從到目前為止顯示的代碼中,我仍然可以解釋為什么會產生影響: 每種矩陣類型 (模型視圖,投影,紋理)都有一個矩陣堆棧。
您的代碼要做的是將當前選定的矩陣推入堆棧(可能是GL_MODELVIEW
)。 然后,您對其應用正交矩陣。 由於矩陣在此處不太可能是恆等式,因此正交將無法獲得您期望的結果,並且圖像是錯誤的。 同樣,舊的投影矩陣仍保持不變,這將進一步影響變換。 然后,您可以還原原始矩陣,並且渲染保持不變。
如果取消注釋代碼,則先切換按鈕,然后切換,將正交矩陣設置為投影,並設置模型視圖的標識-但僅要還原模型視圖矩陣,並且投影矩陣仍將具有正交集合。
您真正需要做的是:
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
// ... draw
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
假定glMatrixMode(GL_MODELVIEW)
調用此glMatrixMode(GL_MODELVIEW)
時,設置了glMatrixMode(GL_MODELVIEW)
,並將其還原到此狀態。 這也可以優化為
// assume `GL_MODELVIEW` is the current matrix mode
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
// ... draw
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
// now `GL_MODELVIEW` is selected again
這稍微減少了調用開銷,但不如初始變體那么清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.