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);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalformat, size, size , 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buf);
internalformat
, а так же ещё один формат и тип в предпоследних аргументах. Что туда писать?Оно применяется к активной текстуре, то есть ты перед вызовом делаешьИ как это всё теперь связать с id?
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
и glTexImage2D будет применен к textureID.Смотря где ты это делаешь. Эта функция выделяет для забинженой текстуры область памяти в видеопамяти и загружает твой буфер. Для изменения области нужно использовать glTexSubImage2D. internal - это формат пикселя в видеопамяти. А два предпоследних аргумента - формат пикселей в твоем буфере.Я правильно делаю?
glBindTexture
и потом glTexSubImage2D
.ДаУгу, понятно...
То есть, если я изменяю текстуру, я снова вызываюglBindTexture
и потомglTexSubImage2D
.
Только ради мипмапа?желательно выделять память под текстуру размеров ближайшей степени двойки
glBindTexture()
glTexImage2D(null) //кстати, он его не принимает, выдаёт ошибку. Или надо так (IntBuffer)null?
glTexSubImage2D(мойБуфер)
//Это делаю при выделении памяти.
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);
BufferedImage
и грузил всё через TextureUtil.uploadTextureImage()
, всё работало. Но вот решил переделать, как посоветовал @Dahaka.Buffer
и glTexImage2D
его не принимает. Как его обратно в Int преобразовать? Может проще самостоятельно позицию указать? Хотя это тоже пробовал... Думаю, что дело в формате всё-таки.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);