簡體   English   中英

啟用深度測試時的二維文本工件 Opengl

[英]2d text artifact when depth test is enable Opengl

主文件

//Variables
const unsigned int width = 896, height = 504;

//Initiating GLFW Window
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

//Creating a GLFW window
window = glfwCreateWindow(width, height, "Jaguar", NULL, NULL);

//Checking if Window was initiated
if (window == NULL) {
    std::cout << "GLFW FAILED TO INITIATE WINDOW!\n";
    glfwTerminate();
}

glfwMakeContextCurrent(window);

//Centering Window 
int windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, mode->width / 2 - windowWidth / 2, mode->height / 2 - windowHeight / 2);

//Setting-Up window's icon
GLFWimage icon[1];
icon[0].pixels = stbi_load("resources/images/gui/icon/icon.png", &icon[0].width, &icon[0].height, 0, 4);
glfwSetWindowIcon(window, 1, icon);
stbi_image_free(icon[0].pixels);

//Checking if Glad was initiated
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    std::cout << "GLAD FAILED TO BE INITIATED\n";
}

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

stbi_set_flip_vertically_on_load(true);

//Setting-Up Viewport
glViewport(0, 0, width, height);

//Intitiating MainMenu
states.push(new MainMenuState(*window, &states));

字體.cpp

FT_Library ft;

if (FT_Init_FreeType(&ft)) {
    std::cout << "FREETYPE::Failed to initialize library\n";
}
FT_Face face;
if (FT_New_Face(ft, filePath, 0, &face)) {
    std::cout << "FREETYPE::Failed to load to font: " << filePath << "\n";
}

// set size to load glyphs as
FT_Set_Pixel_Sizes(face, 0, px);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

for (unsigned char c = 0; c < 128; c++) {

    if (FT_Load_Char(face, c, FT_LOAD_RENDER)) {
        std::cout << "FREETYPE::Failed to load glpyh\n";
    }
    unsigned int texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width,
        face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE,
        face->glyph->bitmap.buffer);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    Character character = {
    texture,
    glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
    glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top)
    ,face->glyph->advance.x };

    Characters.insert(std::pair<char, Character>(c, character));
}
FT_Done_Face(face);
FT_Done_FreeType(ft);

文本.cpp

// activate corresponding render state  
shader.use();
glUniform3f(glGetUniformLocation(shader.id, "textColor"), color.x, color.y, 
color.z);
glActiveTexture(GL_TEXTURE0);
glBindVertexArray(VAO);

// iterate through all characters
std::string::const_iterator c;
for (c = string.begin(); c != string.end(); c++)
{
   
    Character ch = font.Characters[*c];
   
    float xpos = position.x + ch.bearing.x * scale;
    float ypos = position.y - (ch.size.y - ch.bearing.y) * scale;

    float w = ch.size.x * scale;
    float h = ch.size.y * scale;
    // update VBO for each character
    float vertices[6][4] = {
        { xpos,     ypos + h,   0.0f, 0.0f },
        { xpos,     ypos,       0.0f, 1.0f },
        { xpos + w, ypos,       1.0f, 1.0f },

        { xpos,     ypos + h,   0.0f, 0.0f },
        { xpos + w, ypos,       1.0f, 1.0f },
        { xpos + w, ypos + h,   1.0f, 0.0f }
    };
    // render glyph texture over quad
    glBindTexture(GL_TEXTURE_2D, ch.textureId);
    // update content of VBO memory
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    // render quad
    glDrawArrays(GL_TRIANGLES, 0, 6);
    // now advance cursors for next glyph (note that advance is number of 
1/64 pixels)
    position.x += (ch.advance >> 6) * scale; // bitshift by 6 to get value in 
pixels (2^6 = 64)
}
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);

我已經做過的事情:

上次使用的渲染文本 gl_src_alpha, gl_one_minus_src_alpha

當我禁用深度測試時,它工作得很好,我只是在需要時啟用和禁用嗎? 如果是這樣,在性能方面有多差/多好(游戲流暢度)

我已經對此進行了一些研究,人們說啟用 alpha 混合他們的意思是 gl_src_alpha,gl_one_minus_src_alpha

當您使用混合時,您必須禁用深度測試 繪制幾何圖形時啟用深度測試,但在繪制文本之前禁用深度測試。 深度測試導致根據深度 function 丟棄片段。 混合從片段着色器獲取片段顏色輸出,並將它們與顏色緩沖區中的 colors 組合。 因此,混合僅適用於那些未被丟棄的片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM