Всем привет!
Пытаюсь отрендерить модельку светофора в кубах, где через теср хочу рендерить линзы разных цветов. Светофор имеет конфигурируемый головной блок, поэтому каждой линзе можно задать свой цвет. Оттого сама текстура линз белая и, используя GlStateManager.color, хочу окрашивать линзу соответствующим цветом.
Проблема в том, что изменение цвета абсолютно игнорируется и постоянно рендерится оригинальная текстура в белом цвете:


Есть предположение что так как это obj модель и загружается форжом, то он запекает цвет в вершины и поэтому не работает GlStateManager.color, но разве шейдер не должен перемножать цвета вершин на глобальные?
Думаю это можно решить перебором вершин в самом TESR и изменением их цветов, но возможно есть более оптимальный способ? Хотелось бы использовать GlStateManager.color
Сам TESR для рендера линз
Пытаюсь отрендерить модельку светофора в кубах, где через теср хочу рендерить линзы разных цветов. Светофор имеет конфигурируемый головной блок, поэтому каждой линзе можно задать свой цвет. Оттого сама текстура линз белая и, используя GlStateManager.color, хочу окрашивать линзу соответствующим цветом.
Проблема в том, что изменение цвета абсолютно игнорируется и постоянно рендерится оригинальная текстура в белом цвете:


Есть предположение что так как это obj модель и загружается форжом, то он запекает цвет в вершины и поэтому не работает GlStateManager.color, но разве шейдер не должен перемножать цвета вершин на глобальные?
Думаю это можно решить перебором вершин в самом TESR и изменением их цветов, но возможно есть более оптимальный способ? Хотелось бы использовать GlStateManager.color
Сам TESR для рендера линз
LightSignalSpecialRenderer.java:
@Override
public void render(SignalTileEntity te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
BlockRendererDispatcher dispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();
IBakedModel model = dispatcher.getModelForState(this.getWorld().getBlockState(te.getPos()));
if (model instanceof MatoiModel.MatoiBakedModel) {
IBakedModel base = ((MatoiModel.MatoiBakedModel<?>) model).getBase();
if (base instanceof ITransformable) {
GlStateManager.pushAttrib();
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.disableCull();
GlStateManager.enableTexture2D();
// Apply transformations
GlStateManager.translate(0.5f, 0.0f, 0.5f);
FloatPoint rotation = te.getRotation();
rotateAtCenter(rotation.getX(), te.getScale().getX() > 0.0f ? -rotation.getY() : rotation.getY(), rotation.getZ());
GlStateManager.translate(-0.5f, 0.0f, -0.5f);
LightSignalConfig cfg = te.getSignalConfig();
List<Byte> signalData = te.getSignals();
for (int i = 0; i < cfg.lensCount(); i++ ) {
if (signalData != null && signalData.size() >= cfg.lensCount()) {
final String lensPart = cfg.getLensPrefix() + (i + 1) + cfg.getLensSuffix();
List<BakedQuad> lensQuads = ((ITransformable) base).getGroupQuads(Collections.singleton(lensPart));
LightSignalColor color = cfg.getLens()[i];
float[] colorMask = getColorMask(color);
boolean enabled = signalData.get(i) > 0;
float brightnessFactor = enabled ? 1.0f : 0.2f;
if (enabled) {
GlStateManager.disableLighting();
Minecraft.getMinecraft().entityRenderer.disableLightmap();
}
renderQuads(lensQuads, colorMask[0], colorMask[1], colorMask[2], brightnessFactor,
((ITransformable) base).getFormat());
if (enabled) {
Minecraft.getMinecraft().entityRenderer.enableLightmap();
GlStateManager.enableLighting();
}
}
}
GlStateManager.enableCull();
GlStateManager.disableBlend();
GlStateManager.popMatrix();
GlStateManager.popAttrib();
}
}
}
private float[] getColorMask(LightSignalColor color) {
switch (color) {
case RED:
return new float[]{1.0f, 0.0f, 0.0f};
case GREEN:
return new float[]{0.0f, 1.0f, 0.0f};
case YELLOW:
return new float[]{1.0f, 1.0f, 0.0f};
case BLUE:
return new float[]{0.0f, 0.0f, 1.0f};
default:
return new float[]{1.0f, 1.0f, 1.0f};
}
}
private void renderQuads(List<BakedQuad> quads, float r, float g, float b, float brightnessFactor, VertexFormat format) {
GlStateManager.color(r * brightnessFactor, g * brightnessFactor, b * brightnessFactor, 1.0f);
BufferBuilder buf = Tessellator.getInstance().getBuffer();
buf.begin(GL11.GL_QUADS, format);
for (BakedQuad quad : quads) {
buf.addVertexData(quad.getVertexData());
}
Tessellator.getInstance().draw();
}

