0
我使用OpenGL創建3D遊戲,並且想在窗口頂部製作一個工具欄。爲此,我嘗試使用SDL繪製按鈕和OpenGL來繪製實際的遊戲。這裏是我的代碼的相關部分:在同一個OpenGL窗口中繪製2D和3D
void openMainWindow(){
SDL_Surface *screen;
SDL_Event event;
SDL_Rect position;
SDL_Init(SDL_INIT_VIDEO);
putenv("SDL_VIDEO_CENTERED=center");
SDL_WM_SetCaption("Example",NULL);
SDL_WM_SetIcon(IMG_Load("icon.png"),NULL);
screen = SDL_SetVideoMode(832,487,32,SDL_HWSURFACE | SDL_OPENGL);
glLoadIdentity();
gluPerspective(70,(double)832/487,1,1000);
//Some things to initialize the window
int continue = 1;
while(continue){
SDL_PollEvent(&event);
switch(event.type){
//Events
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
//Draw a square
glEnd();
//Draw more things the same way
glFlush();
SDL_GL_SwapBuffers();
SDL_Surface *button1 = SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,32,0,0,0,0);
SDL_FillRect(button1,NULL,SDL_MapRGB(screen->format,50,50,50);
position.x = 8;
position.y = 8;
SDL_BlitSurface(button1,NULL,screen,&position);
SDL_Flip(screen);
}
SDL_Quit();
}
與此問題是,當這個功能被調用時,該過程結束,並返回圖3(這意味着有一個錯誤)。於是,我就用OpenGL繪製按鈕這樣的:
void openMainWindow(){
//Everything before the while loop is the same as in the other code
int continue = 1;
while(continue){
SDL_PollEvent(&event);
switch(event.type){
//Events
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
//Draw a square
glEnd();
//Draw more things the same way
glDisable(GL_DEPTH_TEST);
glLoadIdentity();
glBegin(GL_QUADS); //Draw the button
glColor3ub(50,50,50);
glVertex2d(-0.5,-0.5);
glVertex2d(-0.5,0.5);
glVertex2d(0.5,0.5);
glVertex2d(0.5,-0.5);
glEnd();
glEnable(GL_DEPTH_TEST);
glFlush();
SDL_GL_SwapBuffers();
}
SDL_Quit();
}
我知道,第二個代碼應集中在該窗口的按鈕,但我用這個代碼只是爲了測試它是否工作(它不這就是我發佈這個問題的原因)。
隨着第二個代碼,3D的東西出現在他們應該的窗口,但我看不到任何按鈕。如何在3D OpenGL窗口中放置2D按鈕?
你使用什麼類型的投影?我會切換到用於ui的拼字。 – BDL
@BDL因爲我是OpenGL的初學者,所以我不太清楚你的投影是什麼意思,但是你可能會看到我在代碼中使用了什麼類型的投影。如果沒有,你可以告訴我如何找出答案。 –
有一個身份投影(透視proj用'gluPerspective'設置,但隨後立即用'glLoadIdentity'丟棄)。我在第二個代碼中看不到任何明顯的錯誤(第一個代碼是另一回事 - 它沒有辦法工作),但是由於GL是一個狀態機,在給定代碼之前可能會發生很多狀態改變並影響其執行(像背面剔除)。我建議發佈說明你的問題的最小完整的例子。更好的解決方案是使用例如apitrace來調試你的問題。 – keltar