[英]Problems drawing VBO with glDrawArrays using OpenGL/LWJGL
我很難讓VBO參與我的游戲。 我環顧四周,檢查了所有常見的錯誤,但是似乎沒有什么可以使它們畫出來的。
以下是相關代碼的執行順序:
運行一次:
public void startLWJGL() {
try {
Display.setParent(game.getCanvas());
Display.create();
} catch (LWJGLException ex) {
System.err.print("LWJGL failed to initialize.");
System.exit(-1);
}
// Initialize
GL11.glMatrixMode(GL11.GL_PROJECTION_MATRIX);
GL11.glLoadIdentity();
GL11.glOrtho(0, 800, 0, 600, 1, -1); // L, R, B, T, Near, Far
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glClearColor(0.01f,0.05f,0.1f,1f);
GL11.glDisable(GL11.GL_DEPTH_TEST);
//GL11.glDisable(GL11.GL_BLEND);
GL11.glViewport(0, 0, 800, 600);
Renderer.init();
}
public static void init() {
BALL_GEO = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, BALL_GEO);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, makeBallGeometry(), GL15.GL_STATIC_DRAW);
COLOR_BUF = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, COLOR_BUF);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, makeSolidColBuffer(1f, 0f, 1f, 1f, (CIRCLE_SEGMENTS + 2)), GL15.GL_STATIC_DRAW);
}
運行每一幀:
private void tick(long delta) {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
Renderer.testRender();
}
public static void testRender() {
drawBall(new Ball(new Vector(200, 200), null, 50.0));
// This is just test stuff that DOES work
GL11.glColor4f(1f, 1f, 1f, 1f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(100, 100);
GL11.glVertex2f(100, 400);
GL11.glVertex2f(200, 400);
GL11.glVertex2f(200, 100);
GL11.glEnd();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
//GL11.glLoadIdentity();
GL11.glTranslatef(400f, 200f, 1f);
GL11.glScalef(0.5f, 0.5f, 0.5f);
GL11.glColor4f(0f, 1f, 1f, 1f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(100, 100);
GL11.glVertex2f(100, 400);
GL11.glVertex2f(200, 400);
GL11.glVertex2f(200, 100);
GL11.glEnd();
GL11.glPopMatrix();
}
public static void drawBall(Ball o) {
GL11.glMatrixMode(GL11.GL_MODELVIEW);
float x = (float) o.getPos().x;
float y = (float) o.getPos().y;
float s = (float) o.getRadius();
GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, BALL_GEO);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, COLOR_BUF);
GL11.glColorPointer(4, GL11.GL_FLOAT, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL11.glPushMatrix();
//GL11.glLoadIdentity();
GL11.glTranslatef(x, y, 0f);
GL11.glScalef(s, s, s);
GL11.glDrawArrays(GL11.GL_TRIANGLE_FAN, 0, (CIRCLE_SEGMENTS + 2));
GL11.glDisableClientState(GL11.GL_COLOR_ARRAY);
GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glPopMatrix();
}
用英語來講,我正在2D中以不同的大小和位置渲染純色圓圈。 我使用即時模式測試了幾何圖形,並且效果很好。 這可能真是愚蠢,但我無法弄清楚我的一生。 我在另一台計算機上運行此代碼,它吐出了0x05錯誤硬崩潰,但在此計算機上它根本無法呈現。 Ball對象的構造函數為其位置使用一個矢量,一個速度矢量以及一個兩倍的半徑。
編輯:這是那些詢問的幾何和顏色緩沖區代碼:
private static FloatBuffer makeBallGeometry() {
FloatBuffer buffer = BufferUtils.createFloatBuffer((CIRCLE_SEGMENTS + 2) * 3);
float theta = 2f * (float) Math.PI / CIRCLE_SEGMENTS; // Divisions in Radians
float tanFac = (float) Math.tan(theta); // Scalar for tangenial line
float radFac = (float) Math.cos(theta); // Scalar for radial line
float x = 50f;
float y = 0f;
float tx, ty;
buffer.put(0f);
buffer.put(0f);
buffer.put(0f);
for (int i = 0; i <= CIRCLE_SEGMENTS; i++) {
buffer.put(x);
buffer.put(y);
buffer.put(0f);
tx = -y; // Tangent
ty = x;
x += tx * tanFac; // Adjust over by tanFac
y += ty * tanFac;
x *= radFac; // Shrink by radFac
y *= radFac;
}
return buffer;
}
private static FloatBuffer makeSolidColBuffer(float r, float g, float b, float a, int size) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(size * 4);
for (int i = 0; i < size; i++) {
buffer.put(r);
buffer.put(g);
buffer.put(b);
buffer.put(a);
}
return buffer;
}
正如Andon M. Coleman指出的那樣,我的問題是我忽略了在緩沖區上調用flip(),實際上並沒有傳遞任何信息字節。 我在返回顏色和頂點緩沖區之前將buffer.flip()添加到了顏色緩沖區和頂點緩沖區,現在一切似乎都可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.