2014-06-16 2 views
0

저는 LWJGL을 가지고 놀았으며 원래는 두 개의 VBO를 사용하여 임의의 속도와 색상으로 큐브를 만드는 3D 공간을 만들었습니다 색깔).LWJGL - Interleaved VBO는 의도 한대로 작동하지 않습니다.

하나의 인터리브 된 VBO로 작동 시키려고 노력하고 있지만, 지금까지의 시도로 인해 단색, 단색으로 큐브가 '깜박'색과 여러 색으로 그려집니다. 꼭지점/색상에 대한 시작 위치 및 보폭과 관련하여 오류가있는 것처럼 보이지만 주위를 변경하면 도움이되지 않거나 아주 이상한 효과가 나타납니다. ,

package test3D.first.main; 

import java.nio.FloatBuffer; 
import java.util.ArrayList; 

import org.lwjgl.BufferUtils; 

import test3D.first.entities.*; 
import test3D.first.main.threads.Updater; 

import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL15.*; 

public class InterleavedDrawer { 

private int vboHandle; 
private static FloatBuffer drawData; 
final static int vertexSize = 3; 
final static int colorSize = 3; 
final static int normalSize = 3; 
private static int vertexQuantity; 

public InterleavedDrawer() { 

    initialise(); 

} 

private void initialise() { 

    drawData = BufferUtils.createFloatBuffer(0); 

    vboHandle = glGenBuffers(); 

    updateBuffers(Updater.objects); 

} 

public void draw() { 

    glBindBuffer(GL_ARRAY_BUFFER, vboHandle); 
    glVertexPointer(vertexSize, GL_FLOAT, 1, 0L); 
    glColorPointer(colorSize, GL_FLOAT, 1, 4L); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glDrawArrays(GL_TRIANGLES, 0, vertexQuantity); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 

} 

public void update() { 

    for (int i = 0; i < Updater.getObjectQuantity(); i++) { 

     drawData.put(Updater.objects.get(i).getVertices()); 
     drawData.put(Updater.objects.get(i).getColors()); 

    } 

    drawData.flip(); 

    glBindBuffer(GL_ARRAY_BUFFER, vboHandle); 
    glBufferData(GL_ARRAY_BUFFER, drawData, GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

} 

public void clear() { 

    drawData.clear(); 

} 

private void updateBuffers(ArrayList<AbstractEntity> objects) { 

    vertexQuantity = 0; 

    drawData.clear(); 

    for (int i = 0; i < objects.size(); i++) { 

     vertexQuantity += objects.get(i).getVertexQuantity(); 

    } 

    drawData = BufferUtils.createFloatBuffer(vertexSize * vertexQuantity + colorSize * vertexQuantity); 

} 

} 

내가 말했듯이 :

다음은 VBO를 만드는 클래스의 코드 (이 비 인터리브 버전으로 잘 작동하고 동등한 방법을 포함하고 있기 때문에 다른 곳에서 오류가 없도록한다)의 그들은 원인은 이상하게 색깔있는 큐브에서 '지역'을 만들어 4에 glColorPointer()에서 긴 값을 변경, 홀수 깜박이는 효과만큼 값을 떠나

glVertexPointer(vboHandle, GL_FLOAT, 1, 0L); 
glColorPointer(vboHandle, GL_FLOAT, 1, 3L); 

: 나는 오류가 라인에서 오는 의심 (0, 0, 0), (1, 0, 0), (0, 1, 0) 등등. 색상이 완전히 임의의 수레이기 때문에 어떤 의미가 없으며, 시도한 다른 값은 첫 번째 효과 이외의 다른 것을하지 않는 것 같습니다. 여기 값이나 다른 것을 오용하고 있습니까? 모든 도움을 매우 많이 감사드립니다, 미리 감사드립니다 :)

답변

0

스트라이드는 바이트로 지정됩니다. 따라서 스트라이드는 6 개의 부동 소수점 * 4 바이트 = 24이고 오프셋 0 (정점)과 12 (색상)이어야합니다.

또한 update()에 실수가 있습니다. 지금 정점 컬러 데이터 (개체 당 단일 삼각형을 가정) 다음과 같이 인터리빙된다 : V 번호는 벡터 (x, y, z) 및 C#을

(object 1 ) (object 2 ) 
V1V2V3 C1C2C3 V4V5V6 C4C5C6 ... 

이 색 (R, G, B). OpenGL은이 순서대로 예상 :

(object 1 ) (object 2 ) 
V1C1 V2C2 V3C3 V4C4 V5C5 V6C6 ... 

그래서 업데이트 루프의 몸이이 같은 (테스트하지) 내가 그 값을 사용하여 시도

float[] vertData = Update.object.get(i).getVertices(); 
float[] colorData = Update.object.get(i).getColors(); 

for(int j = 0; j < vertData.length; j += 3) { 
    drawData.put(vertData, j, 3) 
    drawData.put(colorData, j, 3) 
} 

More information

+0

로 변경해야합니다, 그러나 그것은 단지 검은 화면을 낳습니다 - 24와 12 이하의 값 조합은 미친 영상을줍니다 ... 왜 이것이일까요? 지금까지 입력 해 주셔서 감사합니다 :) – ACraftyMarmoset

+0

버텍스/색상 데이터의 인터리빙에 문제가 있습니다. 내 대답을 업데이트했습니다. –

+0

그게 다야! 고맙습니다. OpenGL이 버퍼를 포맷해야한다고 생각했던 것만 큼 많이 알았습니다. :) 좋은 하루 되세요! – ACraftyMarmoset

관련 문제