Я использую OpenGl с Java и в настоящее время я пытаюсь соединить 2 разные шейдерные программы (по одной для каждого объекта, который я хочу визуализировать) с моим кодом. Несмотря на это, в итоге эффективно подключается только один шейдер, и я думаю (хотя и не уверен), что он перекрывает первый. Мой код довольно длинный, поэтому я не уверен, какой объем информации я должен предоставить, поэтому дайте мне знать, если я должен также опубликовать код моих шейдеров:
public class Aufgabe3undFolgende extends AbstractOpenGLBase {
private ShaderProgram shaderProgram;
private ShaderProgram shaderProgram2;
private Matrix4 matrix = new Matrix4();
private Matrix4 secondMatrix = new Matrix4();
private Matrix4 projection = new Matrix4(0.8f,500f);
public static void main(String[] args) {
new Aufgabe3undFolgende().start("CG Aufgabe 3", 700, 700);
}
private int matrixID;
private int secondMatrixID;
private int snake;
private int greenSnake;
private GLFWKeyCallback input;
//cube normals
float[] normals = {..};
//cube vertices
float[] cube = {..};
//pyramid vertices
float[] pyramid = {..};
//uv coordinates for pyramid
float[] uv = {..};
//uv coordinates for cube
float[] uvCoords = {..};
@Override
protected void init() {
glfwSetKeyCallback(super.returnWindow(), input = new
MouseAndKeyboardControl());
shaderProgram = new ShaderProgram("aufgabe3");
//cube
glUseProgram(shaderProgram.getId());
matrixID = glGenVertexArrays();
glBindVertexArray(matrixID);
System.out.println(matrixID);
//pass data in the buffer
VBO(0, 3,cube);
VBO(1, 3, normals);
VBO( 2, 2, uvCoords);
Texture texture = new Texture("snake.jpg", 8);
snake = texture.getId();
glBindTexture(GL_TEXTURE_2D, snake);
//pyramid
shaderProgram2 = new ShaderProgram("render_pyramid");
glUseProgram(shaderProgram2.getId());
secondMatrixID = glGenVertexArrays();
glBindVertexArray(secondMatrixID);
System.out.println(secondMatrixID);
//pass data in the buffer
VBO(0, 3, pyramid);
VBO(1, 2,uv);
Texture texture2 = new Texture("greensnake.jpg", 8);
greenSnake = texture2.getId();
glBindTexture(GL_TEXTURE_2D, greenSnake);
glEnable(GL_DEPTH_TEST); // z-Buffer aktivieren
glEnable(GL_CULL_FACE); // backface culling aktivieren
int loc = glGetUniformLocation(shaderProgram.getId(),
"projectionMatrix");
glUniformMatrix4fv(loc, false,projection.getValuesAsArray());
}
public void VBO(int index, int size, float[] name) {
int vbold = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbold);
glBufferData(GL_ARRAY_BUFFER, name, GL_STATIC_DRAW);
glVertexAttribPointer(index,size, GL_FLOAT, false, 0,0);
glEnableVertexAttribArray(index);
}
@Override
public void update() {
matrix = new Matrix4();
matrix.translate(2, 2, -4);
secondMatrix = new Matrix4();
secondMatrix.translate(-2, -1, -4);
if (MouseAndKeyboardControl.keyPressed(49)) {
secondMatrix.rotateX(0.3f);
}
if (MouseAndKeyboardControl.keyPressed(50)) {
matrix.rotateY(0.3f);
}
}
@Override
protected void render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int loc1 = glGetUniformLocation(shaderProgram.getId(), "viewMatrix");
glUniformMatrix4fv(loc1, false, matrix.getValuesAsArray());
glBindTexture(GL_TEXTURE_2D, snake);
glBindVertexArray(matrixID);
glDrawArrays(GL_TRIANGLES, 0, 36);
int loc2 = glGetUniformLocation(shaderProgram2.getId(), "viewMatrix2");
glUniformMatrix4fv(loc2, false, secondMatrix.getValuesAsArray());
glBindTexture(GL_TEXTURE_2D, greenSnake);
glBindVertexArray(secondMatrixID);
glDrawArrays(GL_TRIANGLES, 0, 12);
}
@Override
public void destroy() {
}
Я попытался соединить шейдеры с программой в методе init () . Имя первого шейдера: aufgabe3 , а имя второго шейдера - render_pyramid . Я ценю любую помощь, которую вы можете оказать!