[Решено, но пока не закрывайте ;)] Полупрозрачность

1,976
68
220
Доброго времени суток :D
Хотел я, значит, отрендерить себе полупрозрачный шарик (нет, как стабилизаторы в тауме не пойдёт - в шаре нужно будет находится), задал ему цвет и альфу, а он, собака такая, рендерится чёрт знает как:
l6UYNND.png
Методом научного тыка я понял, что проблема в GL_CULL_FACE. Но ведь внутри шара тоже нужна текстура...
Код:
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_BLEND);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
GL11.glColor4f(1.0F, 1.0F, 1.0F, (1.5F - (float) 200 / 200.0F));
GL11.glDisable(GL11.GL_TEXTURE_2D);
sphere.renderAll();
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();
// Есть ещё мелочи по типу rotatef и scalef, но дело сто проц не в этом
Помогите, пожалуйста, заранее спасибо =)
[merge_posts_bbcode]Добавлено: 27.06.2016 21:06:51[/merge_posts_bbcode]

P.S. Изнутри шара всё выглядит нормально. Похоже, это потому что наслаиваются две одинаковые полупрозрачные стороны.
 
608
5
15
А внутри выглядит нормально? Первое что пришло на ум, так это рендерить полусферу, когда ты за сферой.
 
808
3
124
Код:
GL11.glEnable(GL11.GL_CULL_FACE); // ну или оно уже включено, тогда не нужно
GL11.glCullFace(GL11.GL_BACK); // включаешь обычное отсечение задних сторон полигонов, ЕМНИП включено по дефолту
// рисуешь сферу (то есть ее наружную часть)
GL11.glCullFace(GL11.GL_FRONT); // включаешь отсечение передних полигонов
// опять рисуешь сферу (то есть ее внутреннюю часть)
GL11.glCullFace(GL11.GL_BACK); // вроде как это дефолтное состояние, его надо вернуть
GL11.glDisable(GL11.GL_CULL_FACE); // если нужно вернуть состояние, хз, нужно ли тебе
Если при этом будет включен тест глубины (glEnable(GL_DEPTH_TEST)) и запись в буфер глубины (glDepthMask(true)), то и изнутри, и снаружи всё будет выглядеть нормально. Снаружи будет видна только передняя сторона и полигоны не будут наслаиваться. Если нужно, чтобы полигоны снаружи наслаивались, то сначала рисуешь внутреннюю часть с отключенной записью в буфер глубины, а потом наружную со включенной. Еще может возникнуть необходимость поменять местами GL_FRONT и GL_BACK, если сфера рисуется неправильно (наружной стороной полигонов внутрь). Если все это не помогает, то сфера рисуется совсем неправильно (часть полигонов наружу, часть внутрь) и нужно переписывать код её отрисовки.
 
608
5
15
Покажешь что вышло?)
 
667
7
2
1,976
68
220
Всё отлично, сфера рисуется ровно со всех сторон, а ещё я узнал, как рендерить что-то сквозь все блоки :D
Большое спасибо за помощь, вот скрин:
40NLxEf.png
Liahim написал(а):
Кстати, на счёт прозрачности, как твоя сфера смотрится через воду? )))
JSBabNM.png
svk2140 написал(а):
Покажешь что вышло?)
W9lMOz7.png
 
4,046
63
645
Эм... Мдя. Я не этого ожидал )))
Ладно )
Моя-то проблема именно в блоках воды/стекла.
У меня они либо не видны на фоне моего рендера, либо не видны за ним, в зависимости от того, в каком эвенте рендерю.

Никак не могу это победить.
[merge_posts_bbcode]Добавлено: 29.06.2016 14:43:34[/merge_posts_bbcode]

Ты в каком месте сферу рендеришь?
 
1,976
68
220
А.. Эм.. Энтити :D
Код:
RenderingRegistry.registerEntityRenderingHandler
extends Render
public void doRender(Entity entity, double x, double y, double z, float f, float f1)
 
608
5
15
Афигенный эффект, ещё-б кольца убрать.

А что насчёт сферы, получилось? Покажешь?
 
1,976
68
220
svk2140 написал(а):
Афигенный эффект, ещё-б кольца убрать.

А что насчёт сферы, получилось? Покажешь?
8е сообщение под спойлерами скрины, а кольца - часть эффекта (типа ударные волны)
 
608
5
15
Шикарно просто, а можешь весь код рендера выложить? :rolleyes:
[merge_posts_bbcode]Добавлено: 29.06.2016 20:31:33[/merge_posts_bbcode]

И текстурка, как я понял идёт боксом, как небо?
 
1,976
68
220
svk2140 написал(а):
Шикарно просто, а можешь весь код рендера выложить? :rolleyes:
Без проблем - это всё написано при поддержке форума, так что вот:
Код:
package alexsocol.osm.entity.render;

import org.lwjgl.opengl.GL11;

import alexsocol.osm.ModInfo;
import alexsocol.osm.entity.IonPlasmaBurstEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;

public class IonPlasmaBurstEntityRender extends Render {

    public static final IModelCustom sphere = AdvancedModelLoader.loadModel(new ResourceLocation(ModInfo.MODID, "model/IonPlasmaSphere.obj"));
    public static final IModelCustom ringIn = AdvancedModelLoader.loadModel(new ResourceLocation(ModInfo.MODID, "model/IonPlasmaRingIn.obj"));
    public static final IModelCustom ringMid = AdvancedModelLoader.loadModel(new ResourceLocation(ModInfo.MODID, "model/IonPlasmaRingMid.obj"));
    public static final IModelCustom ringOut = AdvancedModelLoader.loadModel(new ResourceLocation(ModInfo.MODID, "model/IonPlasmaRingOut.obj"));    
    
    public IonPlasmaBurstEntityRender() {
        shadowSize = 0.0F;
    }

    @Override
    protected ResourceLocation getEntityTexture(Entity entity) {
        return new ResourceLocation(ModInfo.MODID + ":textures/entity/IonPlasma.png");
    }

    @Override
    public void doRender(Entity entity, double x, double y, double z, float f, float f1) {
        IonPlasmaBurstEntity burst = (IonPlasmaBurstEntity) entity;
        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        GL11.glDisable(GL11.GL_LIGHTING);
        GL11.glEnable(GL11.GL_BLEND);
        OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.25F);
        
/** Sphere White */
        GL11.glPushMatrix();
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        if (burst.lifespan <= 25) {
            GL11.glScalef(187.5F, 187.5F, 187.5F);
        } else {
            GL11.glScalef(burst.lifespan * 7.5F, burst.lifespan * 7.5F, burst.lifespan * 7.5F);
        }
        GL11.glCullFace(GL11.GL_BACK);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_FRONT);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_BACK);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glPopMatrix();
        
        GL11.glDisable(GL11.GL_CULL_FACE);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, (1.5F - (float) 1 / 200.0F));
        Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(ModInfo.MODID + ":textures/entity/IonPlasme.png"));
        
/** Sphere Outer */
        GL11.glPushMatrix();
        if (burst.lifespan <= 25) {
            GL11.glScalef(200, 200, 200);
        } else {
            GL11.glScalef(burst.lifespan * 8, burst.lifespan * 8, burst.lifespan * 8);
        }
        GL11.glRotatef(burst.lifespan * 2, 1.0F, 1.0F, 1.0F);
        sphere.renderAll();        
        GL11.glPopMatrix();

/** Sphere Inner */
        GL11.glPushMatrix();
        if (burst.lifespan <= 25) {
            GL11.glScalef(175, 175, 175);
        } else {
            GL11.glScalef(burst.lifespan * 7, burst.lifespan * 7, burst.lifespan * 7);
        }
        GL11.glRotatef(-burst.lifespan * 2, 1.0F, 1.0F, 1.0F);
        sphere.renderAll();        
        GL11.glPopMatrix();

        GL11.glEnable(GL11.GL_CULL_FACE);
        GL11.glColor4f(0.5F, 0.5F, 0.5F, (1.5F - (float) 1 / 200.0F));
        bindEntityTexture(entity);

/** Sphere In */
        GL11.glPushMatrix();
        if (burst.lifespan <= 25) {
            GL11.glScalef(181.25F, 181.25F, 181.25F);
        } else {
            GL11.glScalef(burst.lifespan * 7.25F, burst.lifespan * 7.25F, burst.lifespan * 7.25F);
        }
        GL11.glRotatef(burst.lifespan * 2, 1.0F, 1.0F, 1.0F);
        GL11.glCullFace(GL11.GL_BACK);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_FRONT);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_BACK);
        GL11.glPopMatrix();

/** Sphere Out */
        GL11.glPushMatrix();
        if (burst.lifespan <= 25) {
            GL11.glScalef(193.75F, 193.75F, 193.75F);
        } else {
            GL11.glScalef(burst.lifespan * 7.75F, burst.lifespan * 7.75F, burst.lifespan * 7.75F);
        }
        GL11.glRotatef(-burst.lifespan * 2, 1.0F, 1.0F, 1.0F);
        GL11.glCullFace(GL11.GL_BACK);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_FRONT);
        sphere.renderAll();
        GL11.glCullFace(GL11.GL_BACK);
        GL11.glPopMatrix();

        GL11.glDisable(GL11.GL_CULL_FACE);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, (1.5F - (float) 1 / 200.0F));
        
/** Rings */
        GL11.glPushMatrix();
        if (burst.lifespan <= 25) {
            GL11.glScalef(burst.lifespan * 4, burst.lifespan * 4, burst.lifespan * 4);
        } else {
            GL11.glScalef((float)burst.lifespan * 8.0F * ((float)burst.lifespan / 50.0F), (float)burst.lifespan * 8.0F * ((float)burst.lifespan / 50.0F), (float)burst.lifespan * 8.0F * ((float)burst.lifespan / 50.0F));
        }
        ringIn.renderAll();
        ringMid.renderAll();
        ringOut.renderAll();        
        GL11.glPopMatrix();
 
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_LIGHTING);
        GL11.glEnable(GL11.GL_CULL_FACE);
        GL11.glPopMatrix();
    }
}
svk2140 написал(а):
И текстурка, как я понял идёт боксом, как небо?
Да нет, самая обычная сфера (в Cinema 4D простой объект сферы) и самые обычные кольца (та же сфера, но с отрезанными верхом и низом), текстуры наложены обычным биндом (ну как любая модель)
 
Сверху