OpenGL纹理拉伸和错误。 VBO顶点不正确?

时间:2013-09-26 15:16:39

标签: java opengl rendering lwjgl

我一直在尝试解决我的立方体纹理顶点不正确的问题,现在没有太多运气。纹理显示错误,并且每个方面都有所不同。

这是我目前的代码。我认为对熟悉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;   }
   }

The output looks something like this

如果您需要更多信息,请告诉我,我一直在努力解决这个问题。我知道GL_QUADS已被弃用,但我真的很想让它运行起来。

1 个答案:

答案 0 :(得分:0)

你能提供你使用/目标的OpenGL吗?在GL 1.1中,一切都是可选的(如VBO),但在较旧的(即更新版本)版本中,许多内容都发生了变化,因此您可以使用glVertexAttribPointer交换glVertexPointer / glTexCoordPointer。 让我们假设你使用旧的OpenGL,然后删除VBO并用直接指针检查它。

也尝试自己指定索引,即使它们是直接的,但创建列表并使用glDrawElements手动指定它会更好。

Java并不真正喜欢原生的东西,所以你需要为OpenGL使用适当的缓冲区格式,否则它可能会弄乱看起来像你得到的结果的数据。

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

除了这些之外,您需要将其分解为更小的部分,例如只绘制一个Quad并查看结果,因为它可能会影响您如何布置顶点/ UV数据。