好吧,我使用VBO创建了一个简单的3D立方体,我想在其上加载纹理。唯一的问题是纹理都搞砸了,这是我的代码:
public void create() {
setup();
render();
}
private void makeCube(float x, float y, float z) {
int cube = glGenBuffers();
int texture = glGenBuffers();
FloatBuffer cubeBuffer;
FloatBuffer textureBuffer;
float highX = x + tileSize;
float highY = y + tileSize;
float highZ = z + tileSize;
float[] textureData = new float[]{
0,0,
1,0,
1,1,
0,1
};
textureBuffer = asFloatBuffer(textureData);
glBindBuffer(GL_ARRAY_BUFFER, texture);
glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
float[] cubeData = new float[]{
/*Front Face*/
x, y, z,
highX, y, z,
highX, highY, z,
x, highY, z,
/*Back Face*/
x, y, highZ,
highX, y, highZ,
highX, highY, highZ,
x, highY, highZ,
/*Left Face*/
x, y, z,
x, y, highZ,
x, highY, highZ,
x, highY, z,
/*Right Face*/
highX, y, z,
highX, y, highZ,
highX, highY, highZ,
highX, highY, z,
/*Bottom Face*/
x, y, z,
x, y, highZ,
highX, y, highZ,
highX, y, z,
/*Top Face*/
x, highY, z,
x, highY, highZ,
highX, highY, highZ,
highX, highY, z,};
cubeBuffer = asFloatBuffer(cubeData);
glBindBuffer(GL_ARRAY_BUFFER, cube);
glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, cube);
}
private void renderCube() {
textures.get(0).bind();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, 22);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
private void render() {
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
camera();
renderCube();
Display.update();
Display.sync(30);
}
Display.destroy();
System.exit(0);
}
private void setup() {
try {
Display.setDisplayMode(new DisplayMode(frameWidth, frameHeight));
Display.setTitle("3D Project");
Display.setVSyncEnabled(vSync);
Display.create();
} catch (LWJGLException ex) {
Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex);
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), zNear, zFar);
//glOrtho(0, Display.getWidth(), Display.getHeight(), 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glLoadIdentity();
loadTextures();
makeCube(0, 0, -1);
}
我认为这是唯一错误的是我的纹理坐标数组,如果是这样,任何人都可以给我一个正确的顺序吗?
是的,我翻转我的缓冲区,是的,我的图像是2的幂。
答案 0 :(得分:0)
renderCube (...)
的实施有问题:
private void renderCube() {
textures.get(0).bind();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
/* These two pointers reference the same memory! */
glVertexPointer(3, GL_FLOAT, 0, 0);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, 22);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
您需要做的是在调用glVertexPointer(3, GL_FLOAT, 0, 0)
之前立即将VBO绑定到顶点位置,并在调用glTexCoordPointer(2, GL_FLOAT, 0, 0)
之前立即将纹理坐标的VBO绑定到。{/ p>
这些函数建立了相对于地址空间的指针,该地址空间由VBO在您调用它们时绑定的地址定义(如果您不使用VBO,则为实际的系统内存指针)。
/* Setup Position Pointer */
glBindBuffer (GL_ARRAY_BUFFER, cube);
glVertexPointer (3, GL_FLOAT, 0, 0);
/* Setup Texture Coordinate Pointer */
glBindBuffer (GL_ARRAY_BUFFER, texture);
glTexCoordPointer (2, GL_FLOAT, 0, 0);