Рисование к нескольким буферам одновременно и отображение каждого буфера индивидуально для отображения

Моя идея и требование — разрешить создание не более n буферов (где n<7) во время выполнения программы.
Поэтому в идеале я ищу способ, при котором я могу рисовать разные вещи в разных буферах и отображать каждый буфер по мере необходимости.

Подобно:

Buffer1 — Нарисуйте прямоугольник

Buffer2 — нарисуйте текстуру (шрифт / текст) «Welcome»

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

Это делает все VB1 и VB2 оба, когда я говорю eglSwapBuffer. Как я могу сделать только один буфер.

я делаю

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

}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector