Opengl 在存在ModelView转换的情况下调用glRasterPos2i和glutBitmapString

Opengl 在存在ModelView转换的情况下调用glRasterPos2i和glutBitmapString,opengl,glut,freeglut,Opengl,Glut,Freeglut,我试图在渲染的3D纹理上显示一个文本覆盖(基本上是一个显示键盘快捷键的帮助屏幕)。纹理效果很好,我有一些东西可以为用户使用旋转和平移 我的想法是使用 const unsigned char tmp[100] = "text to render"; glRasterPos2i(x, y); glColor4b(255, 255, 255, 255); glutBitmapString(GLUT_BITMAP_HELVETICA_18, tmp); 如中所建议 这非常有效,除了文本现在随对象旋

我试图在渲染的3D纹理上显示一个文本覆盖(基本上是一个显示键盘快捷键的帮助屏幕)。纹理效果很好,我有一些东西可以为用户使用旋转和平移

我的想法是使用

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

glRasterPos2i(x, y);

glColor4b(255, 255, 255, 255);
glutBitmapString(GLUT_BITMAP_HELVETICA_18, tmp);
如中所建议

这非常有效,除了文本现在随对象旋转,而不是停留在屏幕上的静态位置。我阅读了一些文档,发现操纵模型视图矩阵时会操纵glRasterPos函数:

glRasterPos显示的对象坐标的处理方式与glVertex命令的处理方式类似:它们由当前模型视图和投影矩阵进行变换,并传递到剪裁阶段

-

然后我通过另一篇帖子发现,你可以用glPushMatrix和glPopMatrix推送和弹出当前矩阵

-

当我这样做时,文本会一起消失。起初我以为我可能把文本的坐标搞错了,但我试着以.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);
有没有人对调试/故障排除步骤有什么建议,可以尝试将此文本显示在屏幕上的单个静态位置?

好吧,如果glRasterPos是,那么在调用glRasterPos之前,您需要设置正确的投影(glu投影)矩阵(使用)。

试一试:

#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;
}
#包括
#包括
使用名称空间std;
无效显示()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
GL3UB(255,0,0);
glPushMatrix();
glScalef(5,5,5);
glBegin(GL_QUADS);
glVertex2f(-1,-1);
glVertex2f(1,-1);
glVertex2f(1,1);
glVertex2f(-1,1);
格伦德();
glPopMatrix();
glColor3ub(0255,0);//A
glRasterPos2i(0,0);//B
字符串tmp(“哇嘿!”);
对于(size_t i=0;i
奇怪的是,交换行
A
B
会导致
glColor3ub()
调用无效。我想这就是你在发布代码序列时遇到的问题

作为旁白,
glColor4b()
char
s,最大值为127。如果要持续传递255,应切换到
glColor4ub()

(“glRasterPos()、glColor()、glBitmap()的顺序不会产生所需的位图颜色”),但没有给出解释:(


EDIT:Ah-ha!包含自己的颜色状态,仅在
glRasterPos()期间更新
call.

我在前面的代码中就这么做了,我正在绘制的四边形纹理效果很好。有什么理由我需要再做一次吗?我想你已经知道了。我想我应该开始尝试那些glGet函数,看看一些光栅值是什么。GL\u CURRENT\u raster\u COLOR值是正确的(MAX_INT,MAX_INT,MAX_INT,MAX_INT),但光栅位置(我设置为(1,1))设置为(0,0,0,0),这是不正确的。我检查了GL_CURRENT_RASTER_POSITION_的有效值,但它不是GL_TRUE。我将它转换为int,它是0。我猜这意味着我如何定位文本有问题。也许这与我设置的原始投影矩阵有关?我会告诉你我找到了什么。到目前为止,我唯一能找到的位置工作是0,0,0,0。它返回真值,但所有其他位置都失败。解决了!我决定更完整地阅读你链接的那篇文章,结果只使用了他们编写的window_pos函数。它正确设置了位置。谢谢你的帮助!你是如何设置投影矩阵的?