VBO/Не биндит текстуру

Версия Minecraft
1.7.10
1,173
28
168
Собсна, рендерю модель калака через вбо(ферст пикрелейтед проблемы)
Делаю так:

Java:
public static void render(TexturedModel model) {
        // shader.start();
        prepareTexturedModel(model);

        // shader.loadSkyColour(RED, GREEN, BLUE);
        // shader.loadLight(light);
        // shader.loadViewMatrix(Minecraft.getMinecraft().thePlayer);

        GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0);

        unbindTexturedModel();
        // shader.stop();
    }

    private static void prepareTexturedModel(TexturedModel model) {
        RawModel rawModel = model.getRawModel();
        GL30.glBindVertexArray(rawModel.getVaoID());
        GL20.glEnableVertexAttribArray(0);
        GL20.glEnableVertexAttribArray(1);
        GL20.glEnableVertexAttribArray(2);
        ModelTexture texture = model.getTexture();
        if (texture.isHasTransparency()) {
            disableCulling();
        }

        GL13.glActiveTexture(GL13.GL_TEXTURE0);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getID());
    }

    private static void unbindTexturedModel() {
        enableCulling();
        GL20.glDisableVertexAttribArray(0);
        GL20.glDisableVertexAttribArray(1);
        GL20.glDisableVertexAttribArray(2);
        GL30.glBindVertexArray(0);
    }
Почему то не хочет биндить текстуру
Если убрать

GL13.glActiveTexture(GL13.GL_TEXTURE0);

GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getID());
Рендер вообще исчезает. Айдишник продебажил - texture.getID() выдает 98
Текстура так же грузится
Еще наблюдаю артефакты когда смотрю вниз (пикрелейтед 2)
Краснеет типа
Кто за вбо шарит плез помощь
 

Вложения

  • 1594649663404.png
    1594649663404.png
    138.8 KB · Просмотры: 49
  • 1594649768814.png
    1594649768814.png
    256.2 KB · Просмотры: 47
Решение
Потому что, когда компилишь дисплей лист скорее всего используешь тесселятор, который в свою очередь использует всякие ClientState функции (glEnableClientState, glVertexPointer, glColorPointer, ...). Они и говорят драйверу, откуда взять позицию, текстурную координату и т.п.
С VBO подход немного другой. Ты можешь только сказать какого типа данные лежат по такому-то смещению в буфере и привязать к индексу атрибута, а затем использовать в шейдере, как угодно.

И вообще, без батчинга примитивов нет смысла использовать VBO и шейдеры, если нет жесткой необходимости. Производительность станет только хуже, плюс убьешь возможность использования шейдеров оптифайна.
1,173
28
168
Юзаю только фрагментный шейдер (скрин дропнул) и попытался сделать так

Java:
public static void render(TexturedModel model) {
        shader.start();
        prepareTexturedModel(model);

        
        int location = shader.getUniformLocation("modelTexture");
        GL20.glUniform1i(location, model.getTexture().getID());
        GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
        
        unbindTexturedModel();
         shader.stop();
    }
Калак стал всегда черным, хнык
Текстура все равно не биндится на него
 

Вложения

  • 1594663161779.png
    1594663161779.png
    7.1 KB · Просмотры: 30
1,173
28
168
#version 130

in vec3 in_position;
in vec2 in_textureCoords;

varying vec2 pass_textureCoords;

#if LIGHTING
varying vec4 pass_diffuse;

void pointLight(in int i, in vec3 eye, in vec3 normal, inout vec4 diffuse){
vec3 VP = vec3(gl_LightSource.position);
diffuse += max(0.0, dot(normal, VP));
}
#endif

varying vec2 pass_lightCoord;

void main(void){
gl_Position = gl_ModelViewProjectionMatrix * vec4(in_position, 1.0);
pass_textureCoords = in_textureCoords;

#if LIGHTING
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec3 eye = vec3(0.0, 0.0, 1.0);
vec4 diffuse = vec4(0.0);
pointLight(0, eye, normal, diffuse);
pointLight(1, eye, normal, diffuse);
pass_diffuse = min(diffuse, vec4(1.0));
#endif

pass_lightCoord = (gl_MultiTexCoord1.st + vec2(8.0)) / 256.0;
}

#version 130

uniform sampler2D texture;
uniform sampler2D lightMap;

varying vec2 pass_textureCoords;

#if LIGHTING
varying vec4 pass_diffuse;
#endif

varying vec2 pass_lightCoord;

void main(){
vec4 pixel = texture2D(texture, pass_textureCoords);
pixel.xyz *= texture2D(lightMap, pass_lightCoord).xyz;
#if LIGHTING
pixel.rgb = (0.4 + pass_diffuse.xyz * 0.6) * pixel.rgb;
#endif

gl_FragColor = pixel;
}
При применении получается плоскость вместо норм модели (скринчееек)1594666247964.png
 
2,505
81
397
Да и вообще впринципе, почему я без шейдера не могу забиндить текстуру?
Почему не можешь забиндить? Можешь.
Почему если я ее не бинжу, то рендер модели просто пропадает?
Не знаю, зависит от состояния. Может предыдущая текстура такая.

Входным атрибутам в шейдере задал индексы?
Советую начать с малого и разбираться понемногу, а не тупо копипастить чужой код и спрашивать, почему не работает.
 
1,173
28
168
Почему не можешь забиндить? Можешь
Вообще я не хочу пока юзать шейдеры ибо с ними не разобрался, но не думаю, что шейдер Агра как то плох.
Просто я не могу понять, почему не накладывается текстура, хотя на тех же дисплей листах все круто (как обычно0)0)
Гуглеж такой проблемы так же чет не выдал результатов
 
2,505
81
397
Потому что, когда компилишь дисплей лист скорее всего используешь тесселятор, который в свою очередь использует всякие ClientState функции (glEnableClientState, glVertexPointer, glColorPointer, ...). Они и говорят драйверу, откуда взять позицию, текстурную координату и т.п.
С VBO подход немного другой. Ты можешь только сказать какого типа данные лежат по такому-то смещению в буфере и привязать к индексу атрибута, а затем использовать в шейдере, как угодно.

И вообще, без батчинга примитивов нет смысла использовать VBO и шейдеры, если нет жесткой необходимости. Производительность станет только хуже, плюс убьешь возможность использования шейдеров оптифайна.
 
Последнее редактирование:
1,173
28
168
Так, уже понимаю тебя. Тогда покопаю рендер в Face, там через тесселяк рендерит эту всю кучу

Ну я хотел, мм, как сказать - написать базис для введения карты нормалей в проект. Но увы походу
Ладненько спосибо Дахака) Тебе оставлю лучший и лойс
 
Сверху