2017-10-14 3 views
0

OpenGLを初めて使用していて、LWJGLを試し始めました。PVM行列を追加するまでは問題なく動作しましたが、追加しても何も表示されません。 行列関連コードがコメント化されています。LWJGL Pojectionビューモデルの行列が正しく動作しない

public class Window { 
    private int vaoid; 
    private int vbover; 
    private int vboind; 

    private int vid; 
    private int fid; 
    private int pid; 

    //private int pml;projection matrix location 
    //private int vml;view matrix location 
    //private int mml;model matrix location 
    //private Matrix4f projectionMatrix; 
    //private Matrix4f viewMatrix; 
    //private Matrix4f modelMatrix; 
    //private FloatBuffer projbuffer = BufferUtils.createFloatBuffer(16); 

    public void start() { 
     try { 
      Display.setDisplayMode(new DisplayMode(800,600)); 
      Display.setTitle("OpenGL Try"); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
     init(); 
     while (!Display.isCloseRequested()) { 
      update(); 
      Display.sync(60); 
      Display.update(); 
     } 
     cleanUp(); 
     Display.destroy(); 
    } 

    public static void main(String[] argv) { 
     Window displayExample = new Window(); 
     displayExample.start(); 
    } 

    public void init() { 
     //projectionMatrix = createProjectionMatrix(); 

     float[] vertices = { 
       -0.5f, 0.5f, 0f, // Left top   ID: 0 
       -0.5f, -0.5f, 0f, // Left bottom  ID: 1 
       0.5f, -0.5f, 0f, // Right bottom  ID: 2 
       0.5f, 0.5f, 0f  // Right left  ID: 3 
     }; 
     FloatBuffer verticesbuffer = BufferUtils.createFloatBuffer(vertices.length); 
     verticesbuffer.put(vertices); 
     verticesbuffer.flip(); 

     byte[] indices = { 
       // Left bottom triangle 
       0, 1, 2, 
       // Right top triangle 
       2, 3, 0 
     }; 
     ByteBuffer indicesbuffer = BufferUtils.createByteBuffer(indices.length); 
     indicesbuffer.put(indices); 
     indicesbuffer.flip(); 

     vaoid = GL30.glGenVertexArrays(); 
     GL30.glBindVertexArray(vaoid); 

     vbover = GL15.glGenBuffers(); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbover); 
     GL15.glBufferData(GL15.GL_ARRAY_BUFFER,verticesbuffer, GL15.GL_STATIC_DRAW); 
     GL20.glVertexAttribPointer(0,3,GL11.GL_FLOAT,false,0,0); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0); 
     GL30.glBindVertexArray(0); 

     vboind = GL15.glGenBuffers(); 
     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,vboind); 
     GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER,indicesbuffer,GL15.GL_STATIC_DRAW); 
     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,0); 

     vid = loadShader("./res/shader.ver",GL20.GL_VERTEX_SHADER); 
     fid = loadShader("./res/shader.frag",GL20.GL_FRAGMENT_SHADER); 

     pid = GL20.glCreateProgram(); 
     GL20.glAttachShader(pid,vid); 
     GL20.glAttachShader(pid, fid); 
     GL20.glBindAttribLocation(pid, 0, "in_position"); 
     GL20.glLinkProgram(pid); 
     GL20.glValidateProgram(pid); 
     //pml = GL20.glGetUniformLocation(pid, "projMatrix"); 
     //vml = GL20.glGetUniformLocation(pid, "viewMatrix"); 
     //mml = GL20.glGetUniformLocation(pid, "modelMatrix"); 
     GL20.glUseProgram(pid); 
     //projectionMatrix.store(projbuffer); 
     //projbuffer.flip(); 
     //GL20.glUniformMatrix4(pml, false, projbuffer); 
     GL20.glUseProgram(0); 

    } 

    public void update() { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT); 
     GL20.glUseProgram(pid); 
     //viewMatrix = createTransformationMatrix(new Vector3f(0,0,0),new Vector3f(0,0,0),1f); 
     //viewMatrix.store(projbuffer);projbuffer.flip(); 
     //GL20.glUniformMatrix4(vml, false, projbuffer); 
     //modelMatrix = createTransformationMatrix(new Vector3f(0,0,0),new Vector3f(0,0,0),1f); 
     //modelMatrix.store(projbuffer);projbuffer.flip(); 
     //GL20.glUniformMatrix4(mml, false, projbuffer); 
     GL30.glBindVertexArray(vaoid); 
     GL20.glEnableVertexAttribArray(0); 
     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,vboind); 
     GL11.glDrawElements(GL11.GL_TRIANGLES,6,GL11.GL_UNSIGNED_BYTE,0); 
     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,0); 
     GL20.glDisableVertexAttribArray(0); 
     GL30.glBindVertexArray(0); 

     GL20.glUseProgram(0); 

    } 

    public void cleanUp() { 
     GL20.glUseProgram(0); 
     GL20.glDetachShader(pid, vid); 
     GL20.glDetachShader(pid, fid); 
     GL20.glDeleteShader(vid); 
     GL20.glDeleteShader(fid); 
     GL20.glDeleteProgram(pid); 
     GL20.glDisableVertexAttribArray(0); 

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
     GL15.glDeleteBuffers(vbover); 

     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
     GL15.glDeleteBuffers(vboind); 

     GL30.glBindVertexArray(0); 
     GL30.glDeleteVertexArrays(vaoid); 
    } 

    public int loadShader(String filePath,int type) { 
     StringBuilder sb = new StringBuilder(); 
     int shaderId = 0; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(filePath)); 
      String line=""; 
      while((line = br.readLine())!=null) { 
       sb.append(line).append("\n"); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 

     shaderId = GL20.glCreateShader(type); 
     GL20.glShaderSource(shaderId, sb); 
     GL20.glCompileShader(shaderId); 

     return shaderId; 
    } 

     /* public Matrix4f createTransformationMatrix(Vector3f pos,Vector3f 
    rot,float scale) { 
      Matrix4f mat = new Matrix4f(); 
      Matrix4f.scale(new Vector3f(scale,scale,scale),mat,mat); 
      Matrix4f.translate(pos,mat,mat); 
      Matrix4f.rotate((float) Math.toRadians(rot.x),new 
      Vector3f(1,0,0),mat,mat); 
      Matrix4f.rotate((float) Math.toRadians(rot.y),new 
      Vector3f(0,1,0),mat,mat); 
      Matrix4f.rotate((float) Math.toRadians(rot.z),new 
      Vector3f(0,0,1),mat,mat); 
      return mat; 
     }*/ 

    /*public Matrix4f createProjectionMatrix() { 
     Matrix4f pm = new Matrix4f(); 
     float fieldOfView = 60f; 
     float aspectRatio = (float)Display.getWidth()/(float)Display.getHeight(); 
     float znear = 0.1f; 
     float zfar = 100f; 
     float frustumLength = zfar-znear; 

     float ysize = (float) (1/Math.tan(Math.toRadians(fieldOfView/2f))); 
     float xsize = ysize/aspectRatio; 

     pm.m00 = xsize; 
     pm.m11 = ysize; 
     pm.m22 = -((znear+zfar)/frustumLength); 
     pm.m23 = -1; 
     pm.m32 = -((2*znear*zfar)/frustumLength); 
     pm.m33 = 0; 

     return pm; 

    } */ 
} 

と頂点シェーダ:

#version 150 core 

in vec3 in_position; 

uniform mat4 projMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

out vec4 pass_color; 

void main(void){ 

    gl_Position = projMatrix * viewMarix * modelMatrix * 
    vec4(in_position,1.0); 
    pass_color = vec4(1,0,1,1); 
} 

とフラグメントシェーダ:

#version 150 core 

in vec4 pass_color; 

out vec4 out_color; 

void main(void){ 

    out_color = pass_color; 
} 

すべてのヘルプは高く評価され、新しいの学習を続けるために私をブロックここ コードですOpenGLのもの、ありがとう。

+1

このコードでは、どのような部分がコメントされていますか?マトリックスのユニフォームをデフォルト(すべてゼロ)にして、2つのゼロエリアの三角形を描画し、フラグメントを生成しないことが保証されているため、正しい出力は空のスクリーンです。 – derhass

+0

私はそれらを追加したときに何も表示されないので、行列に関連するコードをコメントしました。投影行列は、少なくとも「gluniformmatrix」でシェーダにロードされるか、投影行列の構文が間違っています。知っている。 – sanjileo

答えて

0

私は3つの問題に気付きました。

  1. このバッファに整数を格納するため、インデックスにはByteBufferの代わりにIntBufferを使用する必要があります。バッファタイプを変更する場合は、glDrawElementsのGL_UNSIGNED_BYTEもGL_UNSIGNED_INTに変更する必要があります。

  2. インデックスバッファをバインドした後にGL_ELEMENT_ARRAY_BUFFERを0にバインドしないでください。

glDarwElementsを呼び出すときに、私はこのことができます願っていGL_ELEMENT_ARRAY_BUFFERを結合して、アンバインドする必要はありません。

関連する問題