gpt4 book ai didi

java - LWJGL 3.1.6 在 Win 10 上崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:54 25 4
gpt4 key购买 nike

即使这个问题被问了多次(我读了所有这些,但没有解决方案对我有用),我正在尝试使用 LWJGL 和 OpenGL 来建模矩形,但每次都会崩溃。这是我的 PC 统计信息:

AMD 锐龙 1600x |微星 Nvidia GTX 1060 (6GB) |微星 x370 Carbon Pro 主板

我还在 Intel 设置上尝试过此操作,使用 i7 处理器和 Nvidia Quadro K 1000M 设置,但您可以在下面看到相同的错误:

https://hastebin.com/ayiqiritov.makefile

我的绘图方法:

public void render(RawModel model){
GL30.glBindVertexArray(model.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, model.getVertexCount());
GL20.glDisableVertexAttribArray(0);
GL30.glBindVertexArray(0);
}

在本类(class)中,我创建 VAO 和 VBO 并将数据存储到其中:

    private List<Integer> vaos = new ArrayList<Integer>();
private List<Integer> vbos = new ArrayList<Integer>();

public RawModel loadToVAO(float[] positions) {
int vaoID = createVAO();
storeDataInAttributeList(0, positions);
unbindVAO();
return new RawModel(vaoID, positions.length / 3);
}

public void cleanUp() {
for (int vao : vaos) {
GL30.glDeleteVertexArrays(vao);
}
for (int vbo : vbos) {
GL15.glDeleteBuffers(vbo);
}
}

private int createVAO() {
int vaoID = GL30.glGenVertexArrays();
vaos.add(vaoID);
GL30.glBindVertexArray(vaoID);
return vaoID;
}

private void storeDataInAttributeList(int attributeNumber, float[] data) {
int vboID = GL15.glGenBuffers();
vbos.add(vboID);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
FloatBuffer buffer = storeDataInFloatBuffer(data);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

private void unbindVAO() {
GL30.glBindVertexArray(0);
}

private FloatBuffer storeDataInFloatBuffer(float[] data) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data).position(0);
buffer.flip();
return buffer;
}

我的主要方法:

        public static void main(String[] args){
if(!glfwInit()){
throw new IllegalStateException("Failed");
}

System.out.println(GL11.glGetString(GL11.GL_VERSION));

glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);

GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MINOR, 3);
GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MAJOR, 4);

long window = GLFW.glfwCreateWindow(640, 480, "Hello World", 0, 0);

if(window == 0){
throw new IllegalStateException("Failed to create Window");
}

GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - 640) / 2, (vidmode.height() - 480) / 2);

glfwShowWindow(window);

Loader loader = new Loader();
Renderer renderer = new Renderer();

float[] vertices = {
-0.5f, 0.5f, 0f,
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f,

0.5f, -0.5f, 0f,
0.5f, 0.5f, 0f,
-0.5f, 0.5f, 0f
};

RawModel model = loader.loadToVAO(vertices);

while(!glfwWindowShouldClose(window)){
renderer.prepare();
renderer.render(model);
glfwPollEvents();
}

loader.cleanUp();
GLFW.glfwTerminate();

}

所以我已经尝试过:

更新显卡驱动程序、更新 java、更新 Windows、设置新的 eclipse、重新安装 java 并删除 eclipse 中的 .metadata。

有人可以帮助我吗?

最佳答案

根据评论

I dont have implemented a shader yet

OpenGL 中最先进的渲染方式是使用 Shader

如果您不使用着色器,则必须通过 glVertexPointer 定义顶点数据数组。 glVertexPointer指定固定功能顶点坐标属性的数组。如果你没有着色器程序,那么你必须使用 Fixed Function Pipeline .

private void storeDataInAttributeList(int attributeNumber, float[] data) {
int vboID = GL15.glGenBuffers();
vbos.add(vboID);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
FloatBuffer buffer = storeDataInFloatBuffer(data);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);

GL11.glVertexPointer( 3, GL11.GL_FLOAT, 0, 0 ); // <---------

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}

此外,您还必须通过 glEnableClientState( GL_VERTEX_ARRAY ) 启用顶点坐标的客户端功能。 :

public void render(RawModel model){
GL30.glBindVertexArray(model.getVaoID());

GL11.glEnableClientState( GL11.GL_VERTEX_ARRAY ); // <---------

GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, model.getVertexCount());

GL11.glDisableClientState( GL11.GL_VERTEX_ARRAY ); // <---------

GL30.glBindVertexArray(0);
}
<小时/>

进一步注意,在使用像 GL30.glGenVertexArrays() 这样的 OpenGL 指令之前,您必须创建“GLCapability”实例并使 OpenGL 绑定(bind)可供使用。并且您必须确保 OpenGL 上下文是最新的。

调用 glfwMakeContextCurrent(window) GL.createCapabilities() 创建窗口之后和任何 OpenGL 指令之前:

long window = GLFW.glfwCreateWindow(640, 480, "Hello World", 0, 0);
if(window == 0){
throw new IllegalStateException("Failed to create Window");
}

GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - 640) / 2, (vidmode.height() - 480) / 2);

glfwMakeContextCurrent(window); // <-----

glfwShowWindow(window);

GL.createCapabilities(); // <-----

.....
<小时/>

你终于失踪了 glfwSwapBuffers int 渲染循环。 glfwSwapBuffers交换指定窗口的前后缓冲区。换句话说,简单地说,它将渲染到的缓冲区占用到屏幕上:

while(!glfwWindowShouldClose(window)){
renderer.prepare();
renderer.render(model);

glfwSwapBuffers(window); // <-----

glfwPollEvents();
}
<小时/>

另请参阅LWJGL 3 Guide - Getting Started

关于java - LWJGL 3.1.6 在 Win 10 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598412/

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