gpt4 book ai didi

java - 如何在 glDrawArrays() 绘制的形状上设置纹理?

转载 作者:行者123 更新时间:2023-12-01 23:39:22 25 4
gpt4 key购买 nike

我有一个由顶点数组绘制的 3D 立方体 -

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() 做什么才能获得我之前提到的有关纹理的内容?

最佳答案

那么您还需要为纹理坐标创建一个数组。

“...数据...”处,您需要添加 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);

关于java - 如何在 glDrawArrays() 绘制的形状上设置纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com