OpenGL / GLFW / FreeType으로 텍스트를 그리면 글리프 대신 흰색 직사각형이 생성됩니다.

CmdrMoozy

OpenGL의 일부 (x, y) 좌표에서 문자열을 렌더링하는 함수를 작성하려고합니다. 이 응용 프로그램은 2D로만 렌더링 할 것이므로 매트릭스 모드와 직교 투영을 제 방식대로 초기화합니다. GLFW를 사용하여 창을 초기화하고 이벤트를 폴링합니다.

int render_loop()
{
    int r;
    GLFWwindow *window;

    int width;
    int height;

    if(!glfwInit())
        return -EINVAL;

    window = glfwCreateWindow(S_WINDOW_W, S_WINDOW_H,
        "My Window", NULL, NULL);

    if(!window)
    {
        glfwTerminate();
        return -EINVAL;
    }

    glfwMakeContextCurrent(window);

    while(!glfwWindowShouldClose(window))
    {
        // Initialize the GL viewport.

        glfwGetFramebufferSize(window, &width, &height);

        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-0.5f, (width - 1) + 0.5f,
            (height - 1) + 0.5f, -0.5f, 0.0f, 1.0f);

        // Draw some text.

        FT_Face font = get_font();

        render_text("f", 5, 5, font);

        // End GL rendering, swap the buffer, and poll for events.

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();

    return 0;
}

텍스트를 렌더링하는 기능은 다음과 같습니다.

int render_text(const char *t, int x, int y, FT_Face f)
{
    int ret = 0;

    GLuint *textures;

    size_t i;
    size_t length = strlen(t);

    FT_GlyphSlot g = f->glyph;

    // Allocate a texture for each character.

    textures = (GLuint *) malloc(sizeof(GLuint) * length);

    if(textures == NULL)
    {
        ret = -ENOMEM;
        goto done;
    }

    glGenTextures(length, textures);

    // FreeType glyphs are 1-byte greyscale, so we can't use alignment.

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    // Render each character...

    for(i = 0; i < length; ++i)
    {
        // Render this particular character using FreeType.

        if(FT_Load_Char(f, t[i], FT_LOAD_RENDER))
            continue;

        // Make the current glyph's texture active.

        glActiveTexture(textures[i]);
        glEnable(GL_TEXTURE_2D);

        glBindTexture(GL_TEXTURE_2D, textures[i]);

        /*
         * To prevent artifacts when a character is not rendered exactly on
         * pixel boundaries, clamp the texture to edges, and enable linear
         * interpolation.
         */

        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);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

        // Load the texture.

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

        // Render the texture on the screen.

        glBegin(GL_TRIANGLE_STRIP);

            glTexCoord2i(0, 0);
            glVertex2i(x + 0, y + 0);

            glTexCoord2i(g->bitmap.width, 0);
            glVertex2i(x + g->bitmap.width, y + 0);

            glTexCoord2i(0, g->bitmap.rows);
            glVertex2i(x + 0, y + g->bitmap.rows);



            glTexCoord2i(g->bitmap.width, 0);
            glVertex2i(x + g->bitmap.width, y + 0);

            glTexCoord2i(g->bitmap.width, g->bitmap.rows);
            glVertex2i(x + g->bitmap.width, y + g->bitmap.rows);

            glTexCoord2i(0, g->bitmap.rows);
            glVertex2i(x + 0, y + g->bitmap.rows);

        glEnd();
    }

    // Free our textures and we're done.

    glDeleteTextures(length, textures);
    free(textures);
done:
    return ret;
}

그 결과 문자 대신 (5, 5)에 흰색 사각형이 생깁니다. 문제는 내가 전화를 걸 때 OpenGL이 알파 데이터를 잘못 해석한다는 것입니다 glTexImage2D. 그러나 제대로 설정하는 방법을 잘 모르겠습니다.

Genpfault

21.070 텍스처 객체는 어떻게 작동합니까?

텍스처 오브젝트는 텍스처 맵 및 관련 텍스처 매개 변수 상태를 저장합니다. glBindTexture ()에 대한 단일 호출로 텍스처간에 전환 할 수 있습니다.

...

다음 함수는 텍스처 객체에 영향을 미치고 상태를 저장합니다 : glTexImage * (), glTexSubImage * (), glCopyTexImage * (), glCopyTexSubImage * (), glTexParameter * () 및 glPrioritizeTextures (). 밉맵 피라미드를 빌드하기위한 GLU 루틴은 궁극적으로 glTexImage * ()를 호출하기 때문에 텍스처 객체 상태에도 영향을줍니다. 이 목록에는 glTexEnv * () 및 glTexGen * (); 텍스쳐 객체에 상태를 저장하지 않습니다.

따라서 GL_TEXTURE_MIN_FILTER/ GL_TEXTURE_MAG_FILTER상태는 텍스처 객체와 함께 저장됩니다.

실제 텍스처 오브젝트를 바인딩 하기 전에 설정 하므로 텍스처 오브젝트를 엉망으로 만드는 것 0입니다. 별로 도움이되지 않습니다.

모든 새로 생성 된 텍스처가 기본이됩니다 GL_NEAREST_MIPMAP_LINEAR에 대한 설정을 GL_TEXTURE_MIN_FILTER. 그러나 밉맵을 제공하지 않습니다. 결과적으로 흰색의 불완전한 질감 이 나타납니다.

해결 방법 : glTexParameter()통화를 이후로 이동하십시오 glBindTexture().

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

OpenGL : 프로그램이 변형 된 사각형 대신 일반 흰색 사각형을 렌더링합니다.

분류에서Dev

HTML 5 캔버스 직사각형 (픽셀 크기)으로 그림을 그리면 파란색 대신 검은 색 직사각형이 나타 납니까?

분류에서Dev

마우스를 흰색 창 상단 핸들 위로 가져 가면 GLFW (OpenGL) 창이 닫힙니다.

분류에서Dev

LibGDX 직교 카메라 : 테두리를 흰색 대신 검은 색으로 만듭니다 (자바).

분류에서Dev

SDL2 & Glew를 사용하여 OpenGL에서 간단한 흰색 사각형을 그리려고합니다. 검은 화면이 나타납니다.

분류에서Dev

SFML이 텍스처 대신 흰색 사각형을로드하는 이유는 무엇입니까?

분류에서Dev

흰색 소프트웨어가 열리면 화면이 노란색으로 바뀝니다.

분류에서Dev

FlutterMap이 흰색 화면으로 확대됩니다.

분류에서Dev

Fancybox는 이미지 대신 흰색으로 표시됩니다.

분류에서Dev

Fancybox는 이미지 대신 흰색으로 표시됩니다.

분류에서Dev

글꼴 색상이 회색 대신 흰색으로 변경됨

분류에서Dev

OpenGL 및 GLFW : 다각형을 그리지 않음

분류에서Dev

cocos2d-x로 흰색 배경 레이어에 빨간색 사각형 스프라이트를 그리는 것이 왜 그렇게 어려운가요?

분류에서Dev

OpenGL이 큐브 대신 흰색 상자를 표시 함

분류에서Dev

각 셀이 검은 색 또는 흰색 인 정사각형 행렬입니다. 최대 흰색 하위 제곱을 찾는 알고리즘 설계

분류에서Dev

glfw를 종료하고 열린 창을 닫으면 해당 창을 사용하는 OpenGL 컨텍스트가 파괴됩니까?

분류에서Dev

내 UIView가 흰색 직사각형으로 그려지는 이유는 무엇입니까?

분류에서Dev

텍스트 영역이 입력 유형 = 텍스트로 대체 될 때 코딩 된 메시지를 쓰고 디코딩하는 프로그램이 글리치됩니다.

분류에서Dev

R 대신 텍스트의 사각형으로 플롯을 그립니다

분류에서Dev

OpenGL에서 서로 다른 색상의 사각형으로 사각형 그리기

분류에서Dev

glutBitmapCharacter ()를 사용하여 OpenGL 프로그램을 닫는 텍스트 그리기

분류에서Dev

graphviz 테이블에서 녹색 배경에 흰색 텍스트를 얻으려면 어떻게합니까?

분류에서Dev

Spring Boot에서 스케줄러를 실행하면 Spring Boot 애플리케이션 컨텍스트 외부의 프로세스가 생성됩니다.

분류에서Dev

사각형에 텍스트를 자동으로 맞추는 방법. 텍스트를 클릭하면 직사각형이 나타나야합니다.

분류에서Dev

OpenGL OpenTK-깊이 버퍼를 그릴 때 흰색 화면

분류에서Dev

페이지로드를 흰색 배경 대신 검은 색으로 설정 하시겠습니까?

분류에서Dev

관리자 로그인 페이지의 Magento 흰색 화면?

분류에서Dev

문자 대신 흰개미가 사각형으로 표시됨 (아치 리눅스)

분류에서Dev

Puppeteer의 픽셀 색상을 가로 질러 스크린 샷 이미지를 생성하고 직사각형을 그리고 파일에 저장하는 방법

Related 관련 기사

  1. 1

    OpenGL : 프로그램이 변형 된 사각형 대신 일반 흰색 사각형을 렌더링합니다.

  2. 2

    HTML 5 캔버스 직사각형 (픽셀 크기)으로 그림을 그리면 파란색 대신 검은 색 직사각형이 나타 납니까?

  3. 3

    마우스를 흰색 창 상단 핸들 위로 가져 가면 GLFW (OpenGL) 창이 닫힙니다.

  4. 4

    LibGDX 직교 카메라 : 테두리를 흰색 대신 검은 색으로 만듭니다 (자바).

  5. 5

    SDL2 & Glew를 사용하여 OpenGL에서 간단한 흰색 사각형을 그리려고합니다. 검은 화면이 나타납니다.

  6. 6

    SFML이 텍스처 대신 흰색 사각형을로드하는 이유는 무엇입니까?

  7. 7

    흰색 소프트웨어가 열리면 화면이 노란색으로 바뀝니다.

  8. 8

    FlutterMap이 흰색 화면으로 확대됩니다.

  9. 9

    Fancybox는 이미지 대신 흰색으로 표시됩니다.

  10. 10

    Fancybox는 이미지 대신 흰색으로 표시됩니다.

  11. 11

    글꼴 색상이 회색 대신 흰색으로 변경됨

  12. 12

    OpenGL 및 GLFW : 다각형을 그리지 않음

  13. 13

    cocos2d-x로 흰색 배경 레이어에 빨간색 사각형 스프라이트를 그리는 것이 왜 그렇게 어려운가요?

  14. 14

    OpenGL이 큐브 대신 흰색 상자를 표시 함

  15. 15

    각 셀이 검은 색 또는 흰색 인 정사각형 행렬입니다. 최대 흰색 하위 제곱을 찾는 알고리즘 설계

  16. 16

    glfw를 종료하고 열린 창을 닫으면 해당 창을 사용하는 OpenGL 컨텍스트가 파괴됩니까?

  17. 17

    내 UIView가 흰색 직사각형으로 그려지는 이유는 무엇입니까?

  18. 18

    텍스트 영역이 입력 유형 = 텍스트로 대체 될 때 코딩 된 메시지를 쓰고 디코딩하는 프로그램이 글리치됩니다.

  19. 19

    R 대신 텍스트의 사각형으로 플롯을 그립니다

  20. 20

    OpenGL에서 서로 다른 색상의 사각형으로 사각형 그리기

  21. 21

    glutBitmapCharacter ()를 사용하여 OpenGL 프로그램을 닫는 텍스트 그리기

  22. 22

    graphviz 테이블에서 녹색 배경에 흰색 텍스트를 얻으려면 어떻게합니까?

  23. 23

    Spring Boot에서 스케줄러를 실행하면 Spring Boot 애플리케이션 컨텍스트 외부의 프로세스가 생성됩니다.

  24. 24

    사각형에 텍스트를 자동으로 맞추는 방법. 텍스트를 클릭하면 직사각형이 나타나야합니다.

  25. 25

    OpenGL OpenTK-깊이 버퍼를 그릴 때 흰색 화면

  26. 26

    페이지로드를 흰색 배경 대신 검은 색으로 설정 하시겠습니까?

  27. 27

    관리자 로그인 페이지의 Magento 흰색 화면?

  28. 28

    문자 대신 흰개미가 사각형으로 표시됨 (아치 리눅스)

  29. 29

    Puppeteer의 픽셀 색상을 가로 질러 스크린 샷 이미지를 생성하고 직사각형을 그리고 파일에 저장하는 방법

뜨겁다태그

보관