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

Версия 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);
7,099
324
1,509
Процедурной - это какой? Если нужна динамически собираемая текстура - посмотри Draco18s/HarderStuff
 
7,099
324
1,509
Ага, пишешь свою реализацию, потом юзаешь ее при создании квадов или чего там
 
1,038
57
229
TextureManager уже используются динамические текстуры, а ещё

Java:
//... всё это лишь куски кода, но думаю разберешься
//выделение памяти с очисткой
private synchronized void freeFrameBuffer() {
        try {
            if (this.texture != 0) GlStateManager.deleteTexture(this.texture);
            this.texture = 0;
        } catch (Exception e) {
            // Just in case, we make sure we don't crash. Because crashing is bad.
            LoggerUtils.error("Error while cleaning up a world view frame buffer.");
        }
    }

    // This method builds the frame buffer and texture references
    private void allocateFrameBuffer() {
        this.texture = GlStateManager.generateTexture(); //Release via: GlStateManager.deleteTexture(colorTexture);
        GlStateManager.bindTexture(this.texture);
        GlStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
        GlStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, width, height, 0, GL11.GL_RGBA, GL11.GL_INT, null);
        EXTFramebufferObject.glFramebufferTexture2DEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL11.GL_TEXTURE_2D, this.texture, 0);

        EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
}

//рисование на текстуре (в текстуру)
//Set gl options       
            GlStateManager.viewport(0, 0, mc.displayWidth, mc.displayHeight);       
            GlStateManager.bindTexture(0);       
            EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, framebuffer);       
            GlStateManager.clearColor(1.0f, 0.0f, 0.0f, 0.5f);       
            GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT);
 
Последнее редактирование:
4,045
63
645
1,038
57
229
Java:
//int texture...
GlStateManager.bindTexture(this.texture);
 
1,038
57
229
4,045
63
645
Как-то всё сложно, но нашёл, что это можно сделать через TextureUtil.
Вот так:
Java:
int textureId = GL11.glGenTextures();
TextureUtil.uploadTextureImage(textureId, myBufferedImage);
GlStateManager.bindTexture(textureId);

Но возникает ещё вопрос: это нужно делать каждый кадр или id и его присвоение можно сделать один раз, а дальше просто биндить уже готовый номер?

Итог: опытным путём выяснил, что каждый кадр.
 
Последнее редактирование:
1,038
57
229
Поэтому лучше делать шейдером или подготовить атлас метаморфозы
 
4,045
63
645
Ну, можно и им... Наверное, даже лучше... Хотя там делается всё то же самое, но автоматически )
Хотя не понятно, как там текстуру менять... Если мне нужно один пиксель, скажем, изменить. А если размер?
Хм... Не... Чё-т не то.
 
Последнее редактирование:
1,038
57
229
К теме это конечно не совсем относится, но если рассмотреть твой экран монитора как динамическую текстуру... то мы приходим к тому, что, динамическая текстура - это всего лишь набор статических, которые принимают ту или иную форму.
 
Сверху