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

Версия 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
@Dahaka, спасибо!
Как-нибудь попробую разобраться в этом, но я нашёл причину зависания! )))
Я случайно TextureUtil.uploadTextureImage() запихнул в цикл...
Сейчас всё летает! Ура!
Но у меня комп более менее мощный... Если у других будет тормозить, займусь оптимизацией )
 
4,045
63
645
@Dahaka, а можешь уточнить? Я правильно делаю?
Java:
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalformat, size, size , 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buf);
Не понял, что такое internalformat, а так же ещё один формат и тип в предпоследних аргументах. Что туда писать?
И как это всё теперь связать с id?
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Вот это видел? glTexImage2D - OpenGL 4 Reference Pages
internalformat - это в каком формате текстура будет храниться в OpenGL. Если нужна прозрачность - ставь RGBA, если же нет - RGB.
И как это всё теперь связать с id?
Оно применяется к активной текстуре, то есть ты перед вызовом делаешь GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID); и glTexImage2D будет применен к textureID.
 
2,505
81
397
Я правильно делаю?
Смотря где ты это делаешь. Эта функция выделяет для забинженой текстуры область памяти в видеопамяти и загружает твой буфер. Для изменения области нужно использовать glTexSubImage2D. internal - это формат пикселя в видеопамяти. А два предпоследних аргумента - формат пикселей в твоем буфере.
 
2,505
81
397
Вообще, желательно выделять память под текстуру размеров ближайшей степени двойки. Выделять память через glTexImage2D, передавая нулл вместо буфера. А затем аплоадить нужный регион через glTexSubImage2D.
Почему лучше выделять память под степень двойки, можно погуглить. Но вполне вероятно, что драйвер делает это сам.
Угу, понятно...
То есть, если я изменяю текстуру, я снова вызываю glBindTexture и потом glTexSubImage2D.
Да
 
4,045
63
645
Так! Ишо раз... Ты меня запутать хочешь...
Получается, что я действую так?
Java:
glBindTexture()
glTexImage2D(null) //кстати, он его не принимает, выдаёт ошибку. Или надо так (IntBuffer)null?
glTexSubImage2D(мойБуфер)

Серьёзно? Или я не понял?
Мипмапа мне не нужна.

И ещё глупый вопрос, а что в IntBuffer нельзя положить значение на конкретное место? Нужно сперва массив создавать, а потом грузить его в буфер?
А всё, вопрос снят...
 
Последнее редактирование:
4,045
63
645
Не. Что-то я делаю не так.
Гружу буфер, но текстура всё время белая...
Что-то где-то не проходит.
Java:
//Это делаю при выделении памяти.
textureId = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, size, size, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (IntBuffer)null);

//Это при изменении текстуры
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, size, size, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buf);

//Ну и сам бинд каждый кадр
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
 
1,038
57
229
А чем выводишь на экран?
 
4,045
63
645
Так через Tessellator.
Дело не в том. Когда я использовал BufferedImage и грузил всё через TextureUtil.uploadTextureImage(), всё работало. Но вот решил переделать, как посоветовал @Dahaka.
Думаю, так меньше грузить будет... Да и перспектива заменять только часть изображения радует.
Но что-то пошло не так.
 

CumingSoon

Местный стендапер
1,634
12
269
Так вот, так как у тебя инт буфер, то и каждый пиксель хранит RGBA. Просто потому что инт это 4 байта. Поэтому укажи GL_RGBA как формат. Попробуй также указать все текстурные параметры типа фильтрации. (MIN/MAX_FILTER). flip нужен обязательно, что откинуть позицию буфера на ноль, для чтения.
 
Последнее редактирование:
4,045
63
645
Попробую. Но на флип он ругается, потому что после его использования возвращается обычный Buffer и glTexImage2D его не принимает. Как его обратно в Int преобразовать? Может проще самостоятельно позицию указать? Хотя это тоже пробовал... Думаю, что дело в формате всё-таки.
 
Последнее редактирование:

CumingSoon

Местный стендапер
1,634
12
269
А ещё важно то, как ты буфер создаёшь. Через 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);
 
Сверху