diff --git a/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java b/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java
index 42d294d54..1ceda6aaa 100644
--- a/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java
+++ b/src/main/java/com/marginallyclever/ro3/apps/viewport/ShaderProgram.java
@@ -10,6 +10,8 @@
import javax.vecmath.Vector3d;
import java.awt.*;
import java.security.InvalidParameterException;
+import java.util.HashMap;
+import java.util.Map;
/**
*
{@link ShaderProgram} is a wrapper for vertex and fragment shader programs. It also provides a simple interface
@@ -20,14 +22,19 @@ public class ShaderProgram {
private final int programId;
private final int vertexShaderId;
private final int fragmentShaderId;
+ private final Map uniformLocations = new HashMap<>();
public ShaderProgram(GL3 gl, String[] vertexCode, String[] fragmentCode) {
vertexShaderId = loadShader(gl, GL3.GL_VERTEX_SHADER, vertexCode,"vertex");
fragmentShaderId = loadShader(gl, GL3.GL_FRAGMENT_SHADER, fragmentCode,"fragment");
+
programId = gl.glCreateProgram();
+
gl.glAttachShader(programId, vertexShaderId);
gl.glAttachShader(programId, fragmentShaderId);
+
gl.glLinkProgram(programId);
+
if (!checkStatus(gl, programId, GL3.GL_LINK_STATUS)) {
throw new IllegalStateException("Failed to link shader program.");
}
@@ -96,8 +103,12 @@ public int getProgramId() {
}
public int getUniformLocation(GL3 gl, String name) {
- int result = gl.glGetUniformLocation(programId, name);
- if(result==-1) throw new InvalidParameterException("Could not find uniform "+name);
+ Integer result = uniformLocations.get(name);
+ if(result == null) {
+ result = gl.glGetUniformLocation(programId, name);
+ if(result==-1) throw new InvalidParameterException("Could not find uniform "+name);
+ uniformLocations.put(name,result);
+ }
return result;
}