我一直试图在Windows XP,VS2010上使用SDL和SDL_TTF库将文本呈现到openGL窗口上。 版本:
SDL版本1.2.14
SDL TTF开发版本1.2.10
openGL(版本至少为2-3岁)。

我已经使用SDL / SDL_image成功创建了openGL窗口,并且可以毫无问题地在其上渲染线/面。

但是,在文本上似乎我的当前程序存在缺陷,尝试时,我得到以下结果此处的代码

“在此处输入图片描述”

对于那些不愿意在此处粘贴的人来说,只有关键代码段: 通用标签

细分2: 通用标签

我是否缺少明显的代码?
感谢您在此问题上的任何帮助。
我已经尝试学习openGL和SDL已有3天了,所以请原谅我的任何错误信息。


编辑:

我注意到使用
TTF_RenderUTF8_Shaded
遗传标记代码

抛出一个空指针异常,这意味着实际的文本呈现函数中存在错误(我怀疑),我不知道这意味着TTF_RenderUTF8_Solid返回一个红色正方形,但是我怀疑所有麻烦都取决于此。

有帮助吗?

解决方案

我认为问题在于glEnable(GL_TEXTURE_2D)glDisable(GL_TEXTURE_2D)函数,每次在屏幕上绘制文本时都必须调用它们。也许SDL和GL表面之间的颜色转换不正确。 我将create_texturedrawText合并为一个可以正确显示文本的函数。那是代码: 通用标签

屏幕截图

我正在如下初始化OpenGL: 通用标签

其他提示

我认为您应该只添加glEnable(GL_BLEND),因为文本表面的代码为TTF_RenderUTF8_Blended(fntCourier,text,clrFg),并且您必须启用opengl的混合功能。

编辑

好吧,我终于花了时间通过编译器放置您的代码。最重要的是,带有-Werror的编译器可以使警告变成错误 通用标签

我没有首先看到它,因为这类似于C编码器101,这是非常意外的:您不得返回指向局部变量的指针!。一旦函数超出范围,返回的指针将仅指向废话。为什么根本不返回指针?只需返回一个整数: 通用标签

因此,您以后也不会删除纹理。您将其上传到OpenGL,但随后丢失了对其的引用。


您的代码缺少一个通用的代码标签,这就是为什么您看不到任何纹理效果的原因。但是,对纹理的使用不是最佳的。他们以这种方式进行操作,每次要绘制文本时都会重新创建一个全新的纹理。如果在动画循环中发生这种情况,您将

  1. 很快就会用完纹理内存
  2. 大大降低速度

    (1)可以通过在每次重绘时不生成新的纹理名称来解决

    (2)可以通过仅在文本更改时上载新的纹理数据而不使用glTexSubImage2D而使用glTexSubImage2D(当然,如果纹理的尺寸更改,则必须为glTexImage2D)来上载地址。


    编辑,发现另一个可能的问题,但首先解决您的指针问题。

    您应确保使用的是GL_REPLACE或GL_MODULATE纹理环境模式。如果使用GL_DECAL或GL_BLEND,则会在红色四边形上显示红色文本。

在我以前的文章中,该函数的内存泄漏,一段时间后程序崩溃了... 我通过分离纹理加载和显示来改善了这一点:

必须在SDL循环之前调用第一个函数,它将文本字符串加载到内存中

每个加载的字符串必须具有不同的txtNum参数 通用标签

第二个显示字符串,必须在SDL循环中调用: 通用标签

“在此处输入图片描述”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top