OpenGL — Привет треугольник не появляется

У меня есть демо OpenGL — Hello Triangle, но я не могу заставить его работать. Кто-нибудь знает, где может быть проблема? Я могу скомпилировать и запустить код, но треугольник не появляется. Открывается только окно с серым фоном.

#include <glew/glew.h>
#include <glfw/glfw3.h>
#include <stdio.h>
#include <stdlib.h>

int main() {

if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
return -1;
}

GLFWwindow* window = glfwCreateWindow(800, 800, "Anton Tutorials - Hello Triangle", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to open GLFW window.\n");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);

glewExperimental = GL_TRUE; // Needed in core profile
const GLenum err = glewInit();

if (err != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
return -1;
}

// Enable depth-testing
glEnable(GL_DEPTH_TEST);
// Depth-testing interprets a smaller value as "closer"glDepthFunc(GL_LESS);

//Defining vertices for triangle
GLfloat points[] = {
0.0f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
};

//Vertex buffer object creation
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

//Vertex attribute object creation
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

//Loading shaders - Vertex shader
const char* vertex_shader =
"#version 410\n""in vec3 vp; ""void main() {"" gl_Position = vec4 (vp, 1.0);"" }";

GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);

//Loading shaders - Fragment shader
const char* fragment_shader =
"#version 410\n""out vec4 frag_colour; ""void main() {"" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"" }";

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);

//Attach shaders
GLuint shader_programme = glCreateProgram();
glAttachShader(shader_programme, fs);
glAttachShader(shader_programme, vs);
glLinkProgram(shader_programme);

//RenderLoop
while (!glfwWindowShouldClose(window))
{
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_programme);
glBindVertexArray(vao);

glDrawArrays(GL_TRIANGLES, 0, 3);

glfwPollEvents();
glfwSwapBuffers(window);
}

glfwTerminate();
return 0;
}

0

Решение

Вам необходимо включить атрибут «vp».

Ранее в вашем коде вы сказали это:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

Если расположение макета вашей переменной vp-шейдера изменится, это теперь может быть недействительным.

Было бы лучше сделать это:

GLint vpAttr = glGetAttribLocation(shader_programme, "vp");
glVertexAttribPointer(vpAttr, 3, GL_FLOAT, GL_FALSE, 0, NULL);

Затем включите атрибут:

glEnableVertexAttribArray(vpAttr);

В противном случае вам следует явно указать расположение макета vp в вершинном шейдере, чтобы вы могли уверенно использовать 0:

"layout (location=0) in vec3 vp;"
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]