2016-08-29 16 views
0

私はゲームのプロトタイプレンダラを実際のVAO/VBO実装に直接モードテスト実装から移行しようとしています。 VBOは画面上でレンダリングされていますが、テクスチャ処理を拒否しています。以下は、問題を示し、最も単純なテストクラスである:LWJGL - インタリーブされたVAO/VBOテクスチャリングなし

public static void main(String[] args) throws Exception { 

    //       VertX,VertY   TexX, TexY 
    float[] data = new float[] {0.0f, 0.0f,  0.25f, 0.75f, 
           0.0f, 64.0f, 0.25f, 1.0f, 
           64.0f, 64.0f, 0.5f, 1.0f, 

           0.0f, 0.0f,  0.25f, 0.75f, 
           64.0f, 64.0f, 0.5f, 1.0f, 
           64.0f, 0.0f, 0.5f, 0.75f}; 

    glfwSetErrorCallback(GLFWErrorCallback.createPrint(System.err)); 
    if (!glfwInit()) 
     throw new IllegalStateException("Unable to initialize GLFW"); 

    long window = GLFW.glfwCreateWindow(1600, 900, "TEST", 0, 0); 
    GLFW.glfwMakeContextCurrent(window); 

    GL.createCapabilities(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 1600, 900, 0, 0.000001, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    int vboId = glGenBuffers(); 
    int vaoId = glGenVertexArrays(); 

    glClientActiveTexture(GL_TEXTURE0); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glBindVertexArray(vaoId); 
    glBindBuffer(GL_ARRAY_BUFFER, vboId); 

    glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 2, GL_FLOAT, false, 4*Float.BYTES, 0); 
    glTexCoordPointer(2, GL_FLOAT, 4*Float.BYTES, 4*Float.BYTES); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    glTranslatef(50, 50, 0); 

    Texture t = new Texture(TEST.class.getClassLoader().getResourceAsStream("test/WallFloor.png")); 

    while (!GLFW.glfwWindowShouldClose(window)) { 
     GLFW.glfwPollEvents(); 
     GLFW.glfwSwapBuffers(window); 

     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 


      glClientActiveTexture(GL_TEXTURE0); 
      glEnableClientState(GL_VERTEX_ARRAY); 
      glEnableClientState(GL_TEXTURE_COORD_ARRAY); 



      glBindVertexArray(vaoId); 
      glEnableVertexAttribArray(0); 

      t.bind(); 

      glDrawArrays(GL_TRIANGLES, 0, 6); 


      glDisableVertexAttribArray(0); 
      glBindVertexArray(0); 

      glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
      glDisableClientState(GL_VERTEX_ARRAY); 

      /* Equivelent immediate mode code - that works 
      t.bind(); 

      glBegin(GL_TRIANGLES); 
      glTexCoord2f(0.25f, 0.75f); 
      glVertex2f(0, 0); 
      glTexCoord2f(0.25f, 1f); 
      glVertex2f(0, 64); 
      glTexCoord2f(0.5f, 0.75f); 
      glVertex2f(64, 0); 

      glTexCoord2f(0.5f, 1f); 
      glVertex2f(64, 64); 
      glTexCoord2f(0.25f, 1f); 
      glVertex2f(0, 64); 
      glTexCoord2f(0.5f, 0.75f); 
      glVertex2f(64, 0); 
      glEnd(); 
      */ 

    } 
} 

テクスチャバインド・コールは、以下の(ここで、ラップ= GL_REPEATとフィルタ= GL_NEAREST)です:

public void bind() 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glClientActiveTexture(GL_TEXTURE0); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(target, id); 
    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); 
    glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter); 
    glTexParameteri(target, GL_TEXTURE_WRAP_S, wrap); 
    glTexParameteri(target, GL_TEXTURE_WRAP_T, wrap); 
} 

はグーグルで週末を過ごしました私は何かひどく間違っているのですか?私はテクスチャでレンダリングするイミディエイトモードを使ってテストしました。

答えて

4

はまた、あなたは非コアプロファイル(glTexCoordPointer

しかし、本当の問題は、間違ったストライドと使用オフセットから来ているとのコアプロファイルコード(glVertexAttribPointer)を混合しています。ストライドは、1つの頂点のデータの大きさを定義し、オフセットは実際のデータが開始する各頂点の開始からの距離を指定します。あなたの場合、すべての頂点は4つの浮動小数点で構成されているため、ストライドは4 * Float.BYTESでなければなりません。位置は、各頂点の最初の2つの浮動小数点(オフセット0)ですが、テクスチャ座標は3番目と4番目の浮動小数点数であるoffset = 2 * Float.BYTESを意味します。正しいコードは、(代わりにglVertexAttribPointerglVertexPointerの使用を注意してください)。このように何とかなります:

glVertexPointer(2, GL_FLOAT, false, 4*Float.BYTES, 0); 
glTexCoordPointer(2, GL_FLOAT, 4*Float.BYTES, 2*Float.BYTES); 

編集

をごVAOsの使い方も間違っています。初期化では、glVertexPointer/glTexCoordPointerをVAO vaoIdに格納します。しかし、レンダリングコードでは代わりにVAO 0をバインドします。ほとんどの場合、描画時に属性設定は存在しません。さらに、VAOが固定関数呼び出しと一緒に動作するかどうかは絶対にわかりません。この場合、すべてのVAOコールを削除できます。

+0

上記のコードは、 'glVertexAttribPointer'または 'glVertexPointer'のいずれかに応じて、テクスチャのない四角形またはアクセス違反を生成します。また、クエリとして、 'glTexCoordPointer'のコアプロファイルの置き換えは何ですか? – jediminer543

+0

コアプロファイルの置換は 'glVertexAttribPointer'になります。アトリビュートはシェーダによって定義されるので、テクスチャ座標属性の位置を問い合わせて、これを 'glVertexAttribPointer'の最初のパラメータとして使用します。 – BDL

+0

編集を参照してください – BDL

関連する問題