2013-11-26 5 views
1

ОК, поэтому я создал библиотеку, которая обрабатывает основной рендеринг OpenGL. Он содержит три буфера, один для вершин, uv и нормалей. В основной функции рендеринга используется привязка буферов, включение атрибутов вершин, а затем вызов glDrawArrays(). Но я столкнулся с непредвиденной проблемой, которая является более основанной на инженерии основанной на коде, которая заключается в том, что я могу привязывать только одну текстуру за раз. Таким образом, все вершины будут иметь одинаковые текстуры, когда я их нарисую. Как я могу обойти это? Если вам нужен какой-то другой источник, я отправлю его.OpenGL Texture Загрузка Predicament

Главная Рендер Номер функции

glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER,this->_VBO); 
glEnableVertexAttribArray(1); 
glBindBuffer(GL_ARRAY_BUFFER,this->_TBO); 
glEnableVertexAttribArray(2); 
glBindBuffer(GL_ARRAY_BUFFER,this->_NBO); 

glDrawArrays(GL_TRIANGLES,0,this->polyCount); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
glDisableVertexAttribArray(2); 

Буферы:

//Designated Vertex Buffer 
    std::array<GLfloat,BUFFER_SIZE> BUFFER_1; 
    UINT bufferIndex1; 

    //Designated Normal Buffers 
    std::array<GLfloat,BUFFER_SIZE> BUFFER_2; 
    UINT bufferIndex2; 

    //Designated UV Buffer 
    std::array<GLfloat,BUFFER_SIZE> BUFFER_3; 
    UINT bufferIndex3; 
+0

Вы можете связать столько же текстур 'GL_MAX_TEXTURE_UNITS' сразу. Однако, да - состояние не может быть изменено в течение одного вызова ничьей (и это вся идея, что такое «пакет»). Либо возьмите, например. (или любой другой атрибут) в качестве индекса текстуры и вынимать одну текстуру из многих на основе (может быть медленной, в зависимости от фактических данных) или разделить ее на отдельные призывы рисования. – keltar

ответ

0

Что мы обычно делаем здесь разбить сетку вверх на суб-сетках, под "материалом". Объект с другой текстурой - это технически другой материал, поэтому вы должны визуализировать его отдельно. You может сделать одну сетку, используя несколько текстур, используя что-то, называемое Атласом. То есть вы упаковываете свои текстуры в одно растровое изображение и выбираете координаты текстуры в этом растровом изображении в зависимости от текстуры, которую хотите использовать.

+0

Итак, в основном, все мои текстуры/ресурсы помещаются в один большой файл? Это кажется хорошей идеей, однако файл должен быть довольно большим в зависимости от всех текстур, которые мне нужно будет вставить в него. Является ли рендеринг всех моих вершинных данных за один раз нормально или более эффективно вызывать glBufferSubData() для установки буфера для каждого вызова розыгрыша? –

+0

Это зависит от количества переменных, когда дело доходит до производительности. Например, если вы рендерите несколько тысяч объектов, каждый с другой текстурой, эти вызовы в драйвер на каждом кадре начинают складываться. Поэтому вы можете подумать о стратегии оптимизации для этого. Если у вас много разных шейдеров, вы можете отсортировать свои объекты с помощью шейдеров, чтобы свести к минимуму изменения состояния и т. Д. Попробуйте разные вещи и профиль. – Robinson