Minecraft 透明渲染隐藏方块
Minecraft transparent render hides blocks
我不知道为什么当我从南边或东边看时我的纹理按预期渲染,但从北边或西边看时却隐藏了它们后面的对象。
我有一个不可见的方块,它在其中呈现多个项目,并且在处理具有半透明纹理的方块时遇到了问题。已尝试为基础块和纹理块切换所有块属性(例如渲染类型、图层、不透明),并尝试在渲染时使用不同的混合选项。
Forge 版本 1.12
普通视图
残破的看法
渲染器
public class BlueRenderer extends TileEntitySpecialRenderer<TileEntityBlue> {
@Override
public void render(TileEntityBlue tile, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
itemRenderer = mc.getRenderItem();
textureManager = mc.getTextureManager();
blockModelShapes = mc.getBlockRendererDispatcher().getBlockModelShapes();
GlStateManager.pushAttrib();
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
GlStateManager.disableRescaleNormal();
renderItem(new GetBlock("minecraft:jukebox"), 0.5F);
renderItem(new GetBlock("mymod:blue"), 1F);
GlStateManager.popMatrix();
GlStateManager.popAttrib();
}
private void renderItem(GetBlock block, float scale) {
RenderHelper.enableStandardItemLighting();
GlStateManager.enableLighting();
GlStateManager.pushMatrix();
GlStateManager.translate(0.5, 0.5, 0.5);
GlStateManager.scale(scale, scale, scale);
IBakedModel model = blockModelShapes.getModelForState(block.state);
model = ForgeHooksClient.handleCameraTransforms(model, ItemCameraTransforms.TransformType.NONE, false);
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
textureManager.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
itemRenderer.renderItem(block.stack, model);
GlStateManager.disableBlend();
GlStateManager.popMatrix();
}
阅读 transparency 后 - 我启用了深度遮罩但缺少 alpha 函数。
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
if (transparent) {
GlStateManager.depthMask(false);
GlStateManager.alphaFunc(GL11.GL_LESS, 1.0F);
itemRenderer.renderItem(block.stack, model);
GlStateManager.depthMask(true);
} else {
GlStateManager.alphaFunc(GL11.GL_EQUAL, 1.0F);
itemRenderer.renderItem(block.stack, model);
}
GlStateManager.disableBlend();
注意事项:
最后渲染透明项目,否则它们将无法正确显示 "as inside"。
renderItem(new GetBlock("minecraft:jukebox"), 0.5F, false );
renderItem(new GetBlock("mymod:blue"), 1F, true /*transparent*/);
实体项也需要混合函数 GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
,因为堆栈中的第一个实体项会在某些角度出现故障:
我不知道为什么当我从南边或东边看时我的纹理按预期渲染,但从北边或西边看时却隐藏了它们后面的对象。
我有一个不可见的方块,它在其中呈现多个项目,并且在处理具有半透明纹理的方块时遇到了问题。已尝试为基础块和纹理块切换所有块属性(例如渲染类型、图层、不透明),并尝试在渲染时使用不同的混合选项。
Forge 版本 1.12
普通视图
public class BlueRenderer extends TileEntitySpecialRenderer<TileEntityBlue> {
@Override
public void render(TileEntityBlue tile, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
itemRenderer = mc.getRenderItem();
textureManager = mc.getTextureManager();
blockModelShapes = mc.getBlockRendererDispatcher().getBlockModelShapes();
GlStateManager.pushAttrib();
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
GlStateManager.disableRescaleNormal();
renderItem(new GetBlock("minecraft:jukebox"), 0.5F);
renderItem(new GetBlock("mymod:blue"), 1F);
GlStateManager.popMatrix();
GlStateManager.popAttrib();
}
private void renderItem(GetBlock block, float scale) {
RenderHelper.enableStandardItemLighting();
GlStateManager.enableLighting();
GlStateManager.pushMatrix();
GlStateManager.translate(0.5, 0.5, 0.5);
GlStateManager.scale(scale, scale, scale);
IBakedModel model = blockModelShapes.getModelForState(block.state);
model = ForgeHooksClient.handleCameraTransforms(model, ItemCameraTransforms.TransformType.NONE, false);
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
textureManager.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
itemRenderer.renderItem(block.stack, model);
GlStateManager.disableBlend();
GlStateManager.popMatrix();
}
阅读 transparency 后 - 我启用了深度遮罩但缺少 alpha 函数。
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
if (transparent) {
GlStateManager.depthMask(false);
GlStateManager.alphaFunc(GL11.GL_LESS, 1.0F);
itemRenderer.renderItem(block.stack, model);
GlStateManager.depthMask(true);
} else {
GlStateManager.alphaFunc(GL11.GL_EQUAL, 1.0F);
itemRenderer.renderItem(block.stack, model);
}
GlStateManager.disableBlend();
注意事项:
最后渲染透明项目,否则它们将无法正确显示 "as inside"。
renderItem(new GetBlock("minecraft:jukebox"), 0.5F, false );
renderItem(new GetBlock("mymod:blue"), 1F, true /*transparent*/);
实体项也需要混合函数 GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
,因为堆栈中的第一个实体项会在某些角度出现故障: