-2

立方体テクスチャの頂点が正しくないという問題を 1 日以上解決しようとしてきましたが、あまり運がありませんでした。テクスチャが間違って表示されており、すべての面で異なります。

これが現時点での私のコードです。OpenGL に詳しい人にとっては比較的簡単だと思いますが、質問があれば聞いてください。

数日前にこれを最後に投稿したとき、私は反対票を投じられ、回答がありませんでした。十分な情報を提供していない場合や間違ったことをしている場合は、お知らせください。

   private boolean hasBeenRendered = false;
   private int amountOfVertices;
   private int vertexSize;
   private int textureSize;
   private int vboVertexHandle;
   private int vboTextureHandle;
   private boolean canDraw = false;

   public Block(BlockType type, Location loc) {
      this.type = type;
      this.loc = loc;

      initRendering();
   }

   private void initRendering() {

      amountOfVertices = 24;
      vertexSize = 3;
      textureSize = 2;

      FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
      float[] vertices = {
          //  X     Y     Z           R     G     B
          // face 0:
          1.0f, 1.0f, 1.0f,       // vertex 0
          - 1.0f, 1.0f, 1.0f,        // vertex 1
          - 1.0f, - 1.0f, 1.0f,        // vertex 3
          1.0f, - 1.0f, 1.0f,        // vertex 2

          // face 1:
          1.0f, 1.0f, 1.0f,       // vertex 0
          1.0f, - 1.0f, 1.0f,       // vertex 1
          1.0f, - 1.0f, - 1.0f,       // vertex 3
          1.0f, 1.0f, - 1.0f,        // vertex 2

          // face 2:
          1.0f, 1.0f, 1.0f,      // vertex 0
          1.0f, 1.0f, - 1.0f,       // vertex 1
          - 1.0f, 1.0f, - 1.0f,       // vertex 3
          - 1.0f, 1.0f, 1.0f,       // vertex 2

          // face 3:
          1.0f, 1.0f, - 1.0f,     // vertex 0
          1.0f, - 1.0f, - 1.0f,      // vertex 1
          - 1.0f, - 1.0f, - 1.0f,        // vertex 3
          - 1.0f, 1.0f, - 1.0f,       // vertex 2

          // face 4:
          - 1.0f, 1.0f, 1.0f,      // vertex 0
          - 1.0f, 1.0f, - 1.0f,       // vertex 1
          - 1.0f, - 1.0f, - 1.0f,     // vertex 3
          - 1.0f, - 1.0f, 1.0f,    // vertex 2

          // face 5:
          1.0f, - 1.0f, 1.0f,      // vertex 0
          - 1.0f, - 1.0f, 1.0f,     // vertex 1
          - 1.0f, - 1.0f, - 1.0f,     // vertex 3
          1.0f, - 1.0f, - 1.0f,     // vertex 2
          // 6 faces with 4 vertices with 6 components (floats)

      };
      vertexData.put(vertices);

      vertexData.flip();

      FloatBuffer textureData = BufferUtils.createFloatBuffer(amountOfVertices * textureSize);
      textureData.put(new float[] {
          1, 1, 0, 1, 0, 0, 1, 0,

          1, 1, 0, 1, 0, 0, 1, 0,

          1, 1, 0, 1, 0, 0, 1, 0,

          1, 1, 0, 1, 0, 0, 1, 0,

          1, 1, 0, 1, 0, 0, 1, 0,

          1, 1, 0, 1, 0, 0, 1, 0,
      });
      textureData.flip();

      vboVertexHandle = glGenBuffers();
      glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
      glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, 0);

      vboTextureHandle = glGenBuffers();
      glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
      glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
      glBindBuffer(GL_ARRAY_BUFFER, 0);
   }

   @Override
   public void render() {
//      if(! hasBeenRendered) {

         canDraw = true;
         glPushMatrix();
         {
            glTranslatef(loc.getX(), loc.getY(), loc.getZ());
            //glRotatef(x, 1, 1, 0);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

            //glBindTexture(GL_TEXTURE, type.getTexture().getTextureID());
            glBindTexture(GL_TEXTURE_2D, type.getTexture().getTextureID());

            glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
            glVertexPointer(vertexSize, GL_FLOAT, 0, 0L);

            glBindTexture(GL_ARRAY_BUFFER, vboTextureHandle);
            glTexCoordPointer(textureSize, GL_FLOAT, 0, 0L);

            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
            glDrawArrays(GL_QUADS, 0, amountOfVertices);
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
            glDisableClientState(GL_VERTEX_ARRAY);

         }

         glPopMatrix();
         //hasBeenRendered = true;   }
   }

出力は次のようになります

さらに情報が必要な場合はお知らせください。私はこれに苦労しています。GL_QUADS が非推奨であることは知っていますが、これを実行したいと思っています。

4

1 に答える 1

0

また、使用/ターゲットする OpenGL を提供していただけますか? GL 1.1 ではすべてがオプション (VBO など) ですが、古い (つまり、より最近の) バージョンでは多くのことが変更されているため、glVertexPointer / glTexCoordPointer を glVertexAttribPointer と交換できます。古い OpenGL を使用していると仮定して、VBO を削除し、直接ポインタでチェックアウトします。

また、単純なインデックスであっても、自分でインデックスを指定してみてください。リストを作成し、glDrawElements を使用して手動で指定することをお勧めします。

Java はネイティブなものがあまり好きではないので、OpenGL に適切なバッファ形式を使用する必要があります。そうしないと、取得した結果のように見えるデータが台無しになる可能性があります。

vertexData.put(vertices);
vertexData.order(ByteOrder.nativeOrder());
vertexData.flip();

これら以外では、頂点/UV データのレイアウト方法に問題がある可能性があるため、クワッドを描画して結果を確認するなど、小さなパーツに分割する必要があります。

于 2013-10-14T19:10:10.983 に答える