C++ FreeType库不随教程代码一起显示

C++ FreeType库不随教程代码一起显示,c++,opengl,glsl,glut,freetype,C++,Opengl,Glsl,Glut,Freetype,-使用Mac视网膜显示器2304x1440 我成功地包含了FreeType库,并尝试基于它进行绘制,但没有显示任何内容 没有错误,因此我无法识别问题 // For LoadShaders #include "shader.hpp" #include <vector> #include <cstring> #include <GL/glew.h> #include <glm/glm.hpp> #include <glm/gtc/matr

-使用Mac视网膜显示器2304x1440

我成功地包含了FreeType库,并尝试基于它进行绘制,但没有显示任何内容

没有错误,因此我无法识别问题


// For LoadShaders
#include "shader.hpp"

#include <vector>
#include <cstring>

#include <GL/glew.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
using namespace glm;

#include <ft2build.h>
#include FT_FREETYPE_H


FT_Library library;
FT_Face face;

GLuint TextShaderID;
GLuint uniform_tex;
GLuint uniform_color;

GLuint vbo00;

// I have already acquired this font.
const char * fontfilename = "OpenSans-Regular.ttf";

void iii()
{



    /* Initialize the FreeType2 library */
    if (FT_Init_FreeType(&library)) {
        fprintf(stderr, "Could not init freetype library\n");
    }

    /* Load a font */
    if (FT_New_Face(library, fontfilename, 0, &face)) {
        fprintf(stderr, "Could not open font %s\n", fontfilename);
    }

    // Initialize Shader (Here is not problem. Maybe.)
    TextShaderID = LoadShaders( "material/shader/FreeType.vertexshader", "material/shader/FreeType.fragmentshader" );

    // Initialize uniforms' IDs
    uniform_tex = glGetUniformLocation( TextShaderID, "myTextureSampler" );
    uniform_color = glGetUniformLocation( TextShaderID, "texcol" );

    glGenBuffers(1, &vbo00);

}

void render_text(const char *text, float x, float y, float sx, float sy) {
    const char *p;
    FT_GlyphSlot g = face->glyph;

    glActiveTexture(GL_TEXTURE0);

    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glUniform1i(uniform_tex, 0);

    /* We require 1 byte alignment when uploading texture data */
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    /* Clamping to edges is important to prevent artifacts when scaling */
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    /* Linear filtering usually looks best for text */
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    /* Set up the VBO for our vertex data */
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo00);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    /* Loop through all characters */
    for (p = text; *p; p++) {
        /* Try to load and render the character */
        if (FT_Load_Char(face, *p, FT_LOAD_RENDER))
            continue;

        /* Upload the "bitmap", which contains an 8-bit grayscale image, as an alpha texture */
        glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, g->bitmap.width, g->bitmap.rows, 0, GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap.buffer);

        /* Calculate the vertex and texture coordinates */
        float x2 = x + g->bitmap_left * sx;
        float y2 = -y - g->bitmap_top * sy;
        float w = g->bitmap.width * sx;
        float h = g->bitmap.rows * sy;

        GLfloat box[4][4] = {
            {x2, -y2, 0, 0},
            {x2 + w, -y2, 1, 0},
            {x2, -y2 - h, 0, 1},
            {x2 + w, -y2 - h, 1, 1},
        };

        /* Draw the character on the screen */
        glBufferData(GL_ARRAY_BUFFER, sizeof box, box, GL_DYNAMIC_DRAW);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

        /* Advance the cursor to the start of the next character */
        x += (g->advance.x >> 6) * sx;
        y += (g->advance.y >> 6) * sy;
    }



    glDisableVertexAttribArray(0);
    glDeleteTextures(1, &tex);

}

void rrr()
{

    glUseProgram(TextShaderID);

    /* White background */
    glClearColor(1, 1, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    float sx = 2/2304/4;
    float sy = 2/1440/4;

    FT_Set_Pixel_Sizes(face, 0, 48);

    /* Effects of alignment */
    GLfloat red[4] = { 1, 0, 0, 1 };
    glUniform4fv(uniform_color, 1, red);
    render_text("The Quick Brown Fox Jumps Over The Lazy Dog", 0, 0, sx, sy);

    glutSwapBuffers();

}

//对于LoadShader
#包括“shader.hpp”
#包括
#包括
#包括
#包括
#包括
使用名称空间glm;
#包括
#包括FT_FREETYPE_H
英国电信大学图书馆;
面部;
GLuint TextShaderID;
胶合均匀;
胶水颜色均匀;
GLuint vbo00;
//我已经学会了这种字体。
const char*fontfilename=“OpenSans Regular.ttf”;
void iii()
{
/*初始化FreeType2库*/
if(FT_Init_FreeType(&library)){
fprintf(stderr,“无法初始化freetype库\n”);
}
/*加载字体*/
if(FT_新_面(库、fontfilename、0和面)){
fprintf(stderr,“无法打开字体%s\n”,fontfilename);
}
//初始化着色器(这里没有问题,可能吧。)
TextShaderID=加载着色器(“材质/着色器/自由类型.vertexshader”,“材质/着色器/自由类型.fragmentshader”);
//初始化制服ID
uniform_tex=glGetUniformLocation(TextShaderID,“myTextureSampler”);
统一颜色=glGetUniformLocation(TextShaderID,“texcol”);
glGenBuffers(1和vbo00);
}
void render_text(常量字符*文本、浮点x、浮点y、浮点sx、浮点sy){
常量字符*p;
FT_字形槽g=面->字形;
玻璃纹理(GL_纹理0);
胶合特克斯;
glGenTextures(1和tex);
glBindTexture(GL_TEXTURE_2D,tex);
glUniform1i(均匀μtex,0);
/*上传纹理数据时,我们需要1字节对齐*/
glPixelStorei(GLU解包对齐,1);
/*夹紧到边对于防止缩放时出现瑕疵非常重要*/
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
/*线性过滤通常最适合文本*/
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
/*为顶点数据设置VBO*/
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,vbo00);
glvertexattributepointer(0,4,GL_FLOAT,GL_FALSE,0,0);
/*循环遍历所有字符*/
for(p=text;*p;p++){
/*尝试加载并渲染角色*/
if(FT_加载_字符(面,*p,FT_加载_渲染))
继续;
/*将包含8位灰度图像的“位图”上载为alpha纹理*/
glTexImage2D(GL_纹理_2D,0,GL_ALPHA,g->bitmap.width,g->bitmap.rows,0,GL_ALPHA,GL_无符号字节,g->bitmap.buffer);
/*计算顶点和纹理坐标*/
浮点x2=x+g->位图_左*sx;
float y2=-y-g->bitmap\u top*sy;
浮点w=g->bitmap.width*sx;
浮点h=g->bitmap.rows*sy;
GLfloat框[4][4]={
{x2,-y2,0,0},
{x2+w,-y2,1,0},
{x2,-y2-h,0,1},
{x2+w,-y2-h,1,1},
};
/*在屏幕上绘制角色*/
glBufferData(GLU数组缓冲区、方框大小、方框、GLU动态绘图);
gldrawArray(GL_三角带,0,4);
/*将光标移到下一个字符的开头*/
x+=(g->advance.x>>6)*sx;
y+=(g->advance.y>>6)*sy;
}
glDisableVertexAttributeArray(0);
gldelete纹理(1和tex);
}
无效rrr()
{
glUseProgram(TextShaderID);
/*白色背景*/
glClearColor(1,1,1,1);
glClear(GLU颜色缓冲位);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
浮子sx=2/2304/4;
浮子sy=2/1440/4;
FT_设置_像素_大小(面,0,48);
/*对齐效果*/
GLfloat red[4]={1,0,0,1};
glUniform4fv(均一颜色,1,红色);
渲染文本(“快速棕色狐狸跳过懒狗”,0,0,sx,sy);
glutSwapBuffers();
}
它们是整数分割。如果整数除以较大的整数,则结果为0

您必须进行浮点除法:

float sx=2.0f/2304.0f/4.0f;
浮球sy=2.0f/1440.0f/4.0f;

生成纹理,其中数据被编码到alpha通道。在着色器代码中查找纹理时(通过
.a
)必须考虑这一点:

e、 g

#版本460
// [...]
均匀取样器2D MyTexture取样器;
均匀vec4 texcol;
void main()
{
vec4 col=texcol*纹理(myTextureSampler,uv);
// [...]
}
无论如何,
GL_ALPHA
已被弃用,并且已被删除。这意味着,如果使用核心配置文件,这将不起作用

改用
GL\u RED

glTexImage2D(GL_纹理_2D,0,GL_红色,
g->bitmap.width,g->bitmap.rows,0,
GL_红色,GL_无符号字节,g->bitmap.buffer);
从片段着色器中的红色通道(
.r
)读取数据:

#版本460核心
// [...]
均匀取样器2D MyTexture取样器;
均匀vec4 texcol;
void main()
{
vec4 col=texcol*纹理(myTextureSampler,uv).r;
// [...]
}
它们是整数分割。如果整数除以较大的整数,则结果为0

您必须进行浮点除法:

float sx=2.0f/2304.0f/4.0f;
浮球sy=2.0f/1440.0f/4.0f;

生成纹理,其中数据被编码到alpha通道。在着色器代码中查找纹理时(通过
.a
)必须考虑这一点:

e、 g

#版本460
// [...]
均匀取样器2D MyTexture取样器;
均匀vec4 texcol;
void main()
{
vec4 col=texcol*纹理(myTextureSampler,uv);
// [...]
}
无论如何,
GL_ALPHA
已被弃用,并且已被删除。这意味着,如果使用核心配置文件,这将不起作用

改用
GL\u RED

glTexImage2D(GL_纹理)
float sx = 2/2304/4;
float sy = 2/1440/4;
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,
             g->bitmap.width, g->bitmap.rows, 0,
             GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap.buffer);