Процедурная текстура и её бинд.

Версия Minecraft
1.12.2
Решение
А ещё важно то, как ты буфер создаёшь. Через BufferUtils? Кстати, я тут код накатал примерный
Код:
IntBuffer buf = BufferUtils.createIntBuffer(width * height);
for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
        buf.put(pixels[y * width + x]); // RGBA
        // как хочешь, здесь ты пиксели как угодно можешь получить

buf.flip();

int textureID = glGenTextures();
glBindTexture(GL_TEXTURE_2D, textureID);
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_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);
4,045
63
645
К теме это конечно не совсем относится, но если рассмотреть твой экран монитора как динамическую текстуру... то мы приходим к тому, что, динамическая текстура - это всего лишь набор статических, которые принимают ту или иную форму.
Ок... Не понял к чему ты это...
В общем, буду пользовать BufferedImage. Вроде норм работает.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Если ты реально каждый кадр создаёшь новую текстуру и загружаешь, то ты через 5-10 минут забьешь всю видеопамять)0
Это нужно делать единожды, либо при изменении bufferedimage. А айдишник вообще один раз сгенерировал и все.
 
4,045
63
645
Итого (№2): Айдиху можно создавать один раз. Сам буфер, естественно, тоже.
А вот TextureUtil.uploadTextureImage() нужно запускать при каждом изменении текстуры.
Может кому пригодится )))
...
Ну а при изменении размера, думаю, просто сам буфер буду пересоздавать.
...
Всем спасибо )
 
1,038
57
229
Не понял к чему ты это...
К тому что, всё что ты видишь, всего лишь набор трансформированных статических текстур.
Форум ли это в браузере, minecraft или просто изображение с веб-камеры.
Всё что ты видишь можно свести к набору цветных точек, красных, белых, синих, любых.
И всё это одна, большая искусная иллюзия. И когда CryEngine наконец улучшить свой voxel render (до той степени когда каждой точке на экране будет соответствовать 1 куб), мы будем оперировать лишь цветными блоками.
 
1,038
57
229
Обрати внимание на 4:55
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Итого (№2): Айдиху можно создавать один раз. Сам буфер, естественно, тоже.
А вот TextureUtil.uploadTextureImage() нужно запускать при каждом изменении текстуры.
Может кому пригодится )))
...
Ну а при изменении размера, думаю, просто сам буфер буду пересоздавать.
...
Всем спасибо )
Я об этом и говорил)
 
1,038
57
229
не знаю как он правильно называется Sparse Voxel Octree — Википедия
суть примерно в том, что берется модель и по ней просчитывается это дерево. В итоге мы имеем масштабируемую "кубизну" и мы можем переключаться на уровень выше или ниже (относительно максимального просчета). А так как это просто цветные кубы (модель в них превращается), то это не требует каких то особых вычислений на видеокарте (вроде натянуть текстуру на полигон, при этом расчитывается как точки на текстуре будут отображены в новом для неё пространстве - плоскости, в том числе искаженном).
 
4,045
63
645
Кстати, доп.вопрос:
При создании текстуры BufferedImage просит указать imageType, например BufferedImage.TYPE_BYTE_GRAY.
Лично мне нужна тупо маска... То есть ч/б текстура... Реально ли задавать цвет не в формате 0xffffff, а чисто через яркость, типа 0xff?
Это зависит от imageType или в любом случае нужно RGB указывать?
 
7,099
324
1,510
@Liahim а где тебе потом использовать сгенерированную текстуру?
 
2,505
81
397
Не используй BufferedImage.
Создай простой direct IntBuffer (BufferUtils.createIntBuffer) нужного размера (width * height). И пиши в него свой пиксели.
Создай один раз handle (id) тектуры.
Выдели память glTexImage2D (передай туда созданный ранее буфер).
Если хочешь перезагрузить все текстуру полностью, то делаешь glTexSubImage2D. Оно не выделяет новый участок в видеопамяти, а загружает в существующий.
При изменении какого-то участка, чтобы не перезагружать текстуру полностью делаешь что-то типа:
Java:
glPixelStorei(GL_UNPACK_ROW_LENGTH, texWidth)
buf.position(y * texWidth + x)
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, buf)
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)
Если размер текстуры меняется, то создаешь новый директ буфер и выделяешь новый участок в видеопамяти заново. Создавать новый texture handle не нужно.
 
Последнее редактирование:
7,099
324
1,510
Сверху