- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 OpenGL 中绘制文本我使用的是 freetype。我现在已经成功渲染文本,但我仍然遇到字符未指向正确的 y 坐标的问题(这些字符不是平面的)。
看下面的图片,我制作了“正在加载...”文本。
如您所见,y 坐标的位置不正确。这让我很困惑。这是我所做的代码:
class FontBitmap{
private:
struct character_info {
float bw; // bitmap.width;
float bh; // bitmap.rows;
} c[256];
int next_p2 (int a )
{
int rval=1;
while(rval<a) rval<<=1;
return rval;
}
GLuint texture[256]; //character textures
public:
FT_Library library; /* handle to library */
FT_Face face; /* handle to face object */
FontBitmap(){}
void Print(char * str,GLfloat x,GLfloat y){ //the function where to render the text
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glPushMatrix();
glTranslatef(x,y,0.0f);
for(int i = 0;i < strlen(str);i++)
{
glPushMatrix();
glBindTexture(GL_TEXTURE_2D,texture[str[i]]);
glTranslatef(x,0,0); //the placement of per character
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,0.0f);
glTexCoord2f(1,0);glVertex3f(c[str[i]].bw,0,0.0f);
glTexCoord2f(1,1); glVertex3f(c[str[i]].bw, c[str[i]].bh ,0.0f);
glTexCoord2f(0,1); glVertex3f(0, c[str[i]].bh,0.0f);
glEnd();
x +=c[str[i]].bw;
glPopMatrix();
}
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
FontBitmap(char * filePath, int size) //the constructor
{
glEnable(GL_TEXTURE_2D);
if (FT_Init_FreeType (&library))
{
//on error
return;
}
if (FT_New_Face(library,filePath,0,&face))
{
//on error
return;
}
FT_Set_Pixel_Sizes (face, 0, size);
for (unsigned long i = 33; i < 256; i++)
{
if(FT_Load_Char(face, i, FT_LOAD_RENDER))
{
//on error;
return;
}
int width = next_p2( face->glyph->bitmap.width );
int height = next_p2( face->glyph->bitmap.rows );
c[i].bw = width;
c[i].bh = height;
GLubyte* expanded_data = new GLubyte[ 2 * width * height];
for(int j=0; j <height;j++) {
for(int i=0; i < width; i++){
expanded_data[2*(i+j*width)]= expanded_data[2*(i+j*width)+1] =
(i>=face->glyph->bitmap.width || j>=face->glyph->bitmap.rows) ?
0 : face->glyph->bitmap.buffer[i + face->glyph->bitmap.width*j];
}
}
glGenTextures(1,&texture[i]);
glBindTexture( GL_TEXTURE_2D, texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height,
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, expanded_data );
delete [] expanded_data;
}
}
};
最佳答案
关于您的问题,Ascent 和 Descent 是您感兴趣的两个 FreeType 指标。
字符之间的水平间距由 Advance 和 Kerning 控制
关于c++ - OpenGL 自由类型文本,y 偏移到字符的最上边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117174/
这是我正在调试的函数: boolean adin_memory(char* buffer, int size_chunck, int end_flag){ global_buffer = my
我正在尝试为具有自由 float 底座的机器人计算末端执行器空间速度雅可比行列式。由于自由 float 基数,雅可比应该包含一个基数组件和一个操纵器注释(参见 https://spart.readth
procedure FreeListObjects( l : TStrings); var i : integer; BEGIN FOR i := 0 TO l.Count -1 DO BEG
我正在探索 Haskell 中的选项,这些选项可以让我将业务逻辑与底层系统的技术实现分开。例如,在 Web 服务器的上下文中,将 Web 服务器处理其接收的信息的方式与其读取和写入数据库的方式分开。要
我的目标是使用来自 ActiveMQ 的 WebSphere Liberty Appserver(完整的 Java EE 标准)使用消息。不幸的是,我不知道如何配置 WebSphere Liberty
我以这种方式分配了一个非方阵,但我不确定我是否正确使用了释放 float **matrix_alloc(int m /* rows */, int n /* columns */) { int
我在阅读 refuting the notion 之后的第 13.5 节内置运算符不参与重载决议,并注意到没有关于 operator->* 的部分。它只是一个通用的二元运算符。 它的兄弟operato
我正在尝试使用 Libelf 库来获取有关某些 elf 文件的一些信息。但我不断收到这些“对 [...] 的 undefined reference ”。我从 synaptic 安装了 libelf(
我有创建动态结构数组的波纹管代码。 #include #include #include typedef struct { int flag; char* ip; } ip_mo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我正在用 C 编写一个程序,我需要读入一个文件并打印出每个至少 4 个字符长的字符串。我在分配要使用的内存时遇到问题。字符串可以任意长。我试图将缓冲区分配给文件的大小,然后在最后释放它,但我显然错过了
我尝试用 C 语言编写 ls 命令,但 -R 选项有问题。 输出: /Applications/Atom.app/Contents/Resources/app/apm/node_modules/es5
我正在编写一个 shell,但在执行内存检查时遇到问题,因为 valgrind 无法正常运行。 我遇到了这样的错误(我自己杀死了它): ==19703== Memcheck, a memory err
我有这样一段代码: void *write_parallel(void *num_for_chunk) { struct rusage *sum = (struct rusage*) mall
当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前收到错误。 我不确定 qsort 是否导致了此错误或为什么会发生此
我试图告诉 Websphere Liberty 我的 log4j2.xml 文件在哪里,但它不起作用。 在我的文件 jvm.options 中,我配置: -Dlog4j.configurationFi
从 websphere liberty 16 迁移到 19.0.0.1 我遇到以下异常:运行存储过程后关闭连接,出现以下异常: EJB threw an unexpected (non-declare
当对大小为 210*8 的种子数据集运行此代码时,我在预测函数中的 qsort() 行之后收到错误。它不在 qsort() 之后执行。 我不确定 qsort 是否导致了此错误或为什么会发生此错误,但如
这个问题已经有答案了: Facing an error "*** glibc detected *** free(): invalid next size (fast)" (2 个回答) 已关闭 9
我是一名优秀的程序员,十分优秀!