ChunkSectionsToRender.java

net.minecraft.client.renderer.chunk.ChunkSectionsToRender

信息

  • 全限定名:net.minecraft.client.renderer.chunk.ChunkSectionsToRender
  • 类型:public record
  • 包:net.minecraft.client.renderer.chunk
  • 源码路径:src/main/java/net/minecraft/client/renderer/chunk/ChunkSectionsToRender.java
  • 起始行号:L24
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public void renderGroup(ChunkSectionLayerGroup group, GpuSampler sampler) @ L30

  • 方法名:renderGroup
  • 源码定位:L30
  • 返回类型:void
  • 修饰符:public

参数:

  • group: ChunkSectionLayerGroup
  • sampler: GpuSampler

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public record ChunkSectionsToRender(
    GpuTextureView textureView,
    EnumMap<ChunkSectionLayer, Int2ObjectOpenHashMap<List<RenderPass.Draw<GpuBufferSlice[]>>>> drawGroupsPerLayer,
    int maxIndicesRequired,
    GpuBufferSlice[] chunkSectionInfos
) {
    public void renderGroup(ChunkSectionLayerGroup group, GpuSampler sampler) {
        RenderSystem.AutoStorageIndexBuffer autoIndices = RenderSystem.getSequentialBuffer(VertexFormat.Mode.QUADS);
        GpuBuffer defaultIndexBuffer = this.maxIndicesRequired == 0 ? null : autoIndices.getBuffer(this.maxIndicesRequired);
        VertexFormat.IndexType defaultIndexType = this.maxIndicesRequired == 0 ? null : autoIndices.type();
        ChunkSectionLayer[] layers = group.layers();
        Minecraft minecraft = Minecraft.getInstance();
        boolean wireframe = SharedConstants.DEBUG_HOTKEYS && minecraft.wireframe;
        RenderTarget renderTarget = group.outputTarget();
 
        try (RenderPass renderPass = RenderSystem.getDevice()
                .createCommandEncoder()
                .createRenderPass(
                    () -> "Section layers for " + group.label(),
                    renderTarget.getColorTextureView(),
                    OptionalInt.empty(),
                    renderTarget.getDepthTextureView(),
                    OptionalDouble.empty()
                )) {
            RenderSystem.bindDefaultUniforms(renderPass);
            renderPass.bindTexture("Sampler0", this.textureView, sampler);
            renderPass.bindTexture("Sampler2", minecraft.gameRenderer.lightmap(), RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR));
 
            for (ChunkSectionLayer layer : layers) {
                renderPass.setPipeline(wireframe ? RenderPipelines.WIREFRAME : layer.pipeline());
                Int2ObjectOpenHashMap<List<RenderPass.Draw<GpuBufferSlice[]>>> drawGroup = this.drawGroupsPerLayer.get(layer);
 
                for (List<RenderPass.Draw<GpuBufferSlice[]>> draws : drawGroup.values()) {
                    if (!draws.isEmpty()) {
                        if (layer == ChunkSectionLayer.TRANSLUCENT) {
                            draws = draws.reversed();
                        }
 
                        renderPass.drawMultipleIndexed(draws, defaultIndexBuffer, defaultIndexType, List.of("ChunkSection"), this.chunkSectionInfos);
                    }
                }
            }
        }
    }
}

引用的其他类

  • RenderSystem

    • 引用位置: 方法调用
    • 关联成员: RenderSystem.bindDefaultUniforms(), RenderSystem.getDevice(), RenderSystem.getSamplerCache(), RenderSystem.getSequentialBuffer()
  • GpuSampler

    • 引用位置: 参数
  • Minecraft

    • 引用位置: 方法调用
    • 关联成员: Minecraft.getInstance()
  • ChunkSectionLayerGroup

    • 引用位置: 参数