1

我的想法和要求是允许在程序执行期间最多创建“n”个缓冲区(其中 n<7)。因此,理想情况下,我正在寻找一种方法,在这种方法中,我可以将不同的东西绘制到不同的缓冲区,并在需要时渲染每个缓冲区。

喜欢:

Buffer1 - 画一个矩形

Buffer2 - 绘制一些纹理(字体/文本)“欢迎”

Buffer3 - 绘制一些多边形

Buffer4 - 绘制一些纹理(字体/文本)“堆栈溢出支持者”

... 等等。

同时,我想将不同的东西写入不同的缓冲区。然后我可能只想渲染 Buffer2 的内容,然后在一段时间后刷新显示并渲染 Buffer4。

我不工作的代码:

GLuint VB1;
glGenBuffers(1, &VB1);
glUseProgram(ProgramObject);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
DrawRect(VB1);

GLuint VB2;
glGenBuffers(1, &VB2);
glUseProgram(ProgramObject);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
TextDraw(VB1, "Welcome");

eglSwapBuffers(egldisplay, eglsurface);

当我说 eglSwapBuffer 时,这会渲染 VB1 和 VB2 的所有内容。我怎样才能只渲染一个缓冲区。

我在做

glBindBuffer(GL_ARRAY_BUFFER, VB)

在 DrawRect() 和 TextDraw() 定义中,我认为不应该这样做。

需要帮助来确定如何分别写入每个缓冲区以及如何在显示器上绑定所需的缓冲区内容。(需要的时候)。

DrawRect 实现

void DrawRect(GLint VB)
{
int position_loc = glGetAttribLocation(ProgramObject, "vertex");
GLfloat Vertices[4][4] = {
              -1.0f,  1.0f, 0.0f, 1.0f,
               1.0f,  1.0f, 0.0f, 1.0f,
              -1.0f,  -1.0f, 0.0f, 1.0f,
               1.0f,  -1.0f, 0.0f, 1.0f
        };
GLfloat red[4] = {1, 0, 1, 1};
glUniform4fv(glGetUniformLocation(ProgramObject, "color"), 1, red);
glEnableVertexAttribArray(position_loc);
printf("\nAfter Enable Vertex Attrib Array");
glBindBuffer(GL_ARRAY_BUFFER, VB);
glVertexAttribPointer(position_loc, 4, GL_FLOAT, GL_FALSE, 0, 0);
glBufferData(GL_ARRAY_BUFFER, sizeof Vertices, Vertices, GL_DYNAMIC_DRAW);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}



void TextDraw(GLuint VB, std::string message, GLfloat x, GLfloat y, GLfloat sx, GLfloat sy)

{
int vPosition = glGetAttribLocation(ProgramObject, "vertex");
std::string::const_iterator ch;
for (ch = message.begin(); ch != message.end(); ch++)
{
    const char c = *ch;
    if (FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_COLOR))
    {
        std::cout << "ERROR::FREETYTPE: Failed to load Glyph" << std::endl;
        continue;
    }

GLfloat xpos = x + (face->glyph->bitmap_left) * sx;
    GLfloat ypos = -y - (face->glyph->bitmap_top) * sy;
    GLfloat w = (face->glyph->bitmap.width) * sx;
    GLfloat h = (face->glyph->bitmap.rows) * sy;

    GLfloat vertices[4][4] = {
    {xpos,     -ypos    , 0, 0},
    {xpos + w, -ypos    , 1, 0},
    {xpos,     -ypos - h, 0, 1},
    {xpos + w, -ypos - h, 1, 1},
    };

    glActiveTexture(GL_TEXTURE0);
    GLuint text;
    glGenTextures(1, &text);
    glBindTexture(GL_TEXTURE_2D, text);
    glUniform1i(glGetUniformLocation(ProgramObject, "text"), 0);
    PrintGlError();
    GLfloat black[4] = {0, 0, 0, 1};
    glUniform4fv(glGetUniformLocation(ProgramObject, "color"), 1, black);
    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);
    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_ALPHA,
        face->glyph->bitmap.width,
        face->glyph->bitmap.rows,
        0,
        GL_ALPHA,
        GL_UNSIGNED_BYTE,
        face->glyph->bitmap.buffer
    );
    glBufferData(GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_DYNAMIC_DRAW);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    x += (face->glyph->advance.x/64) * sx;
    y += (face->glyph->advance.y/64) * sy;
    glDeleteTextures(1, &text);
    glDisableVertexAttribArray(vPosition);
}

}
4

0 回答 0