Specular/Normalmap with custom renderer

WorldRenderEvents.BEFORE_ENTITIES.register(context -> {
MinecraftClient mc = MinecraftClient.getInstance();
RenderLayer renderLayer = NewRenderLayer.getNewLayer(new Identifier("luminance", "textures/re45.png"));
VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
VertexConsumer vertexConsumer = immediate.getBuffer(renderLayer);

context.matrixStack().push();
context.matrixStack().translate(-context.camera().getPos().x, -context.camera().getPos().y, -context.camera().getPos().z);

if(!modelBuffers.containsKey("myModel"))
bakeModel("myModel", objParser);

// render via baked buffer
VertexBuffer vertexBuffer = modelBuffers.get("myModel");

renderLayer.startDrawing();
vertexBuffer.bind();

// temp fix: lighting is baked, so I artificially darken the whole model (to be implemented)
RenderSystem.setShaderColor(0.0f, 0.0f, 0.0f, 1.0f);

Matrix4f m4f = new Matrix4f(context.matrixStack().peek().getPositionMatrix());
var matrix = new Matrix4f(RenderSystem.getModelViewMatrix()).mul(m4f);
vertexBuffer.draw(matrix, context.projectionMatrix(), GameRenderer.getRenderTypeEntitySolidProgram());

renderLayer.endDrawing();
RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);

context.matrixStack().pop();
});
WorldRenderEvents.BEFORE_ENTITIES.register(context -> {
MinecraftClient mc = MinecraftClient.getInstance();
RenderLayer renderLayer = NewRenderLayer.getNewLayer(new Identifier("luminance", "textures/re45.png"));
VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
VertexConsumer vertexConsumer = immediate.getBuffer(renderLayer);

context.matrixStack().push();
context.matrixStack().translate(-context.camera().getPos().x, -context.camera().getPos().y, -context.camera().getPos().z);

if(!modelBuffers.containsKey("myModel"))
bakeModel("myModel", objParser);

// render via baked buffer
VertexBuffer vertexBuffer = modelBuffers.get("myModel");

renderLayer.startDrawing();
vertexBuffer.bind();

// temp fix: lighting is baked, so I artificially darken the whole model (to be implemented)
RenderSystem.setShaderColor(0.0f, 0.0f, 0.0f, 1.0f);

Matrix4f m4f = new Matrix4f(context.matrixStack().peek().getPositionMatrix());
var matrix = new Matrix4f(RenderSystem.getModelViewMatrix()).mul(m4f);
vertexBuffer.draw(matrix, context.projectionMatrix(), GameRenderer.getRenderTypeEntitySolidProgram());

renderLayer.endDrawing();
RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);

context.matrixStack().pop();
});
Hey, I wanted to ask something! This is my custom code for rendering OBJ meshes which works, with rethinking voxels it also recieves shadows, AO etc. I wanted to ask, is it possible to also bind the specular and normal maps? Can the shader work with that and use it (for example for screen space reflections and normal maps)? :)
No description
560 Replies
Sinan
Sinan14mo ago
@IMS Hello, given your bio I thought I might ping you for this :) Is it possible to bind the specular and normal maps alongside my rendering, aka do the shaderpack shaders have access to that?
IMS
IMS14mo ago
sorry, didn't get to this
Sinan
Sinan14mo ago
No problem, thank you for answering
IMS
IMS14mo ago
The way this is supposed to work is you use AbstractTexture's, and then you can just have _s and _n variants of those textures and Iris should just know how to use them
Sinan
Sinan14mo ago
May I ask in which sense? In my code above I do not render like normal blocks or items
IMS
IMS14mo ago
so first try adding textures/re45_s.png any sense, it's caught at texture binding not at blocks or entities
Sinan
Sinan14mo ago
Yes, I have the _s and _n with new Identifier Oh okay, I never heard about AbstractTextures, I am scrolling through the docs but I am unsure on how to use them Nvm! So basically:
AbstractTexture texture_s = MinecraftClient.getInstance().getTextureManager().getTexture(new Identifier("luminance", "textures/re45_s.png"));

AbstractTexture texture_n = MinecraftClient.getInstance().getTextureManager().getTexture(new Identifier("luminance", "textures/re45_n.png"));
RenderSystem.activeTexture(GlConst.GL_TEXTURE1);
RenderSystem.bindTexture(texture_s.getGlId());
RenderSystem.activeTexture(GlConst.GL_TEXTURE2);
RenderSystem.bindTexture(texture_n.getGlId());
AbstractTexture texture_s = MinecraftClient.getInstance().getTextureManager().getTexture(new Identifier("luminance", "textures/re45_s.png"));

AbstractTexture texture_n = MinecraftClient.getInstance().getTextureManager().getTexture(new Identifier("luminance", "textures/re45_n.png"));
RenderSystem.activeTexture(GlConst.GL_TEXTURE1);
RenderSystem.bindTexture(texture_s.getGlId());
RenderSystem.activeTexture(GlConst.GL_TEXTURE2);
RenderSystem.bindTexture(texture_n.getGlId());
I should do this before calling draw?
IMS
IMS14mo ago
no don't do anything with _s or _n pretend they don't exist, just have them Iris will grab them for you if you're registering them, also don't do that
Sinan
Sinan14mo ago
Oh uhm, I should just have them as files?
IMS
IMS14mo ago
yep
Sinan
Sinan14mo ago
Woah I'm gonna give it a shot Hmm that did not seem to work, I will provide you with my code:
Sinan
Sinan14mo ago
First off I think this is what you meant?
No description
IMS
IMS14mo ago
yep
Sinan
Sinan14mo ago
This is my render code:
WorldRendererEvents.BEFORE_ENTITY.register(context -> {
Vec3d pos = new Vec3d(0,0,0);
int blockLight = context.world().getLightLevel(LightType.BLOCK, new BlockPos((int)pos.x, (int)pos.y, (int)pos.z));
int skyLight = context.world().getLightLevel(LightType.SKY, new BlockPos((int)pos.x, (int)pos.y, (int)pos.z));
int packedLight = packLight(blockLight, skyLight);

MinecraftClient mc = MinecraftClient.getInstance();
RenderLayer renderLayer = NewRenderLayer.getNewLayer(new Identifier("luminance", "textures/re45.png"));
VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
VertexConsumer vertexConsumer = immediate.getBuffer(renderLayer);

context.matrixStack().push();
context.matrixStack().translate(-context.camera().getPos().x, -context.camera().getPos().y, -context.camera().getPos().z);

if(!modelBuffers.containsKey("myModel"))
bakeModel("myModel", objParser);


int newBlockLight = Math.min(roundToNearestArray(blockLight, blockLightSteps), 15);
int newSkyLight = Math.min(roundToNearestArray(skyLight, skyLightSteps), 15);
int newLight = packLight(newBlockLight, newSkyLight);


VertexBuffer vertexBuffer = modelBuffers.get("myModel").get(newLight);

if(vertexBuffer != null) {
renderLayer.startDrawing();
vertexBuffer.bind();

shaderLights[0] = ShaderLights.lastShaderLights[0];
shaderLights[1] = ShaderLights.lastShaderLights[1];

context.matrixStack().push();
context.matrixStack().multiply(new Quaternionf().rotateYXZ(45,0,0));
context.matrixStack().scale(3,3,3);
context.matrixStack().translate(2,0,0);

RenderSystem.setShaderLights(shaderLights[0], shaderLights[1]);
Matrix4f m4f = new Matrix4f(context.matrixStack().peek().getPositionMatrix());
var matrix = new Matrix4f(RenderSystem.getModelViewMatrix()).mul(m4f);


vertexBuffer.draw(matrix, context.projectionMatrix(), GameRenderer.getRenderTypeEntitySolidProgram());

renderLayer.endDrawing();
context.matrixStack().pop();
}

context.matrixStack().pop();
});
WorldRendererEvents.BEFORE_ENTITY.register(context -> {
Vec3d pos = new Vec3d(0,0,0);
int blockLight = context.world().getLightLevel(LightType.BLOCK, new BlockPos((int)pos.x, (int)pos.y, (int)pos.z));
int skyLight = context.world().getLightLevel(LightType.SKY, new BlockPos((int)pos.x, (int)pos.y, (int)pos.z));
int packedLight = packLight(blockLight, skyLight);

MinecraftClient mc = MinecraftClient.getInstance();
RenderLayer renderLayer = NewRenderLayer.getNewLayer(new Identifier("luminance", "textures/re45.png"));
VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
VertexConsumer vertexConsumer = immediate.getBuffer(renderLayer);

context.matrixStack().push();
context.matrixStack().translate(-context.camera().getPos().x, -context.camera().getPos().y, -context.camera().getPos().z);

if(!modelBuffers.containsKey("myModel"))
bakeModel("myModel", objParser);


int newBlockLight = Math.min(roundToNearestArray(blockLight, blockLightSteps), 15);
int newSkyLight = Math.min(roundToNearestArray(skyLight, skyLightSteps), 15);
int newLight = packLight(newBlockLight, newSkyLight);


VertexBuffer vertexBuffer = modelBuffers.get("myModel").get(newLight);

if(vertexBuffer != null) {
renderLayer.startDrawing();
vertexBuffer.bind();

shaderLights[0] = ShaderLights.lastShaderLights[0];
shaderLights[1] = ShaderLights.lastShaderLights[1];

context.matrixStack().push();
context.matrixStack().multiply(new Quaternionf().rotateYXZ(45,0,0));
context.matrixStack().scale(3,3,3);
context.matrixStack().translate(2,0,0);

RenderSystem.setShaderLights(shaderLights[0], shaderLights[1]);
Matrix4f m4f = new Matrix4f(context.matrixStack().peek().getPositionMatrix());
var matrix = new Matrix4f(RenderSystem.getModelViewMatrix()).mul(m4f);


vertexBuffer.draw(matrix, context.projectionMatrix(), GameRenderer.getRenderTypeEntitySolidProgram());

renderLayer.endDrawing();
context.matrixStack().pop();
}

context.matrixStack().pop();
});
This is all I do basically
IMS
IMS14mo ago
what is NewRenderLayer.getNewLayer?
Want results from more Discord servers?
Add your server