تعطل LWJGL 3.1.6 في Win 10

1

حتى إذا تم طرح هذا السؤال عدة مرات (قرأت كل ذلك ولم يعمل أي حل بالنسبة لي) ، فأنا أحاول تصميم نموذج مستطيل باستخدام LWJGL و OpenGL ، ولكنه يتعطل في كل مرة. هنا إحصائيات الكمبيوتر الخاص بي:

AMD-Ryzen 1600x | MSI Nvidia GTX 1060 (6 جيجابايت) | اللوحة الأم MSI 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);
}

في هذه الفئة أقوم بإنشاء VAOs و VBOs وتخزين البيانات في تلك:

    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();

}

لذلك حاولت بالفعل:

قم بتحديث برامج التشغيل لبطاقة الجرافيك ، وتحديث جافا ، وتحديث Windows ، وإعداد كسوف جديد ، وإعادة تثبيت جافا وحذف بيانات التعريف في الكسوف.

هل يمكن لأي شخص مساعدتي؟

1 إجابة

0

بحسب التعليق

I dont have implemented a shader yet

ستكون الطريقة الحديثة لتقديم OpenGL هي استخدام Shader .

إذا كنت لا تستخدم جهاز تظليل ، فعليك تحديد مجموعة بيانات الرأس من قبل glVertexPointer . glVertexPointer يحدد مصفوفة لسمة إحداثيات قمة ثابتة. إذا لم يكن لديك برنامج تظليل ، فعليك استخدام خط الأنابيب ذو الوظيفة الثابتة .

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);
}

لاحظ أيضًا أنه يجب عليك إنشاء مثيل "إمكانيات GLC" وجعل روابط OpenGL متاحة للاستخدام قبل استخدام تعليمات OpenGL مثل GL30.glGenVertexArrays() وعليك التأكد من أن سياق 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 في حلقة تقديم. glfwSwapBuffers تبديل المخازن المؤقتة الأمامية والخلفية للنافذة المحددة. وبعبارة أخرى بسيطة ، فإنه يربط المخزن المؤقت حيث قدمت على الشاشة:

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

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

    glfwPollEvents();
}

انظر أيضًا دليل LWJGL 3 - الشروع في العمل

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام