Передать текстуру в шейдер

Версия Minecraft
1.7.10
API
Forge
6
0
Здравствуйте, начинаю изучать шейдеры, не могу понять как передать текстуру в шейдер.
Точнее не понимаю как получить id текстуры после ее бинда через стандартный Minecraft.getMinecraft().renderEngine.bindTexture
Возможно я что-то не понимаю, вот и прошу обьяснить.
В шейдере параметр стандартный - sampler2D.
 
6
0
Спасибо, но у меня все равно ничего не заработало.
Чтобы не создавать лишние темы - спрошу тут, может у кого нибудь есть примеры шейдера для маски и его реализации в майнкрафте?
Я совсем не понимаю почему оно работает вобще не так как задумывается.
Даже альфа канал не доступен в рендере, он просто ни на что не влияет. Даже при принудительном сете цвета с альфой, все равно цвет solid(не знаю как сказать это по русски).

Просто памагите ._.

Вертексный шейдер:
#version 120
void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord1;
}


Фрагментный шейдер:
#version 120
uniform sampler2D mask;
uniform sampler2D image;
void main(void) {
    vec4 mask_c = texture2D(mask, gl_TexCoord[0].st);
    vec4 image_c = texture2D(image, gl_TexCoord[1].st);   

    ----------------------------- Эту часть я уже как только не перебирал
    if(mask_c.r==1)
        gl_FragColor = image_c;
    else
        gl_FragColor = vec4(0,1,0,0);
}

ЗЫ. Туторы по огл читал, да и с майном они работают через раз
 
6
0
Не, включено все, в общем что я понял - я работаю все равно только с 1 текстурой. Той которую я использую последней.
И передается она соответственно в 0 позицию в шейдере.

Java:
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        ShaderHandler.mapMask.start();
        
        
           double f1 = 1;
           double x = 0, y = 0;
           double xs = 300;
        double ys = 300;
        
        double h = 300;
        double w = 300;
        
        double u = 0;
        double v = 0;
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.mask);
        ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("mask"), GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));

        
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.text);
           ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("image"), GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));
          
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + ys), 1, 0, 1);
        tessellator.addVertexWithUV((double)(x + xs), (double)(y + ys), 1, 1, 1);
        tessellator.addVertexWithUV((double)(x + xs), (double)(y + 0), 1, 1, 0);
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), 1, 0, 0);
        tessellator.draw();

        ShaderHandler.mapMask.stop();
        GL11.glDisable(GL11.GL_ALPHA_TEST);
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Ты неправильно передаешь.
Надо так:
Java:
GL13.glActiveTexture(GL13.GL_TEXTURE0);
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.text);
ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("image"), 0); // Основное изображение

GL13.glActiveTexture(GL13.GL_TEXTURE2); // Лучше на второй слот, ибо первый майн занимает для лайтмапы, вдруг что-то сломается
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.mask);
ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("mask"), 2); // Маска

// После сбрасываем активную текстуру на дефолтную
GL13.glActiveTexture(GL13.GL_TEXTURE0);
 
6
0
Хмм, даже так ничего не заработало. Извиняюсь за свою тупость, но я все равно ничего не могу понять. 1 текстура загружается и с ней можно взаимодействовать.

На данный момент у меня выглядит все так:


Фрагментный шейдер:
#version 120
uniform sampler2D mask;
uniform sampler2D image;
void main(void) {
    vec4 mask_c = texture2D(mask, gl_TexCoord[1].st);
    vec4 image_c = texture2D(image, gl_TexCoord[0].st);   

    gl_FragColor = image_c*mask_c.r;
}


Вертексный шейдер:
#version 120
void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord2;
}



Рендер:
GL11.glEnable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        ShaderHandler.mapMask.start();
        //GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
        
           double f1 = 1;
           double x = 0, y = 0;
           double xs = 300;
        double ys = 300;
        
        double h = 300;
        double w = 300;
        
        double u = 0;
        double v = 0;
        
        GL13.glActiveTexture(GL13.GL_TEXTURE0);
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.text);
        ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("image"), 0); 

        GL13.glActiveTexture(GL13.GL_TEXTURE2);
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.mask);
        ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("mask"), 2);


        GL13.glActiveTexture(GL13.GL_TEXTURE0);
          
           //GL11.glColor4f(1, 1, 1, 0.5f);
           Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + ys), 1, 0, 1);
        tessellator.addVertexWithUV((double)(x + xs), (double)(y + ys), 1, 1, 1);
        tessellator.addVertexWithUV((double)(x + xs), (double)(y + 0), 1, 1, 0);
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), 1, 0, 0);
        tessellator.draw();

        ShaderHandler.mapMask.stop();
        GL11.glDisable(GL11.GL_ALPHA_TEST);

Еще я пытался поставить в активную текстуру - 2,
Java:
GL13.glActiveTexture(GL13.GL_TEXTURE2);
Но загружает оно мне все равно нулевую, только растягивает её на весь экран и когда вращаю камеру меняется цвет текстуры.
 
6
0
Ну текстурки биндятся правильно, если смотреть на код

Java:
        GL13.glActiveTexture(GL13.GL_TEXTURE0);
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.text);
        ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("image"), 0);
        
        GL13.glActiveTexture(GL13.GL_TEXTURE2);
        Minecraft.getMinecraft().renderEngine.bindTexture(ResourceList.mask);
        ARBShaderObjects.glUniform1fARB(ShaderHandler.mapMask.getUniform("mask"), 2);

    public static ResourceLocation mask = new ResourceLocation(ModInfo.MODID + ":" + "textures/mask.png");
    public static ResourceLocation text = new ResourceLocation(ModInfo.MODID + ":" + "textures/text.png");
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    28.8 KB · Просмотры: 18
Сверху