2016-02-20 3 views
0

У меня есть простая сетка 16 x 16, к которой я применяю одну текстуру. Файл текстуры разделен на четыре части - каждый цвет другой. По умолчанию каждый квадрат окрашен в зеленый цвет (верхняя левая часть файла). Если вы нажмете квадрат, примените красную часть (верхнюю правую часть файла). Теперь я хочу, чтобы квадрат полностью исчез при нажатии. Я предполагаю, что могу использовать прозрачную текстуру, но я надеялся, что мне не придется этого делать, чтобы не загружать/перезагружать два разных файла текстур.Как я могу применить текстуру к части модели?

Вот код, я использую, чтобы обновить текстуры VBO:

//I don't bother offsetting my changes. I simply update the 'UVs' 
    //array and then copy the entire thing to the floatbuffer. 
    public void updateTexture(int offset) 
    { 

     //populate the texture buffer 
     //fbtex is a floatbuffer (16x16x8 in size). UVs is an array, same size. 
     fbtex.put(UVs); 
     fbtex.rewind(); 

     glBindBuffer(GL_ARRAY_BUFFER, vboHandles.get(TEXTURE_IDX)); //the texture data 
     glBufferSubData(GL_ARRAY_BUFFER, offset, fbtex); 
     fbtex.clear(); //don't need this anymore 
    } 

ВБО будет содержать до 256 экземпляров моих коллег-ords для Грин:

public float[] UV_0 = { 0.02f,0.02f, 
         0.02f,0.24f, 
         0.24f,0.24f, 
         0.24f,0.02f}; 

или меньше, если включает в себя несколько моих кодов для красных:

public float[] UV_1 = { 0.24f,0.02f, 
         0.48f,0.02f, 
         0.48f,0.24f, 
         0.24f,0.24f}; 

Есть ли что-нибудь, что я могу сделать для данных VBO, чтобы нарисовать раздел невидимый? Таким образом, объекты в фоновом режиме можно увидеть, например?

ответ

2

Вы можете просто не отображать части VBO. Обычно вы рисуете все данные с чем-то вроде

glDrawArrays(GL_TRIANGLES, 0, numElements); 

glDrawArrays принимает first и count параметр, который вы можете использовать, чтобы сделать только часть VBO. Поэтому, если вы не хотите отображать некоторые данные, вы должны отображать все данные до и после этих данных в двух вызовах рисования.

1

Если вы создаете текстуру формата RGBA, а не RGB, просто сделайте одну часть в прозрачной текстуре. (Alpha/opacity zero.) Тогда вам просто нужно обновить координату текстуры VBO с помощью коордов для прозрачного квадрата, как и любой другой.

Или, если цвета плоские без градиентов или рисунков, просто одно значение RGB для каждого квадрата сетки, зачем вообще использовать текстуру? Измените буфер «UV» в буфер «RGBA» и просто установите цвет в каждой вершине на красный/зеленый/прозрачный.

+0

Причина использования текстур заключается в том, что я хотел иметь зеленый цвет, но с некоторыми деталями до затенения и т. Д. Но, конечно, для окраски неба или воды я буду использовать RGBA - спасибо за напоминание! Мне нужен лучший графический редактор, который позволит включать прозрачные разделы в мои текстуры. В конечном итоге они мне понадобятся. Однако для этого решения то, что я действительно искал, было способом избежать создания невидимых вершин. Мое решение немного отличается от того, что предложил javac в том, что я использую glDrawElements - поэтому я просто пропускаю те элементы, которые мне не нужны. –

Смежные вопросы