그래서이 작업을 수행하는 방법을 알아 냈습니다. 내 배열은 겉보기에 엉망입니다. 설명하기 어려우므로 사진과 코드를 제공하십시오.하나의 VBO에 여러 개의 큐브가 있습니다.
EDIT : 문제는 피 루프 및 X1, Y1, Z1 변수는 3x3x1 어레이 수율이 결과를 만들기 플로트
public void create() {
setup();
render();
}
private void makeCube() {
texture = glGenBuffers();
cube = glGenBuffers();
FloatBuffer cubeBuffer;
FloatBuffer textureBuffer;
ArrayList<Float> cubeList = new ArrayList<>();
ArrayList<Float> textureList = new ArrayList<>();
float[] cubeFloat;
float[] textureFloat;
for (float x1 = 0; x1 < tileSize * width; x1 += tileSize) {
for (float y1 = 0; y1 < tileSize * height; y1 += tileSize) {
for (float z1 = -tileSize * depth; z1 < 0; z1 += tileSize) {
float highX = x1 + tileSize;
float highY = y1 + tileSize;
float highZ = z1 + tileSize;
float[] cubeData = new float[]{
/*Front Face*/
x1, y1, z1,
highX, y1, z1,
highX, highY, z1,
x1, highY, z1,
/*Back Face*/
x1, y1, highZ,
highX, y1, highZ,
highX, highY, highZ,
x1, highY, highZ,
/*Left Face*/
x1, y1, z1,
x1, y1, highZ,
x1, highY, highZ,
x1, highY, z1,
/*Right Face*/
highX, y1, z1,
highX, y1, highZ,
highX, highY, highZ,
highX, highY, z1,
/*Bottom Face*/
x1, y1, z1,
x1, y1, highZ,
highX, y1, highZ,
highX, y1, z1,
/*Top Face*/
x1, highY, z1,
x1, highY, highZ,
highX, highY, highZ,
highX, highY, z1};
for (float f : cubeData) {
cubeList.add(f);
}
}
}
}
cubeFloat = compileFloat(cubeList);
for (int i = 0; i < (width * height * depth); i++) {
float[] textureData = new float[]{
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,
1, 1,
0, 1};
for (Float f : textureData) {
textureList.add(f);
}
}
textureFloat = compileFloat(textureList);
textureBuffer = asFloatBuffer(textureFloat);
glBindBuffer(GL_ARRAY_BUFFER, texture);
glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
cubeBuffer = asFloatBuffer(cubeFloat);
glBindBuffer(GL_ARRAY_BUFFER, cube);
glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
private float[] compileFloat(ArrayList<Float> list) {
float[] f = new float[list.size()];
for (int i = 0; i < list.size(); i++) {
f[i] = list.get(i);
}
return f;
}
private void renderCube() {
textures.get(0).bind();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, cube);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, texture);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, 24 * (width * height * depth));
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();
}
의해 제어되는 하였다
비록 2x2x1 배열을 만드는 것은 완벽하게 작동합니다.
이것이 내가 잘못 생각한 것입니다. 어떻게 수정해야할지 모르겠습니다. (이것은.
우선, 2x2x1 배열이 완벽하게 잘 맞으면 참조 용 스크린 샷을 포함시켜야합니다. 그렇지 않으면 실제로 포함 된 다이어그램에서 잘못된 점을 설명하지 않은 것입니다. 둘째, [마지막 질문 (이 질문과 관련있는)] (http://stackoverflow.com/questions/20979673/lwjgl-textures-in-vbo)이 해결되었지만 답변을 수락하지 않았습니다. ... 당신은 그 대답을 받아 들여야하고 *** 다음에 *** 당신의 새로운 질문을하거나이 질문을 편집하여이 새로운 정보를 포함하고 이것을 삭제해야합니다. –
죄송합니다. 답변을 수락하고 2x2x1 배열의 스크린 샷을 업로드합니다. – zfollette
이와 같은 부동 소수점 변수로 제어되는 루프는 매우 드문 경우입니다. 너비 나 높이가 부동 소수점이라면 값에 따라 실제로 이상한 일이 발생할 수 있습니다. 어떤 경우에는, 정육면체의 개수가 정사각형을 형성하는 것이 정확하다는 것을 알 수 있습니다 : 3 ** 2 = 9, 5 ** 2 = 25. 그러나 이들이 정사각형이되기를 원합니다. 그래서 각 열은 1이 너무 많습니다 (홀수 차원의 경우). 솔직히, 내가 할 첫 번째 일은이 이상한 부동 소수점 루프 제어 논리를 제거하는 것입니다. –