使用 openGL 进行文本渲染:无法旋转文本,定位无法正常工作
嘿,这是我的场景: 使用视觉工作室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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
尝试使用“3f”函数版本,例如:
glTranslate3f
glScale3f
并且要小心顺序,如 finw 所说。
问候
Try use "3f" function versions, for example:
glTranslate3f
glScale3f
And be careful with the order, as finw said.
Regards
难道你是绕Y轴而不是Z轴旋转?
另外,我不熟悉 C# 接口,但 OpenGL 中的角度通常以度为单位指定,但您传递的是从
Math.Atan2
返回的值,该值以弧度为单位。这看起来也是错误的:
通常先进行平移,然后进行缩放。 如果您先进行缩放,则缩放将应用于您的 X 和 Y 偏移以及纹理。 尝试交换这些。
Could it be that you are rotating around the Y axis instead of the Z axis?
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:
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.