通过移动在屏幕上的物体每像素基础上与glRasterPos()
题
我有下面的代码来呈现在我的应用程序的文本,首先我得到的鼠标坐标在世界上,然后使用这些坐标放置我在这个世界的文字,所以它会跟着我的鼠标的位置是:
修改强>加入buildfont()函数中的代码示例:
GLvoid BuildFont(GLvoid) // Build Our Bitmap Font
{
HFONT font; // Windows Font ID
HFONT oldfont; // Used For Good House Keeping
base = glGenLists(96); // Storage For 96 Characters
font = CreateFont( -12, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
FW_NORMAL, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Verdana"); // Font Name (if not found, its using some other font)
oldfont = (HFONT)SelectObject(hDC, font); // Selects The Font We Want
wglUseFontBitmaps(hDC, 32, 96, base); // Builds 96 Characters Starting At Character 32
SelectObject(hDC, oldfont); // Selects The Font We Want
DeleteObject(font); // Delete The Font
}
GLvoid glPrint(const char *fmt, ...){
char text[256];
va_list ap;
if (fmt == NULL) return;
va_start(ap, fmt);
vsprintf(text, fmt, ap);
va_end(ap);
glPushAttrib(GL_LIST_BIT);
glListBase(base - 32);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
}
...
glPushMatrix();
glColor4f(0,0,0,1);
// X-1 wont work because these are the world coordinates:
glRasterPos2d(MousePosX-1, MousePosY);
glPrint("TEST");
glColor4f(1,1,0,1);
glRasterPos2d(MousePosX, MousePosY);
glPrint("TEST");
glPopMatrix();
但我想呈现多文本,或文本与“边界”(如上面的代码我试过)或文本的背景(所以我可以从背景更好地区分它们) 那么,如何做到这一点?
我只需要知道我可以在像素移动它,所以我可以准确地修改我的屏幕上的位置,而不使用二维投影图上我的3D顶部渲染投影...我只想让它就这么简单可能的。
我试过在文本下绘制四,当然,它不工作,因为它依然采用了世界坐标......所以,当我转动我的相机沿着文本的背景文字犯规举动...我怕唯一的解决办法是对三维投影的顶部创建另一个投影...
解决方案
下面是一个很小的代码片段,我用它来呈现一个小应用程序调试的一些文字:
void
renderText(float x, float y, const char* text) {
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(viewport[0], viewport[2], viewport[1], viewport[3], -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2f(x, viewport[3] - y);
const int length = (int)strlen(text);
for (int i = 0; i < length; ++i) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]);
}
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
}
x
and y
是字符串的所需窗口坐标。 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ...)
距离GLUT效用函数呈现一个9×15像素位图的大字符。
不隶属于 StackOverflow