Я прохожу вторую «главу» 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;
}
Вершинный шейдер:
#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()
дал мне недействительную ошибку enum, но эта почта говорит, что это может быть ожидаемое поведение с glewExperimental
,
После этого я не уверен, как еще изолировать проблему. Я с нетерпением жду, когда кто-то укажет, что, очевидно, будет простой ошибкой. знак равно
Как Джои Дьюд указал, что я не очень хорошо читал мой код шейдера. Для записи, это я печатал mian
вместо main
в моем фрагменте шейдера, который вызвал проблемы. По его предложению я добавил код для проверки ошибок компоновки (я уже проверял ошибки компиляции) и, конечно же, когда я воссоздал опечатку, компоновщик пожаловался.
Fragment info
-------------
(0) : error C3001: no program defined
Спасибо, Джои. знак равно