2013-08-12 4 views
0

У меня есть 3D-куба, который нарисованный массив вершин -Как установить текстуру на фигуре, нарисованной glDrawArrays()?

public void init(GLAutoDrawable drawable) { 
... 
float[] cubeVertices = {...}; // vertex coordinates (x,y,z) 
FloatBuffer tmpVerticesBuf = BufferUtil 
       .newFloatBuffer(cubeVertices.length); 
for (int i = 0; i < cubeVertices.length; i++) { 
      tmpVerticesBuf.put(cubeVertices[i]); 
     } 
tmpVerticesBuf.rewind(); 
gl.glEnableClientState(GL.GL_VERTEX_ARRAY); 
gl.glVertexPointer(3, GL.GL_FLOAT, 0, tmpVerticesBuf); 
} 

public void display(GLAutoDrawable drawable) { 
... 
gl.glDrawArrays(GL.GL_QUADS, 0, 24); 
... 
} 

Теперь я хочу, чтобы установить изображение текстуры на лицо с помощью этого куба таким образом, что это будет та же текстура, чтобы все грани куба х. До сих пор я сделал в init() -

public void init(GLAutoDrawable drawable) { 
... 
try { 
        // retrieve the image . 
      BufferedImage image = ImageIO.read(getClass().getClassLoader() 
        .getResource("floor.jpg")); 
      DataBufferByte dbb = (DataBufferByte) image.getRaster() 
        .getDataBuffer(); 
      byte[] data = dbb.getData(); 
      ByteBuffer pixels = BufferUtil.newByteBuffer(data.length); 
      pixels.put(data); 
      pixels.flip(); 

     } catch (GLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     m_textutureIntBuf = IntBuffer.allocate(1); // m_textutureIntBuf type IntBuffer 
     gl.glGenTextures(1, m_textutureIntBuf); 
     gl.glBindTexture(GL.GL_TEXTURE_2D, m_textutureIntBuf.get(0)); 
     gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, 256, 256, 0, GL.GL_RGB, 
       GL.GL_UNSIGNED_BYTE, m_pixels); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, 
       GL.GL_LINEAR); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, 
       GL.GL_NEAREST); 
     gl.glEnable(GL.GL_TEXTURE_2D); 
} 

Что я должен делать теперь о gl.glTexCoordPointer()gl.glEnableClientState() для того, чтобы получить то, что я говорил ранее о текстуре?

ответ

2

Ну, вам также нужно создать массив для Texture Coordinates.

В «... DATA ...» вам нужно добавить координаты U, V. Все вершины имеют координату U, V. Таким образом, tex_coord_size в основном 2 * vertices_count.

int tex_coord_size = x; // Whatever size you want according to your `Vertices` 

FloatBuffer tex_coord_data = BufferTools.createFloatBuffer(tex_coord_size); 
tex_coord_data.put(new float[] { ... DATA ... }); 
tex_coord_data.flip(); 


int vbo_tex_coord_handle = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo_tex_coord_handle); 
glBufferData(GL_ARRAY_BUFFER, tex_coord_data, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

А затем для рендеринга вам нужно добавить к вашему текущему рендерингу.

glBindBuffer(GL_ARRAY_BUFFER, vbo_tex_coord_handle); 
glTexCoordPointer(tex_coord_size, GL_FLOAT, 0, 0l); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

После того, как вы назвали glDrawArrays, вам нужно позвонить glDisableClientState(GL_TEXTURE_COORD_ARRAY); также, конечно.

+0

Что такое '{... DATA ...}'? те же координаты, что и вершины куба? – URL87

+0

Посмотрите на отредактированный ответ. – Vallentin

Смежные вопросы