Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SDL_ttf和OpenGL,ttf_渲染F8_混合打印红色矩形_C++_Opengl_Sdl_Sdl Ttf - Fatal编程技术网

C++ 使用SDL_ttf和OpenGL,ttf_渲染F8_混合打印红色矩形

C++ 使用SDL_ttf和OpenGL,ttf_渲染F8_混合打印红色矩形,c++,opengl,sdl,sdl-ttf,C++,Opengl,Sdl,Sdl Ttf,当我使用TTF\u RenderUTF8\u Blended渲染文本时,屏幕上会出现一个实心矩形。颜色取决于我选择的颜色,在我的例子中,矩形是红色的 我的问题 我错过了什么?似乎我没有从使用SDL\u DisplayFormatAlpha(TTF\u RenderUTF8\u mixed(…)生成的曲面中获得正确的Alpha值,还是我?有人认识到或知道这个问题吗 附加信息 如果我使用TTF\u RenderUTF8\u Solid或TTF\u RenderUTF8\u Shaded文本绘制正确

当我使用
TTF\u RenderUTF8\u Blended
渲染文本时,屏幕上会出现一个实心矩形。颜色取决于我选择的颜色,在我的例子中,矩形是红色的

我的问题 我错过了什么?似乎我没有从使用
SDL\u DisplayFormatAlpha(TTF\u RenderUTF8\u mixed(…)
生成的曲面中获得正确的Alpha值,还是我?有人认识到或知道这个问题吗

附加信息 如果我使用
TTF\u RenderUTF8\u Solid
TTF\u RenderUTF8\u Shaded
文本绘制正确,但当然不能混合

我还在屏幕上绘制其他纹理,所以我最后绘制文本,以确保混合将考虑当前曲面


编辑:
SDL_Color g_textColor={255,0,0,0}您犯了一个相当常见的错误。它位于OpenGL的一端

DrawText()
中渲染带纹理的四边形时,启用了OpenGL的混合功能,但从未指定混合功能(即应如何混合)

您需要以下代码才能在OpenGL中启用常规alpha混合:

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
这个信息以前在OpenGL网站上,但我现在找不到

这会阻止它变成红色。其他人工作的原因是因为他们不是alpha混合的,他们实际上只是黑色图像上的红色,没有alpha,所以混合功能并不重要。但是混合的颜色只包含红色,带有一个alpha通道以减少红色

不过我注意到你的程序中还有一些小问题

DrawText()
函数中,您将使用SDL对曲面进行布点并使用OpenGL进行渲染。在使用OpenGL时,不应使用常规SDL blitting;它不起作用。所以这条线不应该在那里:

SDL_BlitSurface(g_pText, &sourceRect, g_pSurfaceDisplay, NULL);
此外,此行还会泄漏内存:

g_pText = SDL_DisplayFormatAlpha( TTF_RenderUTF8_Blended(...) );
TTF_RenderUTF8_Blended()
返回指向
SDL_曲面的指针,必须使用
SDL_FreeSurface()
释放该曲面。由于您将其传递到
SDL\u DisplayFormatAlpha()
,因此您将无法跟踪它,并且它永远不会被释放(因此内存泄漏)

好消息是这里不需要
SDL\u DisplayFormatAlpha
,因为
TTF\u RenderUTF8\u Blended
无论如何都会返回一个带有alpha通道的32位曲面!因此,您可以将这一行改写为:

g_pText = TTF_RenderUTF8_Blended(g_pFont, "My first Text!", g_textColor);

很抱歉没有指定它。它是一个SDL_Color g_textColor={255,0,0,0};(我尝试了指定alpha值和不指定alpha值,但得到了相同的结果)。如果不使用SDL blitting机制,为什么要使用
SDL\u DisplayFormatAlpha()
?@genpfault这是我的问题之一。我不知道如何使用整个SDL_Blit以及TTF_renderrutF8_混合,我尝试了与我所读内容不同的东西。然而,我显然没有正确地使用某些东西,这就是为什么我需要一些帮助。我需要有人能指出我做错了什么。太棒了,我刚刚测试过它,它工作得很好。谢谢你的解释,有时候当你只是想解决问题的时候,东西会堆积在一起,很难发现。没问题,很容易犯错误。
glBlendFunc
有点复杂,但是你在这里看到它的方式是你99%的时间使用的方式。正如我所说的,这些信息曾经出现在OpenGL的FAQ上,但现在已经不存在了。
g_pText = SDL_DisplayFormatAlpha( TTF_RenderUTF8_Blended(...) );
g_pText = TTF_RenderUTF8_Blended(g_pFont, "My first Text!", g_textColor);