- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试在 Windows XP、VS2010 上使用 SDL 和 SDL_TTF 库将文本渲染到 openGL 窗口上。
版本:
SDL 版本 1.2.14
SDL TTF 开发版 1.2.10
openGL(版本至少有 2-3 年历史)。
我已经使用 SDL/SDL_image 成功创建了一个 openGL 窗口,并且可以毫无问题地将线/多边形渲染到它上面。
然而,转到文本,我当前的程序似乎存在一些缺陷,我在尝试 this code here 时得到以下结果
对于那些不愿意粘贴的人来说,这里只有关键的代码段:
void drawText(char * text) {
glLoadIdentity();
SDL_Color clrFg = {0,0,255,0}; // set colour to blue (or 'red' for BGRA)
SDL_Surface *sText = TTF_RenderUTF8_Blended( fntCourier, text, clrFg );
GLuint * texture = create_texture(sText);
glBindTexture(GL_TEXTURE_2D, *texture);
// draw a polygon and map the texture to it, may be the source of error
glBegin(GL_QUADS); {
glTexCoord2i(0, 0); glVertex3f(0, 0, 0);
glTexCoord2i(1, 0); glVertex3f(0 + sText->w, 0, 0);
glTexCoord2i(1, 1); glVertex3f(0 + sText->w, 0 + sText->h, 0);
glTexCoord2i(0, 1); glVertex3f(0, 0 + sText->h, 0);
} glEnd();
// free the surface and texture, removing this code has no effect
SDL_FreeSurface( sText );
glDeleteTextures( 1, texture );
}
第 2 部分:
// create GLTexture out of SDL_Surface
GLuint * create_texture(SDL_Surface *surface) {
GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// The SDL_Surface appears to have BGR_A formatting, however this ends up with a
// white rectangle no matter which colour i set in the previous code.
int Mode = GL_RGB;
if(surface->format->BytesPerPixel == 4) {
Mode = GL_RGBA;
}
glTexImage2D(GL_TEXTURE_2D, 0, Mode, surface->w, surface->h, 0, Mode,
GL_UNSIGNED_BYTE, surface->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return &texture;
}
我是否遗漏了一些明显的代码?
感谢您对此主题的任何帮助。
我已经尝试学习 openGL 和 SDL 3 天了,所以请原谅我的任何错误信息。
编辑:
我注意到使用TTF_RenderUTF8_Shaded
TTF_RenderUTF8_Solid
抛出一个空指针异常,意味着在实际的文本渲染函数中有一个错误(我怀疑),我不知道这意味着 TTF_RenderUTF8_Blended
返回一个红色方 block 但我怀疑所有的麻烦取决于此。
最佳答案
我认为问题出在 glEnable(GL_TEXTURE_2D)
和 glDisable(GL_TEXTURE_2D)
函数中,每次在屏幕上绘制文本时都必须调用它们。也许SDL 和 GL 表面之间的颜色转换也不正确。我已将 create_texture
和 drawText
合并为一个函数,可以正确显示文本。那是代码:
void drawText(char * text, TTF_Font* tmpfont) {
SDL_Rect area;
SDL_Color clrFg = {0,0,255,0};
SDL_Surface *sText = SDL_DisplayFormatAlpha(TTF_RenderUTF8_Blended( tmpfont, text, clrFg ));
area.x = 0;area.y = 0;area.w = sText->w;area.h = sText->h;
SDL_Surface* temp = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA,sText->w,sText->h,32,0x000000ff,0x0000ff00,0x00ff0000,0x000000ff);
SDL_BlitSurface(sText, &area, temp, NULL);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sText->w, sText->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); {
glTexCoord2d(0, 0); glVertex3f(0, 0, 0);
glTexCoord2d(1, 0); glVertex3f(0 + sText->w, 0, 0);
glTexCoord2d(1, 1); glVertex3f(0 + sText->w, 0 + sText->h, 0);
glTexCoord2d(0, 1); glVertex3f(0, 0 + sText->h, 0);
} glEnd();
glDisable(GL_TEXTURE_2D);
SDL_FreeSurface( sText );
SDL_FreeSurface( temp );
}
我正在按如下方式初始化 OpenGL:
int Init(){
glClearColor( 0.1, 0.2, 0.2, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( 0, 600, 300, 0, -1, 1 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if( glGetError() != GL_NO_ERROR ){
return false;
}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA);
}
关于c++ - 将 SDL_TTF 文本渲染到 openGL 红色方 block 上而不是文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831568/
当运行这段代码时,它会以默认大小打开窗口: View [ text "window open with default size" ] 如果 a 明确给出一个大小,它将打开一个具有该大小的窗口
我创建了一个 DataGridView 并添加了一个 DataGridViewImageColumn(使用设计器)。 DataGridView 具有“AllowUserToAddRows = true
如何实现红色数字指示器(例如电子邮件计数通知)? 最佳答案 您正在寻找的是 applicationIconBadgeNumber 属性,它是 UIApplication 的属性。 要从应用中的任何位置
我很想得到一些知道如何解释如何在红色 Node 中创建十六进制到“文本”解码器的人的意见。 我有一个 Elsys 传感器,可以生成包含温度、湿度等信息的有效载荷十六进制。 交付的有效负载是“0100d
我正在使用 node-red 程序,并且使用 OPCUA Node ,该 Node 在有效负载中返回对象数组。 我需要获取对象的一些变量,例如项目的nodeId;我尝试使用下一种格式: var new
我们开发了一个在 OS 6 及更高版本上使用 Blackberry BarcodeScanner 类解码 QR 码的应用程序。当调用条形码扫描仪屏幕时,操作系统对相机权限和应用程序的警告被隐藏,即它进
我需要 SprikeKit 方面的帮助或建议。我的应用程序/游戏通过了 Apple 审查,但后来我收到了一些关于图形的投诉(大红色 X)。我正在使用 spriteNodeWithImageNamed
有人可以看看我的 jsfiddle,看看是否可以使红色 div 在中间垂直对齐,并使红色 div 也居中。您必须使包含红色 div 的 div 具有一定高度 jsFiddle
我不希望我的子页面继承父主题的链接颜色(红色),而是我希望我的子页面上有白色链接,我应该在 html/css 中更改什么才能实现这一点? 父页面CSS a{ text-decoration:no
我想尽可能使用系统颜色。如何选择不包含在系统颜色中的颜色? 两者都是SystemColors WPF 类,SystemColors GetSysColor 的 WinForms 类和 COLOR_*
有谁知道如何以编程方式处理 Android HTC 设备红色(电源)按钮以停止我的操作。当用户在我的屏幕上时按下 REd 按钮时,我想停止运行我的一些操作。我知道对于像后退按钮这样的其他按钮,我可以使
嗨,我是图像处理方面的新手,现在我正在使用 python 处理图像以获得更多洞察力。但是,我对颜色 channel 的理解有点不满意。 在我看来,形状为 (400, 400, 3) 的 RGB 图像意
我正在遵循此处红色文档中的示例:http://static.red-lang.org/red-system-specs.html#section-14 这是我的代码: Red [] #import [
十分钟的谷歌搜索不断返回相同的答案,但在我的情况下无效。我想禁用 Aptana 为制作这些波浪线所做的一切。 我找到了几个指向 Window->Preferences->General->Editor
如何在 Red/System 中创建指向数组中第一个元素的指针? 将地址分配给指针没有问题: my-integer: 1 ptr: declare pointer! [integer!] ptr: :
我希望 webview 在按下后退按钮时显示上一页我正在使用 .canGoBack 来完成此操作,但“.canGoBack”和“.GoBack”带有红线下划线,声明 ==== “无法从静态上下文引用非
有谁知道为什么在 Xcode 项目的导航器中我的 Pods.xcodeproj 文件以红色列出?我假设这意味着 Xcode 无法找到该文件,那么我如何确保它确实存在于项目中。 谢谢! 最佳答案 在工作
Java 线程堆栈组织由以下描述 diagram in comments .所以 1 glibc guard page 似乎是由 pthread_attr_init(pthread_attr*) 设置
我在一个 Conceal 的模态 div 中有一个类似于 facebook 的按钮,当用户单击一个按钮时,模态就会出现。 不幸的是,出现的 facebook 按钮上有一个红色矩形,见下图: 我用的是I
我真的很想在 css 中创建红色的 instagram 泡泡用如图所示的圆形尖端: 除了圆头,我几乎什么都有,但我不确定我应该如何做到最好...... 这是我目前所拥有的: .notif { di
我是一名优秀的程序员,十分优秀!