Шейдеры\VAO\VBO

Версия Minecraft
1.7.10
250
12
24
\\Такое дерьмовое чувство когда все работает, но не в майнкрафте. Конеееечно зачем работать так как вездеее. Дааа, давайте все перепилим чтоб черт ногу сломил. АГА.
Сделал я чистый проект OGL&LWGJL ну чтоб лучше понимать его и наконец научиться им пользоваться.
Так вот, попробовал я значит простую штуку. Отрисовать на экране прямоугольник и закрасить его градиентом через фрагментный шейдер. Да у меня это получилось в ЧИСТОМ проекте, конечно не с первого раза(да и не без помощи гугла и ютуба(ну а как еще в наше время изучать что-то новое))
Решил я сделать то-же самое в майнкрафте, конечно не получилось.
Сделал вот что:
-В рендере худа добавил рендер картинки.
-Рендерил вот так:
Код:
..
prepare();
 shader.start();
 render(model);
 shader.stop();
..


 public void prepare(){
 GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
 GL11.glClearColor(1, 0, 0, 1);
 }
 
 public void render(RawModel model){
 GL30.glBindVertexArray(model.getVaoID());
 GL20.glEnableVertexAttribArray(0);
 GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
 GL20.glDisableVertexAttribArray(0);
 GL30.glBindVertexArray(0);
}
shader.start() и shader.stop просто включение и выключение программы.
Краш такой:
Код:
[21:46:20] [Client thread/ERROR] [FML]: Exception caught during firing event net.minecraftforge.client.event.RenderGameOverlayEvent$Pre@79684d08:
org.lwjgl.opengl.OpenGLException: Cannot use offsets when Element Array Buffer Object is disabled
at org.lwjgl.opengl.GLChecks.ensureElementVBOenabled(GLChecks.java:105) ~[lwjgl-2.9.1.jar:?]
at org.lwjgl.opengl.GL11.glDrawElements(GL11.java:1117) ~[lwjgl-2.9.1.jar:?]
at rinkirin.GUI.PlayerHUD.render(PlayerHUD.java:83) ~[PlayerHUD.class:?]
at rinkirin.GUI.PlayerHUD.onRenderHud(PlayerHUD.java:71) ~[PlayerHUD.class:?]
at cpw.mods.fml.common.eventhandler.ASMEventHandler_15_PlayerHUD_onRenderHud_RenderGameOverlayEvent.invoke(.dynamic) ~[?:?]
at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54) ~[ASMEventHandler.class:?]
at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:140) [EventBus.class:?]
at net.minecraftforge.client.GuiIngameForge.pre(GuiIngameForge.java:901) [GuiIngameForge.class:?]
at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:105) [GuiIngameForge.class:?]
at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1114) [EntityRenderer.class:?]
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1067) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:962) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:164) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_101]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source) [start/:?]
at GradleStart.main(Unknown Source) [start/:?]
[21:46:20] [Client thread/ERROR] [FML]: Index: 1 Listeners:
[21:46:20] [Client thread/ERROR] [FML]: 0: NORMAL
[21:46:20] [Client thread/ERROR] [FML]: 1: ASM: rinkirin.GUI.PlayerHUD@416faf16 onRenderHud(Lnet/minecraftforge/client/event/RenderGameOverlayEvent;)V
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000001d6bf782, pid=1140, tid=0x00000000000032e8
#
# JRE version: Java(TM) SE Runtime Environment (8.0_101-b13) (build 1.8.0_101-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  0x000000001d6bf782
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\..\eclipse\hs_err_pid1140.log
[21:46:21] [Server thread/INFO]: Stopping server
[21:46:21] [Server thread/INFO]: Saving players
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
AL lib: (EE) alc_cleanup: 1 device not closed
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
 
Код:
int vaoID = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vaoID);

 int vboID = GL15.glGenBuffers();
 GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
 IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
 buffer.put(data);
buffer.flip();
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);

 int vboID = GL15.glGenBuffers();
 GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
 FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
 buffer.put(data);
buffer.flip();
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(attributeNumber,coordinateSize,GL11.GL_FLOAT,false,0,0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

Ну по типо токого.
PS. Код не мой целиком и полностью. Я пытаюсь его осмыслить. Да только частично выходит.
 
Таак, я решил переделать(немного разобрался и написал сам в основном)
Код:
 public static VAO setupQuad() {      
 int vertexCount = 0;
 int vaoId = 0;
 int vboId = 0;
        float[] vertices = {

                -0.5f, 0.5f, 0f,
                -0.5f, -0.5f, 0f,
                0.5f, -0.5f, 0f,

                0.5f, -0.5f, 0f,
                0.5f, 0.5f, 0f,
                -0.5f, 0.5f, 0f
        };

        FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(vertices.length);
        verticesBuffer.put(vertices);
        verticesBuffer.flip();
         
        vertexCount = 6;
         

        vaoId = GL30.glGenVertexArrays();
        GL30.glBindVertexArray(vaoId);
         

        vboId = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer, GL15.GL_STATIC_DRAW);
        GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL30.glBindVertexArray(0);
        return new VAO(vaoId,vboId,vertexCount);
    }
Вот так генерирую и заполняю обьекты.
Сам класс VAO просто хранит три переменные которые в конструкторе указаны.
Вот так рисую
Код:
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        GL30.glBindVertexArray(vao.getVaoID());
        GL20.glEnableVertexAttribArray(0);

        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vao.getVertexCount());

        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
И знаете что? Правильно. Ничего.
Ошибка на этой строке
Код:
       GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vao.getVertexCount());


Кстати. Это опять же работает в чистом проекте.
 
RinKirin написал(а):
А почему это работает в чистом проекте?

Другая\non-debug версия LWJGL (и нужных проверок нет), возможно, драйвер фиксит за тебя косяки.

Ошибка, насколько я понимаю, в строке, где ты анбиндишь VBO с вершинами там, где этого делать не стоит:
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
Это нужно делать только _после_ того как ты заанбиндишь свой VAO, потому что тот сохраняет состояние GL_ARRAY_BUFFER. 
Соответственно, при отрисовке OGL будет пытаться рисовать с отключенным GL_ARRAY_BUFFER, что ни к чему хорошему не приведет.
 
Ок, я сделал анбинд вбо только после анбинда вао.
Код:
        vboId = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer, GL15.GL_STATIC_DRAW);
        GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
        GL30.glBindVertexArray(0);
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);


Я брейкпоинты ставил вылетает краш только при отрисовке массива


Попробовал закоментить рисование массива, получил спам в консоль.
Код:
[09:37:33] [Client thread/ERROR]: ########## GL ERROR ##########
[09:37:33] [Client thread/ERROR]: @ Post render
[09:37:33] [Client thread/ERROR]: 1282: Invalid operation
Как я проверил он не каждый раз вылетает. А только тогда когда пройдет 9-10 раз по этому
Код:
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
 
Попробуй переместить инициализацию в эвент рендера. Т.е.:
Код:
@SubscribeEvent(priority = EventPriority.NORMAL)
 public void onRenderHud(RenderGameOverlayEvent event)
 {

       if(vao == null){
          vao = createQuad();
       }
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        GL30.glBindVertexArray(vao.getVaoID());
        GL20.glEnableVertexAttribArray(0);

        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vao.getVertexCount());

        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);            
      
 }
 
Прогресс! Теперь оно не крашит. Понял ошибку(тут скорее не ошибка, а особенность. Ну да главное понял и запомнил)
Но оно все так же не рендерит.
Вот такой вопрос. 
Окно майнкрафта воспринимается так:
(-1, 1)(0,-1)(1, 1)
(-1, 0)(0, 0)(1, 0)
(-1,-1)(0,-1)(1,-1)
?
И если нет то как?
Других вариантов у меня нет почему оно может не рисоваться по коорданатам:
Код:
        float[] vertices = {

                -0.5f, 0.5f, 0f,
                -0.5f, -0.5f, 0f,
                0.5f, -0.5f, 0f,

                0.5f, -0.5f, 0f,
                0.5f, 0.5f, 0f,
                -0.5f, 0.5f, 0f
        };
 
Назад
Сверху