Refactored shader code to use GL20 instead of ARB.

This commit is contained in:
Christian Knaapen
2019-05-12 17:34:26 +02:00
parent b2ee5dbc04
commit 0f74b107d6
3 changed files with 49 additions and 46 deletions

View File

@@ -5,13 +5,11 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.renderer.BlockRendererDispatcher; import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.*; import net.minecraft.util.math.*;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
@@ -26,14 +24,13 @@ import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings;
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.helper.InventoryHelper;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import nl.requios.effortlessbuilding.item.ItemRandomizerBag;
import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.proxy.ClientProxy;
import org.lwjgl.opengl.ARBMultitexture; import org.lwjgl.opengl.ARBMultitexture;
import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -373,39 +370,40 @@ public class BlockPreviewRenderer {
final boolean highlight, final boolean red) { final boolean highlight, final boolean red) {
Minecraft mc = Minecraft.getMinecraft(); Minecraft mc = Minecraft.getMinecraft();
return (Integer shader) -> { return (Integer shader) -> {
int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve"); int percentileUniform = GL20.glGetUniformLocation(shader, "dissolve");
int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight"); int highlightUniform = GL20.glGetUniformLocation(shader, "highlight");
int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red"); int redUniform = GL20.glGetUniformLocation(shader, "red");
int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos"); int blockposUniform = GL20.glGetUniformLocation(shader, "blockpos");
int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos"); int firstposUniform = GL20.glGetUniformLocation(shader, "firstpos");
int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos"); int secondposUniform = GL20.glGetUniformLocation(shader, "secondpos");
int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image"); int imageUniform = GL20.glGetUniformLocation(shader, "image");
int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask"); int maskUniform = GL20.glGetUniformLocation(shader, "mask");
//image //image
ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit); GL20.glUniform1i(imageUniform, primaryTextureUnit);
OpenGlHelper.setActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit); OpenGlHelper.setActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).getGlTextureId()); GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(TextureMap.LOCATION_BLOCKS_TEXTURE).getGlTextureId());
GlStateManager.enableTexture2D(); // GlStateManager.enableTexture2D();
GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); // GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
//mask //mask
ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit); GL20.glUniform1i(maskUniform, secondaryTextureUnit);
OpenGlHelper.setActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit); OpenGlHelper.setActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId()); GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId());
//blockpos //blockpos
ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z); GL20.glUniform3f(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z);
ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z); GL20.glUniform3f(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z);
ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z); GL20.glUniform3f(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z);
//dissolve //dissolve
ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve); GL20.glUniform1f(percentileUniform, dissolve);
//highlight //highlight
ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0); GL20.glUniform1i(highlightUniform, highlight ? 1 : 0);
//red //red
ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0); GL20.glUniform1i(redUniform, red ? 1 : 0);
}; };
} }

View File

@@ -185,7 +185,7 @@ public class RenderHandler implements IWorldEventListener {
GL11.glPushAttrib(GL11.GL_ENABLE_BIT); GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glEnable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_TEXTURE_2D);
// Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
Minecraft.getMinecraft().renderEngine.bindTexture(ShaderHandler.shaderMaskTextureLocation); Minecraft.getMinecraft().renderEngine.bindTexture(ShaderHandler.shaderMaskTextureLocation);
GlStateManager.enableBlend(); GlStateManager.enableBlend();

View File

@@ -28,8 +28,9 @@ import java.util.function.Consumer;
public final class ShaderHandler { public final class ShaderHandler {
private static final int VERT_ST = ARBVertexShader.GL_VERTEX_SHADER_ARB;
private static final int FRAG_ST = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB; private static final int VERT_ST = GL20.GL_VERTEX_SHADER;
private static final int FRAG_ST = GL20.GL_FRAGMENT_SHADER;
private static final int VERT = 1; private static final int VERT = 1;
private static final int FRAG = 2; private static final int FRAG = 2;
@@ -54,11 +55,11 @@ public final class ShaderHandler {
if(!doUseShaders()) if(!doUseShaders())
return; return;
ARBShaderObjects.glUseProgramObjectARB(shader); GL20.glUseProgram(shader);
if(shader != 0) { if(shader != 0) {
int time = ARBShaderObjects.glGetUniformLocationARB(shader, "time"); int time = GL20.glGetUniformLocation(shader, "time");
ARBShaderObjects.glUniform1iARB(time, ClientProxy.ticksInGame); GL20.glUniform1i(time, ClientProxy.ticksInGame);
if(callback != null) if(callback != null)
callback.accept(shader); callback.accept(shader);
@@ -74,7 +75,7 @@ public final class ShaderHandler {
} }
public static boolean doUseShaders() { public static boolean doUseShaders() {
return BuildConfig.visuals.useShaders && OpenGlHelper.shadersSupported; return BuildConfig.visuals.useShaders && OpenGlHelper.shadersSupported && OpenGlHelper.openGL21; //Only GL2.1 shaders
} }
private static int createProgram(String s, int sides) { private static int createProgram(String s, int sides) {
@@ -94,24 +95,24 @@ public final class ShaderHandler {
if(frag != null) if(frag != null)
fragId = createShader(frag, FRAG_ST); fragId = createShader(frag, FRAG_ST);
program = ARBShaderObjects.glCreateProgramObjectARB(); program = GL20.glCreateProgram();
if(program == 0) if(program == 0)
return 0; return 0;
if(vert != null) if(vert != null)
ARBShaderObjects.glAttachObjectARB(program, vertId); GL20.glAttachShader(program, vertId);
if(frag != null) if(frag != null)
ARBShaderObjects.glAttachObjectARB(program, fragId); GL20.glAttachShader(program, fragId);
ARBShaderObjects.glLinkProgramARB(program); GL20.glLinkProgram(program);
if(ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) { if(GL20.glGetProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) {
EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program)); EffortlessBuilding.logger.log(Level.ERROR, getProgramLogInfo(program));
return 0; return 0;
} }
ARBShaderObjects.glValidateProgramARB(program); GL20.glValidateProgram(program);
if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { if (GL20.glGetProgrami(program, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) {
EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program)); EffortlessBuilding.logger.log(Level.ERROR, getProgramLogInfo(program));
return 0; return 0;
} }
@@ -121,28 +122,32 @@ public final class ShaderHandler {
private static int createShader(String filename, int shaderType){ private static int createShader(String filename, int shaderType){
int shader = 0; int shader = 0;
try { try {
shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); shader = GL20.glCreateShader(shaderType);
if(shader == 0) if(shader == 0)
return 0; return 0;
ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename)); GL20.glShaderSource(shader, readFileAsString(filename));
ARBShaderObjects.glCompileShaderARB(shader); GL20.glCompileShader(shader);
if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE) if (GL20.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE)
throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); throw new RuntimeException("Error creating shader: " + getShaderLogInfo(shader));
return shader; return shader;
} }
catch(Exception e) { catch(Exception e) {
ARBShaderObjects.glDeleteObjectARB(shader); GL20.glDeleteShader(shader);
e.printStackTrace(); e.printStackTrace();
return -1; return -1;
} }
} }
private static String getLogInfo(int obj) { private static String getProgramLogInfo(int program) {
return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); return GL20.glGetProgramInfoLog(program, GL20.glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH));
}
private static String getShaderLogInfo(int shader) {
return GL20.glGetShaderInfoLog(shader, GL20.glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH));
} }
private static String readFileAsString(String filename) throws Exception { private static String readFileAsString(String filename) throws Exception {