使用 openGL 进行文本渲染:无法旋转文本,定位无法正常工作

发布于 2024-07-25 18:25:23 字数 1575 浏览 1 评论 0原文

嘿,这是我的场景: 使用视觉工作室2008。 项目是c#的 使用Tao 框架和ISE.FreeType 来渲染文本。 字体已经加载并转换为纹理位图:

//Creamos la fuente
            fuenteActual = new FTFont(fuentes.FontMap[fuente], out ultimoError);
            //Convierte la fuente a textura. Estos valores se usan en el ejemplo, creo que tiene que ver con la calidad/eficiencia.
            fuenteActual.ftRenderToTexture(64, 96);
            //Ponemos la alineacion por defecto como centrada.
            fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;

为了开门见山,这是我渲染一些文本的代码。

    Gl.glLoadIdentity();
    float tamaño = texto.Tamaño;
    double tan = texto.Orientacion.Y / texto.Orientacion.X;
    float angulo = (float)Math.Atan(tan);

    Gl.glColor3f(texto.getRFloat(), texto.getGFloat(), texto.getBFloat());
    Gl.glScalef(tamaño, tamaño, tamaño);
    Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);
    Gl.glRotatef(angulo,0,1,0);
    if (texto.Alineacion == Align.left)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
    if (texto.Alineacion == Align.center)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;
    if (texto.Alineacion == Align.right)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_RIGHT;

    fuenteActual.ftBeginFont();
    fuenteActual.ftWrite(texto.Text);
    fuenteActual.ftEndFont();

1) 控件第一次绘制文本时,正确检测到位置 第二次重绘控件时,X 位置将被取消,并且文本将水平居中。 只有高度(Y 位置)起作用。

2) 旋转不起作用。 尽管模型视图矩阵旋转,文本始终水平显示。 为什么是这样? 我认为纹理字体的处理方式与任何其他 OpenGL 基元一样。

Hey, This is my scenario:
Using visual studio 2008.
Project is in c#
Using Tao framework along with ISE.FreeType to render text.
The font is already loaded and converted to texture bitmap:

//Creamos la fuente
            fuenteActual = new FTFont(fuentes.FontMap[fuente], out ultimoError);
            //Convierte la fuente a textura. Estos valores se usan en el ejemplo, creo que tiene que ver con la calidad/eficiencia.
            fuenteActual.ftRenderToTexture(64, 96);
            //Ponemos la alineacion por defecto como centrada.
            fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;

To get straight to the point, this is my code to render some text.

    Gl.glLoadIdentity();
    float tamaño = texto.Tamaño;
    double tan = texto.Orientacion.Y / texto.Orientacion.X;
    float angulo = (float)Math.Atan(tan);

    Gl.glColor3f(texto.getRFloat(), texto.getGFloat(), texto.getBFloat());
    Gl.glScalef(tamaño, tamaño, tamaño);
    Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);
    Gl.glRotatef(angulo,0,1,0);
    if (texto.Alineacion == Align.left)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
    if (texto.Alineacion == Align.center)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;
    if (texto.Alineacion == Align.right)
        fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_RIGHT;

    fuenteActual.ftBeginFont();
    fuenteActual.ftWrite(texto.Text);
    fuenteActual.ftEndFont();

1)
The first time the control draws the text, the position is detected properly
The second time the control redraws, the X position is ingored and the text is horizontally centered. Only the height (Y position) is working.

2)
Rotate does not work. The text is always displayed horizontally despite having the modelview matrix rotated. Why is this? I thought texture fonts were treated like any other OpenGL primitive.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

为你鎻心 2024-08-01 18:25:28

尝试使用“3f”函数版本,例如:
glTranslate3f
glScale3f

并且要小心顺序,如 finw 所说。

问候

Try use "3f" function versions, for example:
glTranslate3f
glScale3f

And be careful with the order, as finw said.

Regards

旧梦荧光笔 2024-08-01 18:25:27

难道你是绕Y轴而不是Z轴旋转?

Gl.glRotatef(angulo,0,1,0);

另外,我不熟悉 C# 接口,但 OpenGL 中的角度通常以度为单位指定,但您传递的是从 Math.Atan2 返回的值,该值以弧度为单位。

这看起来也是错误的:

Gl.glScalef(tamaño, tamaño, tamaño);
Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);

通常先进行平移,然后进行缩放。 如果您先进行缩放,则缩放将应用于您的 X 和 Y 偏移以及纹理。 尝试交换这些。

Could it be that you are rotating around the Y axis instead of the Z axis?

Gl.glRotatef(angulo,0,1,0);

Also I'm not familiar with the C# interface, but angles in OpenGL are normally specified in degrees, but you are passing a value return from Math.Atan2, which is in radians.

This also looks wrong:

Gl.glScalef(tamaño, tamaño, tamaño);
Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);

It is usual to do the translate first, then the scale. If you scale first then the scaling will be applied to your X and Y offsets as well as the texture. Try swapping these around.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文