конвертировать текстурный код OpenGL 1 в OpenGL 3 - PullRequest
3 голосов
/ 21 декабря 2011

Простой вопрос: Как работает этот кусок кода

glBindTexture(GL_TEXTURE_2D, texture_);
glColor4f(1,1,1,1);
glBegin(GL_QUADS);
  glTexCoord2f(0, 1);  glVertex2f(left_, top_);
  glTexCoord2f(1, 1);  glVertex2f(right_, top_);
  glTexCoord2f(1, 0);  glVertex2f(right_, bottom_);
  glTexCoord2f(0, 0);  glVertex2f(left_, bottom_);
glEnd();

переводить в современный код OpenGL с массивами вершин?

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Если вы просто хотите перенести эти строки в массивы вершин, это просто:

static const float texCoords[8] = { 
    0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f };
float vertices[8] = { 
    left_, top_, right_, top_, right_, bottom_, left_, bottom_ };

glBindTexture(GL_TEXTURE_2D, texture_);
glColor4f(1,1,1,1);

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableCLientState(GL_VERTEX_ARRAY);

Однако это не имеет ничего общего с современным OpenGL , на самом деле этоКод полностью действительный код OpenGL 1.1.Современный OpenGL - это не только массивы вершин, а не непосредственный режим.Кроме того, речь идет о хранении данных вершин в объектах буфера вершин (VBO) и выполнении всех вычислений (таких как преобразование, освещение, текстурирование, ...) с помощью шейдеров вместо старого конвейера с фиксированными функциями.Так что действительно перенести это на современный OpenGL на самом деле не такой простой вопрос.

Поскольку ваш вопрос говорит о том, что вы не знаете обо всем этом, объяснять здесь не имеет особого смысла, так какне просто сводится к 5-10 строкам кода, которые вам нужны только для строк в вопросе.Вам лучше обратиться к серьезному учебному ресурсу по современному OpenGL, если вы этого хотите.

Если все, что вы хотите сделать, это использовать массивы вершин вместо непосредственного режима, то приведенного выше кода должно быть достаточнохотя в этом примере, я думаю, он ничего не купит.

0 голосов
/ 22 декабря 2011

BindTexture останется ... но остальное.

1 в методе init создайте VBO для вершин. Эти вершины должны быть:

float verts[4*(2+3)] = { 0, 1, left_,  top_,    0,
                         1, 1, right_, top_,    0,
                         1, 0, right_, bottom_, 0,
                         0, 1, left_,  bottom_, 0 };

2 копии вершин в GPU (glBufferData)

3 используйте glVertexAttribPointer для настройки данных буфера с помощью атрибутов

4 массива рисования

например

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glBindBuffer(GL_ARRAY_BUFFER, bufID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5, sizeof(float)*2);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float)*5, 0);
glDrawArrays with Triangle_strip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...