Я хотел бы сделать треугольник с помощью OpenGL 4.5. Я нашел множество примеров в Интернете, используя более старые версии OpenGL, но ни один из них не использует функции OpenGL 4.5. Поэтому я попытался сам «обновить» код. Это старый рабочий код:Как использовать vao и буферы в OpenGL 4.5
// Triangles to render
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) },
{ vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } };
//Initialize
glGenVertexArrays(1, &vaos);
glBindVertexArray(vaos);
glGenBuffers(1, &buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(0);
//Render
GLint index;
index = glGetUniformLocation(program, "projectionMatrix");
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix));
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vaos);
glDrawArrays(GL_TRIANGLES, 0, nvertices);
И «обновленный» его к этому коду, который не появляется, чтобы нарисовать что-нибудь на экране:
// Same triangles
// Initialize
glCreateVertexArrays(1, &vaos);
glEnableVertexArrayAttrib(vaos, 0);
glVertexArrayAttribFormat(vaos, 0, 3, GL_FLOAT, GL_FALSE, 0);
glCreateBuffers(1, &buffers);
glNamedBufferData(buffers, sizeof(triangles), triangles, GL_STATIC_DRAW);
glVertexArrayAttribBinding(vaos, 0, 0);
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);
// Same render
Может кто-нибудь сказать мне, что я сделал неправильно ?
Edit: triangle.frag
#version 450
in vec4 gl_FragCoord;
out vec4 fColor;
void main()
{
fColor = vec4 (0.0, 0.0, 1.0, 1.0);
}
triangle.vert
#version 450
layout (location = 0) in vec3 vPosition;
uniform mat3 projectionMatrix;
void main()
{
vec3 tmp = projectionMatrix*vPosition;
gl_Position = vec4 (tmp, 1.0f);
}
Вы должны иметь очень современный графический процессор для поддержки OpenGL версии 4.х, и даже в этом случае вы можете ограничить более раннюю реализацию, если драйверы еще не существуют. Что вы используете? Шейдеры - обычная проблема. –
У меня есть GTX 760 и установлены последние версии драйверов. Я использую glew для загрузки расширений OpenGL, и он подтверждает, что ARB_direct_state_access доступен. – para
попробуйте #version 430 вместо #version 450 .... это говорит, что GTX 760 поддерживает OpenGL 4.3 http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-760/specifications –