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

Версия 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,046
63
645
@Dahaka, можешь пояснить данный код?
Просто хочу понять геометрическую логику.
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) // опять что-то меняем. Нужно ли в этом месте обнулять позицию буфера и задавать правильный лимит?
 
4,046
63
645
То есть просто грузить кусок и всё?
Ну хотя бы позицию и лимит буфера нужно ведь менять?
...
Опытным путём выяснил, что в первой строке нужно указывать ширину всей текстуры ) Но смысла всё равно не понял.
...
Кстати, как раз таки unpack работает более адекватно. Просто pack даёт смещение.
 
Последнее редактирование:
2,505
81
397
4,046
63
645
Я прям увидел повязку через глаз и деревянную ногу...
Так а что делает GL_UNPACK_ROW_LENGTH?
...
А! Я таки понял! Этим мы сообщаем подразумеваемую длину строки в исходном массиве! ) Потому как GL об этом не знаем...
А если она равны 0, то он считает, что строка равна ширине загружаемого куска.
Ну теперь всё стало ясно )
 
Последнее редактирование:

CumingSoon

Местный стендапер
1,634
12
269
И?.. OGL по порядочку прочтёт буфер в размере нужного им куска
Если что, то мне просто непонятно, зачем тут unpack использовать. По идее, т.к. ты грузишь на сервер(т.е. в ГПУ), то нужно вообще использовать PACK. Однако даже если взять его, то зачем он нужен-то будет?
И да, unpack параметры используются при скачивании данных, а ты их, наоборот, грузишь
 
4,046
63
645
Ок! Допустим. Общая картинка у меня 256х256. Я гружу кусок 16х16 с каким-то смещением. И кусок этот я беру из буфера 64х1024.
Как он прочтёт это, если я не укажу длину строки исходного буфера...
В pack и unpack я ничего не смыслю, поэтому и спросил...
Но без данного метода оно не работает.
 
Сверху