ничего не рендерит почему?

29
6
Java:
package su.minecraftsp.mod;

import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

import java.nio.FloatBuffer;

public class TestRenderer implements IItemRenderer {
    int vaoId;
    int vboId;
    int vertexCount;

    public TestRenderer() {
        float[] vertices = new float[] {-1, 0, 0, 0, 1, 0, 1, 0, 0};
        FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(vertices.length);
        floatBuffer.put(vertices).flip();
        vaoId = GL30.glGenVertexArrays();
        GL30.glBindVertexArray(vaoId);
        vboId = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, floatBuffer, GL15.GL_STATIC_DRAW);
        GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
        vertexCount = vertices.length / 3;
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL30.glBindVertexArray(0);
    }

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        return true;
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
        return true;
    }

    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        GL30.glBindVertexArray(vaoId);
        GL20.glEnableVertexAttribArray(0);
        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
    }
}
 
29
6
На чистом lwjgl все работает! Я не могу понять почему тут такая шляпа. Я сначала не думал даже, что в майне будет проблематично простой треугольник сделать, начал писать и шейдеры и все дела но тут такой ***. Я уже весь день сижу думаю что я не так делаю???? Я даже дизайн кода не придумываю ибо какой смысл? ВСе равно крашит. Я лучше в одном классе все напишу чтобы понять ошибку НО ОНО ДАЖЕ ТУТ КРАШИТ
 

Вложения

  • Screenshot (2).png
    Screenshot (2).png
    130 KB · Просмотры: 23
2,505
81
397
Попробуй сделать ленивую инициализацию. Сейчас твой TestRenderer создается при загрузке мода, а там, насколько я помню, используется временный gl context.

Еще glEnableVertexAttribArray можно сразу использовать при инициализации VAO. Disable не нужен. Сам VAO только и нужен для того, чтобы не делать glEnableVertexAttribArray и glVertexAttribPointer при каждом draw call.
 
29
6
Теперь другая ошибка... Оно спамит в консоль постоянно а рендер ничего не показывает как будто итем прозрачный

Java:
package su.minecraftsp.mod;

import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;

import java.nio.FloatBuffer;

public class TestRenderer implements IItemRenderer {
    private static volatile TestRenderer INSTANCE;

    int vaoId;
    int vertexCount;

    private TestRenderer() {
        vaoId = GL30.glGenVertexArrays();
        GL30.glBindVertexArray(vaoId);

        float[] vertices = new float[]{-1, 0, 0, 0, 1, 0, 1, 0, 0};
        vertexCount = vertices.length / 3;
        FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(vertices.length);
        floatBuffer.put(vertices).flip();
        int vboId = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, floatBuffer, GL15.GL_STATIC_DRAW);

        GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
        GL20.glEnableVertexAttribArray(0);

        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL30.glBindVertexArray(0);
    }

    public static TestRenderer getInstance() {
        TestRenderer result = INSTANCE;
        if (result == null) {
            synchronized (TestRenderer.class) {
                result = INSTANCE;
                if (result == null) {
                    INSTANCE = result = new TestRenderer();
                }
            }
        }
        return result;
    }

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        return true;
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
        return false;
    }

    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        GL30.glBindVertexArray(vaoId);
        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
        GL30.glBindVertexArray(0);
    }
}
 

Вложения

  • Screenshot (3).png
    Screenshot (3).png
    137.7 KB · Просмотры: 27
29
6
Погуглил про ленивую инициализацию - сделал. ПО идее, все работает (формально), но рендерит оч криво и не всегда показывает сам ренедер модели (пропадает треугольник)

Java:
package su.minecraftsp.mod;

import net.minecraft.item.ItemStack;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.*;

import java.nio.ByteBuffer;
import java.nio.FloatBuffer;

public class TestRenderer implements IItemRenderer {
    private static TestRenderer instance;

    private TestRenderer() {}

    public static TestRenderer getInstance() {
        TestRenderer renderer = null;
        if (instance == null) {
            instance = new TestRenderer();
            instance.load();
            renderer = instance;
        } else {
            renderer = instance;
        }
        return renderer;
    }

    int vaoId;
    int vertexCount;

    private void load() {
        vaoId = GL30.glGenVertexArrays();
        GL30.glBindVertexArray(vaoId);

        float[] vertices = new float[] {-1, 0, 0, 0, 1, 0, 1, 0, 0};
        vertexCount = vertices.length / 3;
        FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(vertices.length);
        floatBuffer.put(vertices).flip();
        int vboId = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, floatBuffer, GL15.GL_STATIC_DRAW);

        GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);

        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL30.glBindVertexArray(0);
    }

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        return true;
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
        return false;
    }

    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        GL30.glBindVertexArray(vaoId);
        GL20.glEnableVertexAttribArray(0);
        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vertexCount);
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
    }
}
 

Вложения

  • Screenshot (4).png
    Screenshot (4).png
    225.6 KB · Просмотры: 23
Сверху