Шейдеры не работают правильно в OpenGL в Java - PullRequest
0 голосов
/ 20 июня 2019

Проблема в том, что я пытаюсь создать 3D-куб с помощью шейдеров, но проблема в том, что он неправильно читает файл.

Вот шейдеры, которые я создал,проблема в том, что он некорректно читает шейдеры и выдает ошибку

у меня тоже просто черный экран в результате

мои шейдеры

вершинный шейдер

// vertex.glsl
#version 430
layout (location = 0) in vec3 position;

uniform mat4 proj_matrix;
uniform mat4 mv_matrix;

void main(void) { 
    gl_Position = proj_matrix * mv_matrix * vec4(position, 1.0); 
}

шейдер Fragemtn

// fragment.glsl

#version 430

out vec4 color; 
uniform mat4 mv_matrix; 
uniform mat4 proj_matrix; 

void main(void) { 
    color = vec4(1.0, 0.0, 0.0, 1.0); 
}

основной код

// my main code

import java.io.File;
import java.io.IOException;
import java.nio.FloatBuffer;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GL3;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLContext;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.math.Matrix4;
import com.jogamp.opengl.math.Quaternion;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.FPSAnimator;
import com.jogamp.common.nio.Buffers;
import com.jogamp.gluegen.*;

public class GOVNO extends JFrame implements GLEventListener {

  private GLCanvas myCanvas;
  private int rendering_program;
  private int vbo[] = new int[2];
  private int mTrans;

  public GOVNO() {
    setTitle("Chapter2 - program1");
    setSize(600, 400);
    setLocation(200, 200);
    GLProfile profile = GLProfile.getDefault();
    GLCapabilities capabilities = new GLCapabilities(profile);
    myCanvas = new GLCanvas(capabilities);
    myCanvas.addGLEventListener(this);
    this.add(myCanvas);
    setVisible(true);
  }

  public void display(GLAutoDrawable drawable) {
    GL2 gl = (GL2) GLContext.getCurrentGL();
    gl.glUseProgram(rendering_program);
    float a = 0;
//Matrix4 mTransMatrix = new Matrix4();
    float mTransMatrix[] = {
        (float) Math.cos(a), (float) -Math.sin(a), 0, 0,
        (float) Math.sin(a), (float) Math.cos(a), 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };
    gl.glUniformMatrix4fv(mTrans, 1, false, mTransMatrix, 0);
    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);
    gl.glVertexAttribPointer(0, 2, GL3.GL_FLOAT, false, 0, 0);
    gl.glEnableVertexAttribArray(0);
    gl.glDrawArrays(GL3.GL_TRIANGLES, 0, 6);
    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[1]);
    gl.glVertexAttribPointer(0, 2, GL3.GL_FLOAT, false, 0, 0);
    gl.glEnableVertexAttribArray(0);
    gl.glDrawArrays(GL3.GL_QUADS, 0, 8);
  }

  public void init(GLAutoDrawable drawable) {
    GL2 gl = (GL2) GLContext.getCurrentGL();
    rendering_program = createShaderProgram();
// generating location for transformation matrix
    mTrans = gl.glGetUniformLocation(rendering_program, "trans");
    float[] vertex_positions = { -0.5f, -1.0f, 0.0f, -0.5f, 0.5f, -1.0f, };
    gl.glGenBuffers(vbo.length, vbo, 0);
    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);
    FloatBuffer vertBuf Buffers.newDirectFloatBuffer(vertex_positions);
    gl.glBufferData(GL3.GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL3.GL_STATIC_DRAW);
    float[] vertex_positions2 = { -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f };
    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[1]);
    FloatBuffer vertBuf2 = Buffers.newDirectFloatBuffer(vertex_positions2);
    gl.glBufferData(GL3.GL_ARRAY_BUFFER, vertBuf2.limit() * 4, vertBuf2, GL3.GL_STATIC_DRAW);
  }

  private int createShaderProgram() {
    GL2 gl = (GL2) GLContext.getCurrentGL();
    String vshaderSource[] = readShaderSource("src/vertex.glsl");
    String fshaderSource[] = readShaderSource("src/fragment.glsl");
    int vShader = gl.glCreateShader(GL3.GL_VERTEX_SHADER);
    gl.glShaderSource(vShader, vshaderSource.length, vshaderSource, null, 0);
    gl.glCompileShader(vShader);
    printShaderLog(vShader);
    int fShader = gl.glCreateShader(GL3.GL_FRAGMENT_SHADER);
    gl.glShaderSource(fShader, fshaderSource.length, fshaderSource, null, 0);
    gl.glCompileShader(fShader);
    printShaderLog(fShader);
    int vfprogram = gl.glCreateProgram();
    gl.glAttachShader(vfprogram, vShader);
    gl.glAttachShader(vfprogram, fShader);
    gl.glLinkProgram(vfprogram);
    gl.glDeleteShader(vShader);
    gl.glDeleteShader(fShader);
    printProgramLog(vfprogram);
    return vfprogram;
  }

  private String[] readShaderSource(String filename) {
    Vector<String> lines = new Vector<String>();
    Scanner sc;
    try {
      sc = new Scanner(new File(filename));
    } catch (IOException e) {
      System.err.println("IOException reading file: " + e);
      return null;
    }
    while (sc.hasNext()) {
      lines.addElement(sc.nextLine());
    }
    String[] program = new String[lines.size()];
    for (int i = 0; i < lines.size(); i++) {
      program[i] = (String) lines.elementAt(i) + "\n";
      System.out.print(program[i]);
    }
    return program;
  }

  private void printShaderLog(int shader) {
    GL2 gl = (GL2) GLContext.getCurrentGL();
    int[] len = new int[1];
    int[] chWrittn = new int[1];
    byte[] log = null;
// determine the length of the shader compilation log
    gl.glGetShaderiv(shader, GL3.GL_INFO_LOG_LENGTH, len, 0);
    if (len[0] > 0) {
      log = new byte[len[0]];
      gl.glGetShaderInfoLog(shader, len[0], chWrittn, 0, log, 0);
      System.out.println("Shader Info Log: ");
      for (int i = 0; i < log.length; i++) {
        System.out.print((char) log[i]);
      }
    }
  }

  void printProgramLog(int prog) {
    GL2 gl = (GL2) GLContext.getCurrentGL();
    int[] len = new int[1];
    int[] chWrittn = new int[1];
    byte[] log = null;
// determine the length of the program linking log
    gl.glGetProgramiv(prog, GL3.GL_INFO_LOG_LENGTH, len, 0);
    if (len[0] > 0) {
      log = new byte[len[0]];
      gl.glGetProgramInfoLog(prog, len[0], chWrittn, 0, log, 0);
      System.out.println("Program Info Log: ");
      for (int i = 0; i < log.length; i++) {
        System.out.print((char) log[i]);
      }
    }
  }

  public static void main(String[] args) {
    System.out.println("Working Directory = " + System.getProperty("user.dir"));
    new GOVNO();
  }
}
...