2012-01-05 21 views
1

我試圖在渲染的3D紋理上顯示文本疊加(基本上是一個顯示我的鍵盤快捷鍵的幫助屏幕)。紋理效果很好,我爲用戶準備了一些東經旋轉和翻譯。調用glRasterPos2i和glutBitmapString存在ModelView變換

我的想法是使用

const unsigned char tmp[100] = "text to render"; 

glRasterPos2i(x, y); 

glColor4b(255, 255, 255, 255); 
glutBitmapString(GLUT_BITMAP_HELVETICA_18, tmp); 

正如How do I use glutBitmapString() in C++ to draw text to the screen?建議。

這很好用,只不過文本與對象一起旋轉而不是保留在屏幕上的靜態位置。我看了一些資料,發現當你操縱的模型視圖矩陣glRasterPos功能操作:

的物體座標由glRasterPos提出被視爲就像那些glVertex命令:它們是由當前模型視圖轉換和投影矩陣並傳遞到裁剪階段。

- Source

然後我通過另一篇文章,你可以壓入和彈出用glPushMatrix和glPopMatrix當前矩陣中。

- Source

當我這樣做,文本會一起消失。起初我以爲我可能對文本有錯誤的座標,但我以.01的間隔嘗試了x = y = 0到x = y = 25,並且從未看到過文本。我仍然有可能誤解了應該在哪裏繪製,但我不確定接下來要做什麼。

我的拉動作用是調用一些類似於:

glLoadIdentity(); 

glPushMatrix(); 

glTranslatef(0,0,-sdepth); 

glRotatef(-stheta, 1.0, 0.0, 0.0); 
glRotatef(sphi, 0.0, 0.0, 1.0); 

glRotatef(rotateX,0,1,1); 
glRotatef(rotateY,1,0,0); 

glTranslatef(-0.5,-0.5,-0.5); 

glPopMatrix(); 

glRasterPos2i(2, 2); 

glColor4b(255, 255, 255, 255); 
glutBitmapString(GLUT_BITMAP_HELVETICA_18, tmp); 

任何人有調試/故障排除步驟的建議,試圖讓這個文字在屏幕上的單一,靜態的位置上顯示?

+0

你如何設置你的投影矩陣? – genpfault 2012-01-06 06:54:58

回答

1

好吧,如果glRasterPos是treated the same way as glVertex,那麼你就需要調用glRasterPos之前設置適當的投影(GL_PROJECTION)矩陣(使用gluOrtho2D)。

+0

我之前在代碼中做過這樣的事,它只用我繪製的四維紋理效果很好。有什麼理由需要我再做一次嗎? – user986122 2012-01-06 05:03:31

0

給這一個鏡頭:

#include <GL/glut.h> 
#include <string> 

using namespace std; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255,0,0); 
    glPushMatrix(); 
     glScalef(5,5,5); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glColor3ub(0,255,0); // A 
    glRasterPos2i(0,0);  // B 

    string tmp("wha-hey!"); 
    for(size_t i = 0; i < tmp.size(); ++i) 
    { 
     glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, tmp[i]); 
    } 

    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    double aspect_ratio = (double)w/(double)h; 
    glOrtho(-10*aspect_ratio, 10*aspect_ratio, -10, 10, -1, 1); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Text"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 

奇怪的是交換線AB導致glColor3ub()調用不會生效。我想這就是你在發佈代碼序列時遇到的問題。

順便glColor4b()需要char S的最大程度的發揮,在127,如果你想在傳遞255

Documented here堅持(「glRasterPos(),glColor()的順序應該切換到glColor4ub(), glBitmap()不會導致所需的位圖顏色「),但沒有給出的解釋:(

編輯:啊哈The current raster position包含它自己的顏色狀態,其中glRasterPos()通話過程中才會更新!

+0

我認爲你在做點什麼。我想我會開始嘗試那些glGet函數來查看一些柵格值是什麼。 GL_CURRENT_RASTER_COLOR值正確(MAX_INT,MAX_INT,MAX_INT,MAX_INT),但柵格位置(我設置爲(1,1))設置爲(0,0,0,0),這是不正確的。我檢查了GL_CURRENT_RASTER_POSITION_VALID值,它不是GL_TRUE。我將它轉換爲int並且它是0.我猜這意味着我如何定位文本有什麼問題。也許它與我設置的原始投影矩陣有關?我會讓你知道我找到了什麼。 – user986122 2012-01-06 05:12:18

+0

到目前爲止,我可以工作的唯一職位是0,0,0,0。它返回true,但所有其他位置都失敗。 – user986122 2012-01-06 05:35:23

+0

**已解決!**我決定閱讀那篇你完全鏈接的文章,最後我只用了他們寫的window_pos函數。它正確地設置了位置。謝謝您的幫助! – user986122 2012-01-06 16:48:54