OpenGL 3 / GLFW Blank Viewport

0

Я перехожу во вторую "главу" на http://www.open.gl и сталкиваюсь с проблемой рисования, которую я не могу понять.

int main()
{
    //Initialize GLFW, create the window and the context
    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(1024, 768, "Open.GL Drawing 1", nullptr, nullptr);

    glfwMakeContextCurrent(window);

    //initialize GLEW after context creation
    glewExperimental = GL_TRUE;
    glewInit();

    //loading, compiling, and checking shaders takes place here
    [...]

    //create, link, and use the shader program
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glBindFragDataLocation(shaderProgram, 0, "outColor");
    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    //create and bind the vao for the position data
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    //triangle vertecies
    GLfloat verticies[] = {
         0.0f,  0.5f,
         0.5f, -0.5f,
        -0.5f, -0.5f
    };

    //vbo for verticies
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);

    //link, define, and enable the position attribute (aka, the verticies)
    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(posAttrib);

    //main loop!
    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
            glfwSetWindowShouldClose(window, GL_TRUE);

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
    }

    //clean up after yourself
    glfwTerminate();

    glDeleteProgram(shaderProgram);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glDeleteBuffers(1, &vbo);
    glDeleteVertexArrays(1, &vao);

    return EXIT_SUCCESS;
}

Vertex shader:

#version 150

in vec2 position;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
}

Фрагментный шейдер:

#version 150

out vec4 outColor;

void mian()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

При компиляции с

g++ -fdiagnostics-color -Wall -Wextra -std=c++11 -lGLEW -lGLU -lGL  -lglfw -o drawing1 drawing1.cpp

Я не получаю никаких предупреждений, но пустой экран при запуске программы. Я проверил пример кода, который он связывает, а также копию github источника примера. К сожалению, он использует SFML, тогда как я использую GLFW, поэтому я попытался компенсировать эту разницу.

Я сделал все возможное, чтобы подражать его примеру кода (порядок вещей и т.д.), А также добавить в последние несколько строк main() и основной цикл (не было упоминания об удалении шейдеров или очистке цвета видового экрана в учебнике, но эти утверждения присутствовали в его примере кода), но все же закончились с тем же результатом. Проверка glGetError() дала мне неверную ошибку перечисления, но в этом сообщении говорится, что это может быть ожидаемое поведение с помощью glewExperimental.

После этого я не уверен, как дальше изолировать проблему. Я с нетерпением жду, чтобы кто-то указал, что будет, очевидно, простой ошибкой. знак равно

  • 1
    Две вещи: во-первых, попробуйте поместить glGetError() после glewInit() чтобы он сбрасывал флаг ошибки; затем поместите glGetError() в других местах, и он либо должен отобразить 0 либо другой код ошибки, не связанный с GLEW. Во-вторых, связывание вашей шейдерной программы может привести к ошибкам связывания, и вы должны проверить их; в противном случае ваш шейдер может быть сломан без вашего ведома (проверьте в заголовке opengl.org/sdk/docs/tutorials/ClockworkCoders/loading.php. Ссылки на то, как это делается для программ).
  • 1
    Да, и в чем может быть проблема: основная функция вашего фрагментного шейдера на самом деле называется mian . Вы проверяете журналы ошибок после компиляции ваших шейдеров? Эту ошибку легко было бы обнаружить. Проверка журналов ошибок, и если шейдеры действительно успешно скомпилированы, действительно рекомендуется :)
Показать ещё 4 комментария
Теги:
opengl
glfw
glx

1 ответ

1
Лучший ответ

Как отметил Джо Дьюд, я не очень хорошо читал свой шейдерный код. Для записи я mian вместо main в моем шейдере фрагмента, который вызвал проблемы. По его предложению я добавил код для проверки ошибок в связывании (я уже проверял ошибки компиляции) и, конечно же, когда я воссоздал свою опечатку, жалобщик связывает.

Fragment info
-------------
(0) : error C3001: no program defined

Спасибо Джо. знак равно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню