gpt4 book ai didi

java - 将顶点缓冲区对象与 gluPerspective 结合使用

转载 作者:行者123 更新时间:2023-12-01 14:21:29 26 4
gpt4 key购买 nike

我正在尝试了解顶点缓冲区对象。我已经能够在 2D 空间中成功渲染四边形(在初始化期间使用 glOrtho),但在使用 gluPerspective 渲染时使用 VBO 时遇到问题。

我正在使用 Java 和 LWJGL,并在下面附上了我的代码。目前,除了黑色透明之外,没有任何内容渲染到窗口。

public class GameWindow {
// Height and width of the viewport
private final int WIDTH = 800;
private final int HEIGHT = 600;

private final float zNear = 1f;
private final float zFar = 1000f;

long lastFrame, lastFps;
int fps;

public void start() {
try {
Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90, WIDTH / HEIGHT, zNear, zFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

float[] quadCoords = {
100, 100, -1,
300, 100, -1,
300, 300, -1,
100, 300, -1
};

float[] colorCoords = {
1, 0, 0,
0, 1, 0,
0, 0, 1,
1, 0, 1
};

FloatBuffer vertexData = BufferUtils.createFloatBuffer(4 * 3);
vertexData.put(quadCoords);
vertexData.flip();

FloatBuffer colorData = BufferUtils.createFloatBuffer(4 * 3);
colorData.put(colorCoords);
colorData.flip();

int vboVertex = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertex);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

int vboColor = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboColor);
glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

getDelta();
lastFps = TimeUtil.getTime();

while (!Display.isCloseRequested()) {
int delta = getDelta();
updateFPS();
glClear(GL_COLOR_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, vboVertex);
glVertexPointer(3, GL_FLOAT, 0, 0L);

glBindBuffer(GL_ARRAY_BUFFER, vboColor);
glColorPointer(3, GL_FLOAT, 0, 0L);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

Display.update();
Display.sync(60);
}
Display.destroy();
}

private int getDelta() {
long time = TimeUtil.getTime();
int delta = (int) (time - lastFrame);
lastFrame = time;

return delta;
}

public void updateFPS() {
if (TimeUtil.getTime() - lastFps > 1000) {
Display.setTitle("FPS: " + fps);
fps = 0;
lastFps += 1000;
}
fps++;
}

public static void main(String[] args) {
GameWindow window = new GameWindow();
window.start();
}
}

最佳答案

我认为你的四边形的顶点在视野之外。如果不设置 View 矩阵(例如通过 gluLookAt),相机将指向 -Z 轴。您要求 zNear 和 zFar 为 1.0 和 1000.0,因此将绘制 z 坐标 -1.0 和 -1000.0 之间的所有内容(zNear 和 zFar 类似于到相机的“距离”)。您还必须考虑到透视投影与正交投影确实不同。我想说,尝试将顶点移回到 Z 轴上,如下所示:

float[] quadCoords = {
100, 100, -500,
300, 100, -500,
300, 300, -500,
100, 300, -500
};

关于java - 将顶点缓冲区对象与 gluPerspective 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518979/

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