Я дам всю информацию.Я использую с ++.Неважно, что я пытаюсь, glClear()
работает, а рендеринг меша - нет.Нет ошибок.
Я перешел с freeglut на glfw.У меня не было проблем раньше.У меня есть glfw3 dll и lib и то же самое для glew.У меня также есть библиотека OpenGL32, связанная из-за неразрешенных внешних проблем.
Я использую Visual Studio 2017, и библиотеки обновлены до последней версии.
Я получил glfw с основного сайта glfw и загрузил 64-битные двоичные файлы.Я получил glew 32 и 64-разрядные двоичные файлы из http://glew.sourceforge.net/. Я скомпилировал как 64-разрядный и запустить его на Windows 10 64-разрядных.
В настоящее время компилируется и работает без ошибок кода.
РЕДАКТИРОВАТЬ: Я принял некоторые советы, но до сих пор не вижу четырехугольника.Спасибо за ввод.
Новый код:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
GLFWwindow * window;
int width;
int height;
unsigned int vertex_array_buffer;
unsigned int vertex_buffer;
unsigned int index_buffer;
float vertex_model[24] = {
-0.5f, -0.5f, 0.0f,
0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.0f,
0.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.0f,
1.0f, 1.0f, 1.0f,
0.5f, -0.5f, 0.0f,
1.0f, 0.0f, 1.0f
};
unsigned int index_model[6] = {
0, 1, 2,
0, 2, 3
};
unsigned int program;
float ratio;
int main() {
if (!glfwInit()) {
exit(-1);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
window = glfwCreateWindow(640, 480, "RenderEngine v0.0.0", NULL, NULL);
if (!window)
{
exit(-1);
}
glfwMakeContextCurrent(window);
if (glewInit()) {
exit(-1);
}
glfwSwapInterval(1);
unsigned int vert_shader;
unsigned int frag_shader;
const char * vert_shader_text;
const char * frag_shader_text;
std::ifstream file;
std::string buffer;
size_t f_size;
file.open("shader.vert", std::ifstream::in | std::ifstream::binary);
file.seekg(0, std::ios::end);
f_size = file.tellg();
buffer.resize(f_size);
file.seekg(0);
file.read(&buffer[0], f_size);
file.close();
vert_shader_text = buffer.c_str();
buffer.clear();
file.open("shader.frag", std::ifstream::in | std::ifstream::binary);
file.seekg(0, std::ios::end);
f_size = file.tellg();
buffer.resize(f_size);
file.seekg(0);
file.read(&buffer[0], f_size);
file.close();
frag_shader_text = buffer.c_str();
vert_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vert_shader, 1, &vert_shader_text, NULL);
glCompileShader(vert_shader);
int result = GL_FALSE;
int log_length;
glGetShaderiv(vert_shader, GL_COMPILE_STATUS, &result);
glGetShaderiv(vert_shader, GL_INFO_LOG_LENGTH, &log_length);
std::vector<char> vert_shader_error((log_length > 1) ? log_length : 1);
glGetShaderInfoLog(vert_shader, log_length, NULL, &vert_shader_error[0]);
std::cout << &vert_shader_error[0] << '\n';
result = GL_FALSE;
frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(frag_shader, 1, &frag_shader_text, NULL);
glCompileShader(frag_shader);
glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &result);
glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &log_length);
std::vector<char> frag_shader_error((log_length > 1) ? log_length : 1);
glGetShaderInfoLog(frag_shader, log_length, NULL, &frag_shader_error[0]);
std::cout << &frag_shader_error[0] << '\n';
program = glCreateProgram();
glAttachShader(program, vert_shader);
glAttachShader(program, frag_shader);
glBindAttribLocation(program, 0, "pos");
glBindAttribLocation(program, 1, "color");
glLinkProgram(program);
glDeleteShader(vert_shader);
glDeleteShader(frag_shader);
glGetProgramiv(program, GL_LINK_STATUS, &result);
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_length);
std::vector<char> program_error((log_length > 1) ? log_length : 1);
glGetProgramInfoLog(program, log_length, NULL, &program_error[0]);
std::cout << &program_error[0] << '\n';
glUseProgram(program);
glGenVertexArrays(1, &vertex_array_buffer);
glBindVertexArray(vertex_array_buffer);
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_model), vertex_model, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void*)(sizeof(float) * 3));
glGenBuffers(1, &index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index_model), index_model, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
if (glGetError()) {
exit(-1);
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
while (!glfwWindowShouldClose(window))
{
glfwGetFramebufferSize(window, &width, &height);
ratio = width / (float)height;
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vertex_array_buffer);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
glBindVertexArray(0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
Также файлы шейдеров, если они вам нужны.Вершинный шейдер:
#version 330
in layout(location = 0) vec3 pos;
in layout(location = 1) vec3 color;
out vec3 out_color;
void main() {
gl_Position = vec4(pos, 1.0f);
out_color = color;
}
Фрагментный шейдер:
#version 330
in vec3 out_color;
out vec4 final_color;
void main() {
final_color = vec4(out_color, 1.0f);
}