- 129
- 2
- 9
Хотел сделать тени от своих источников света. Решил воспользоваться методом карт теней. Сделал я значит следующее:
В RenderGlobal есть метод renderBlockLayer в котором рисуются чанки. Работал я именно с этим методом. Первым делом отрисовал чанки в своем фреймбуффере для получения глубины
Его содержимое я проверял, все в порядке.
Затем мне нужно отрендерить чанки уже в ванильном фреймбуффере, и тут уже начинается проблема (чанки уже не отрисовываются)

Подебажил все это дело, и вот несколько моментов:
1. Если в свой фреймбуффер я ничего не буду рисовать, то в ванильном фбо все рисуется спокойно. Т.е. мой фреймбуффер ничего не ломает.
2. Если в свой фреймбуффер я просто буду рисовать чанки, т.е. без этой проверки (Насколько я понял, это подключение текстур):

то ситуация будет точно такой же как и в ванильном фбо, ничего рисоваться не будет, что и логично.
3. Заглянул я значит в метод this.renderContainer.renderChunkLayer(blockLayerIn); и заметил что после отрисовки лист чанков очищается, и подумал что проблема может быть в этом

Для проверки хукнулся в этот метод и закомментил строку this.renderChunks.clear();
Увы, ничего не поменялось.
Есть у кого предположения как решать?
В RenderGlobal есть метод renderBlockLayer в котором рисуются чанки. Работал я именно с этим методом. Первым делом отрисовал чанки в своем фреймбуффере для получения глубины
renderBlockLayer:
@Override
public void renderBlockLayer(BlockRenderLayer blockLayerIn) {
framebuffer = initFrameBuffer(framebuffer);
framebuffer.bind(true);
shaderDepth.bind();
render(blockLayerIn);
shaderDepth.unbind();
framebuffer.unbind();
}
public void render(BlockRenderLayer blockLayerIn) {
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);
}
this.renderContainer.renderChunkLayer(blockLayerIn);
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();
}
}
}
}
public FrameBuffer initFrameBuffer(FrameBuffer framebuffer) {
if (framebuffer == null) {
framebuffer = new FrameBuffer(1024, 1024);
framebuffer.bind(false);
GL11.glDrawBuffer(GL11.GL_NONE);
GL11.glReadBuffer(GL11.GL_NONE);
framebuffer.createDepthTexture();
framebuffer.unbind();
}
return framebuffer;
}
Затем мне нужно отрендерить чанки уже в ванильном фреймбуффере, и тут уже начинается проблема (чанки уже не отрисовываются)
Java:
mc.getFramebuffer().bindFramebuffer(true);
this.render(blockLayerIn);

Подебажил все это дело, и вот несколько моментов:
1. Если в свой фреймбуффер я ничего не буду рисовать, то в ванильном фбо все рисуется спокойно. Т.е. мой фреймбуффер ничего не ломает.
2. Если в свой фреймбуффер я просто буду рисовать чанки, т.е. без этой проверки (Насколько я понял, это подключение текстур):

то ситуация будет точно такой же как и в ванильном фбо, ничего рисоваться не будет, что и логично.
3. Заглянул я значит в метод this.renderContainer.renderChunkLayer(blockLayerIn); и заметил что после отрисовки лист чанков очищается, и подумал что проблема может быть в этом

Для проверки хукнулся в этот метод и закомментил строку this.renderChunks.clear();
Увы, ничего не поменялось.
Есть у кого предположения как решать?
Последнее редактирование:

