Программа использует только один шейдер, а я пытаюсь подключить 2 шейдера - PullRequest
0 голосов
/ 22 января 2019

Я использую 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 . Я ценю любую помощь, которую вы можете оказать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...