将SDL_TTF文本呈现到openGL Red Square而不是文本上
-
27-10-2019 - |
题
我一直试图在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_texture
和drawText
合并为一个可以正确显示文本的函数。那是代码:
通用标签
我正在如下初始化OpenGL: 通用标签
其他提示
我认为您应该只添加glEnable(GL_BLEND),因为文本表面的代码为TTF_RenderUTF8_Blended(fntCourier,text,clrFg),并且您必须启用opengl的混合功能。
编辑
好吧,我终于花了时间通过编译器放置您的代码。最重要的是,带有-Werror
的编译器可以使警告变成错误
通用标签
我没有首先看到它,因为这类似于C编码器101,这是非常意外的:您不得返回指向局部变量的指针!。一旦函数超出范围,返回的指针将仅指向废话。为什么根本不返回指针?只需返回一个整数: 通用标签
因此,您以后也不会删除纹理。您将其上传到OpenGL,但随后丢失了对其的引用。
您的代码缺少一个通用的代码标签,这就是为什么您看不到任何纹理效果的原因。但是,对纹理的使用不是最佳的。他们以这种方式进行操作,每次要绘制文本时都会重新创建一个全新的纹理。如果在动画循环中发生这种情况,您将
-
很快就会用完纹理内存 大大降低速度(1)可以通过在每次重绘时不生成新的纹理名称来解决(2)可以通过仅在文本更改时上载新的纹理数据而不使用glTexSubImage2D而使用glTexSubImage2D(当然,如果纹理的尺寸更改,则必须为glTexImage2D)来上载地址。编辑,发现另一个可能的问题,但首先解决您的指针问题。
您应确保使用的是GL_REPLACE或GL_MODULATE纹理环境模式。如果使用GL_DECAL或GL_BLEND,则会在红色四边形上显示红色文本。
在我以前的文章中,该函数的内存泄漏,一段时间后程序崩溃了... 我通过分离纹理加载和显示来改善了这一点:
必须在SDL循环之前调用第一个函数,它将文本字符串加载到内存中
每个加载的字符串必须具有不同的txtNum参数 通用标签
第二个显示字符串,必须在SDL循环中调用: 通用标签