Исходя из спецификации OGL нет никаких ограничений на отрицательные айди листов, а также исходя из того что функция
glIsList(-1)
возвращает true вполне можно считать что объект листа с таким айди действительно создан. Исходя из нижеописанной функции
public int getDisplayList(BlockRenderLayer layer, CompiledChunk p_178600_2_)
{
return !p_178600_2_.isLayerEmpty(layer) ? this.baseDisplayList + layer.ordinal() : -1;
}
можно понять, что в рендер передается лист -1 если для текущего слоя чанк пустой. Также с помощью дебагера стало ясно, что проблемы возникают лишь в чанках с айди листа -1, а также что в лист -1 производится запись в нижеописанном методе.
private void uploadDisplayList(BufferBuilder bufferBuilderIn, int list, RenderChunk chunkRenderer)
{
GlStateManager.glNewList(list, 4864);
GlStateManager.pushMatrix();
chunkRenderer.multModelviewMatrix();
this.worldVertexUploader.draw(bufferBuilderIn);
GlStateManager.popMatrix();
GlStateManager.glEndList();
}
На счет кода: тут я лишь подхватываю уже готовые рендерЧанки, оставляя большую часть хлопот на ванильные методы
private void reloadChunks(Vec3i chunkPos){
if(mc.renderGlobal.viewFrustum!=null) {
storedChunks.clear();
BlockPos.PooledMutableBlockPos pos = BlockPos.PooledMutableBlockPos.retain();
for (int z = -SHADOW_RENDER_DIST; z <= SHADOW_RENDER_DIST; z++) {
for (int y = 0; y < 16; y++) {
for (int x = -SHADOW_RENDER_DIST; x <= SHADOW_RENDER_DIST; x++) {
if (Math.sqrt((x * x) + (z * z)) <= 8 && chunkPos.getY() - y <= 2) {
pos.setPos(((chunkPos.getX() + x) << 4)+8, (y << 4)+8, ((chunkPos.getZ() + z) << 4)+8);
RenderChunk rc = mc.renderGlobal.viewFrustum.getRenderChunk(pos);
if (rc != null) {
storedChunks.add(rc);
}
}
}
}
}
pos.release();
}
}
public void renderChunks(BlockRenderLayer layer){
if(renderContainer!=null && mc.renderViewEntity != null){
Vec3i chunkPos = new Vec3i(mc.renderViewEntity.chunkCoordX, mc.renderViewEntity.chunkCoordY, mc.renderViewEntity.chunkCoordZ);
if (prevChunkPos == null || !prevChunkPos.equals(chunkPos)) {
prevChunkPos = chunkPos;
reloadChunks(chunkPos);
}
for (RenderChunk rc:storedChunks) {
renderContainer.addRenderChunk(rc, layer);
}
mc.entityRenderer.enableLightmap();
if (OpenGlHelper.useVbo())
{
GlStateManager.glEnableClientState(32884);
OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
GlStateManager.glEnableClientState(32888);
OpenGlHelper.setClientActiveTexture(OpenGlHelper.lightmapTexUnit);
GlStateManager.glEnableClientState(32888);
OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
GlStateManager.glEnableClientState(32886);
}
renderContainer.renderChunkLayer(layer);
if (OpenGlHelper.useVbo())
{
for (VertexFormatElement vertexformatelement : DefaultVertexFormats.BLOCK.getElements())
{
VertexFormatElement.EnumUsage vertexformatelement$enumusage = vertexformatelement.getUsage();
int k1 = vertexformatelement.getIndex();
switch (vertexformatelement$enumusage)
{
case POSITION:
GlStateManager.glDisableClientState(32884);
break;
case UV:
OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit + k1);
GlStateManager.glDisableClientState(32888);
OpenGlHelper.setClientActiveTexture(OpenGlHelper.defaultTexUnit);
break;
case COLOR:
GlStateManager.glDisableClientState(32886);
GlStateManager.resetColor();
}
}
}
mc.entityRenderer.disableLightmap();
}
}
renderContainer.initialize(x,y,z)
вызывается перед рендером слоёв.
reloadChunks(chunkPos)
также с помощью миксинов вызывается в хвосте
net/minecraft/client/renderer/RenderGlobal.loadRenderers ()V