C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用FreeType / GLFW完全不渲染文本大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是得到了清晰的颜色;文本没有渲染,我的着色器没有发出任何错误;这是我的调试输出

Initializing FreeType version 2.4.10...
opening font file FreeSans.ttf...
Loading glyph set and shaders...
Compiling shader textshader.vs...

Compiling shader textshader.fs...

Linking program...

Drawing text...
16.666667 ms/frame

这是我的绘图功能

void text::draw(const char* text,float x,float y,float sx,float sy) {

    const char *p;
    FT_GlyphSlot g = face->glyph;

    GLuint tex;

    glActiveTexture(GL_TEXTURE0);
    glGentextures(1,&teX);
    glBindTexture(GL_TEXTURE_2D,teX);
    glUniform1i(uniform_tex,0);

    glPixelStorei(GL_UNPACK_ALIGNMENT,1);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    glEnabLevertexAttribArray(attribute_coord);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glVertexAttribPointer(attribute_coord,4,GL_FLOAT,GL_falSE,0);

    for(p = text; *p; p++) {
        if(FT_Load_Char(face,*p,FT_LOAD_RENDER))
            conTinue;

        glTexImage2D(
            GL_TEXTURE_2D,GL_ALPHA,g->bitmap.width,g->bitmap.rows,GL_UNSIGNED_BYTE,g->bitmap.buffer
        );

        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},{x2 + w,1,{x2,-y2 - h,1},1}
        };

        glBufferData(GL_ARRAY_BUFFER,sizeof Box,Box,GL_DYNAMIC_DRAW);
        glDrawArrays(GL_TRIANGLE_StriP,4);

       x += (g->advance.x >> 6) * sx;
       y += (g->advance.y >> 6) * sy;
    }

    glDisabLevertexAttribArray(attribute_coord);
    gldeleteTextures(1,&teX);
}

这是我执行绘图功能的地方

void window::handleEventsAndRender() {

    if(!isOpen) {
        printf("Must open a window first to render and handle events!");
        return;
    }

    float sx = 2/1024;
    float sy = 2/786;

    text test("FreeSans.ttf");

    glUseProgram(test.textProgram);

    GLfloat black[4] = {0,1};
    glUniform4fv(test.uniform_color,black);

    printf("Drawing text...\n");

    while(glfwGetWindowParam(GLFW_OPENED)) {

        glClearColor(1,1);
        glClear(GL_COLOR_BUFFER_BIT);

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

        test.draw("The Quick Brown Fox Jumps Over The Lazy Dog",-1 + 8 * sx,1 - 50 * sy,sx,sy);

        glfwSwapBuffers();
        printFPS();
    }

    glfwTerminate();
}

最后,这是我的着色器

顶点

#version 120

attribute vec4 coord;
varying vec2 texpos;

void main(void) {
    gl_Position = vec4(coord.xy,1);
    texpos = coord.zw;
}

分段

#version 120

varying vec2 texpos;
uniform sampler2d tex;
uniform vec4 color;

void main(void) {
    gl_FragColor = vec4(1,texture2D(tex,texpos).a) * color;
}

有人可以帮帮我吗?

解决方法

我认为你的问题来自sx和sy的初始化

float sx = 2/1024; // sx == 0,2 is int and 1024 is int. 2 / 1024 -> sx == 0
// ...
test.draw("The Quick Brown Fox Jumps Over The Lazy Dog",sy); 
// is actually calling like this
test.draw("The Quick Brown Fox Jumps Over The Lazy Dog",-1,0);
// then in text::draw
float w = g->bitmap.width * sx; -> w == 0

修复sx和sy初始化:

float sx = float(2)/float(1024);
// or
float sx = 2.0f / 1024.0f;

大佬总结

以上是大佬教程为你收集整理的c – 使用FreeType / GLFW完全不渲染文本全部内容,希望文章能够帮你解决c – 使用FreeType / GLFW完全不渲染文本所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。