2017-06-28 13 views
-1
import static org.lwjgl.glfw.GLFW.*; 
import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL20.*; 
import static org.lwjgl.opengl.GL30.*; 
import java.awt.image.BufferedImageFilter; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.nio.DoubleBuffer; 
import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 
import static org.lwjgl.opengl.GL15.*; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.glfw.GLFWCursorPosCallback; 
import org.lwjgl.glfw.GLFWKeyCallback; 
import org.lwjgl.opengl.GL; 


public class test { 
public static int program; 
public static int vid,aid,iid,count,tid; 
    public static void main(String args[]) throws IOException { 

     glfwInit(); 
    long window = glfwCreateWindow(1920, 1080, "HI", 0 , 0); 


    glfwShowWindow(window); 


    glfwMakeContextCurrent(window); 


    GL.createCapabilities(); 
    TextureLoader texture = new TextureLoader(new File("D:/work/opengl2/src/opengl2/no.png")); 
     while (!glfwWindowShouldClose(window)) 
     { 

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glEnable(GL_DEPTH_TEST); 
     glEnable(GL_TEXTURE_2D); 
      new test().bind(); 


      glBindVertexArray(aid); 

      glEnableVertexAttribArray(0); 
      glEnableVertexAttribArray(1); 
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iid); 
      texture.bind(); 

      glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT,0); 


      glDisableVertexAttribArray(0); 
      glDisableVertexAttribArray(1); 

      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
      glBindVertexArray(0); 



      glfwSwapBuffers(window); 
      glfwPollEvents(); 
     } 

    } 







    //bind the data 

    public void bind() 
    { 
     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 
     }; 

     int[] indices = new int[] 
       { 
         0, 1, 2, 
         2, 3, 0 
       }; 

     float[] coords = new float[]{ 
       0,0, 
       0,1, 
       1,1, 
       1,0 

     }; 

     count = indices.length; 
     //create buffers 
     FloatBuffer texture = BufferUtils.createFloatBuffer(coords.length); 
     texture.put(coords); 
     texture.flip(); 
     FloatBuffer vert = BufferUtils.createFloatBuffer(vertices.length); 
     vert.put(vertices); 
     vert.flip(); 

     IntBuffer indic = BufferUtils.createIntBuffer(indices.length); 
     indic.put(indices); 
     indic.flip(); 

     //bind the VAO 
     aid = glGenVertexArrays(); 
     glBindVertexArray(aid); 
     vid = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, vid); 
     glBufferData(GL_ARRAY_BUFFER, vert, GL_STATIC_DRAW); 
     glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     tid = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, tid); 
     glBufferData(GL_ARRAY_BUFFER, texture, GL_STATIC_DRAW); 
     glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0); 
     glBindBuffer(GL_ARRAY_BUFFER,0); 

     glBindVertexArray(0); 


     iid = glGenBuffers(); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iid); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, indic, GL_STATIC_DRAW); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 


    } 

} 

こんにちは! ポリゴンをテクスチャしようとしていますが、このコードを実行すると、奇妙な色の矩形が表示されます。テクスチャの座標が矩形に適していない場合などです。私は、テクスチャ座標をVertexAttribArrayにバインドしてから、メインゲームループでそれを呼び出すことにします。私は多くのチュートリアルを見ていましたが、私はインデックスを使っていなかったので、インデックスをattribarrayにバインドしていませんでした。通常、それらをVBOに入れて、glDrawElementsの前に呼び出します。前もって感謝します! P.S:このlwjglの章では新しくなっていますので、簡単に教えてください:)LWJGLテクスチャリング

答えて

0

OpenGL 2はあなたが使っているようです。私が変更したいと思うものがいくつかあります(下記参照)が、OpenGL 3以降に切り替えることをお勧めします。それはもっと最近で柔軟な方法です。チュートリアルが必要な場合は、ThinMatrix製のもの(https://www.youtube.com/user/ThinMatrix)をお勧めします。

私は唯一のOpenGL 3以降を知っているので、私は正しいことが、しようとしないかもしれませんあなたを言っている:

  • があなたのメインループ
  • new test().bind();外を移動すると、後にVAO のバインドを解除してくださいインデックスバッファにデータが入っています
+0

VAOはOpenGL 3.0にありますが、openlg2を少し使用しています。このコードでは、非常にopengl 11と15のコードです。しかし、私は本当に何が間違っているのか分かりません。インデックスや頂点はうまくいくようです。私はバインディングや何か他のものでVAOの問題に過ぎないと思います。私のコードに大きな問題がありますか? –

+0

おそらく、テクスチャをバインドするのを忘れていました。 'glBindTexture(GL_TEXTURE_2D、textureID)'はこのトリックを行いますが、テクスチャIDは何かを調べる必要があります。テクスチャが1つだけの場合は、1を使用してみてください。 – Professor901

+0

あなたは正しいです。私は拘束力を忘れた。どうもありがとう –