150 lines
4.2 KiB
C++
150 lines
4.2 KiB
C++
#include <GL/glew.h>
|
|
#include <GLFW/glfw3.h>
|
|
#include <glm/glm.hpp>
|
|
#include <glm/gtc/matrix_transform.hpp>
|
|
#include <glm/gtc/type_ptr.hpp>
|
|
#include <iostream>
|
|
|
|
GLFWwindow* StartGLU();
|
|
void CreateVBOVAO(GLuint& VAO, GLuint& VBO, const float* vertices, size_t vertexCount);
|
|
GLuint CreateShaderProgram(const char* vertexSource, const char* fragmentSource);
|
|
|
|
const char* vertexShaderSource = R"glsl(
|
|
#version 330 core
|
|
layout (location = 0) in vec3 aPos;
|
|
void main() {
|
|
gl_Position = vec4(aPos, 1.0);
|
|
}
|
|
)glsl";
|
|
|
|
const char* fragmentShaderSource = R"glsl(
|
|
#version 330 core
|
|
out vec4 FragColor;
|
|
void main() {
|
|
FragColor = vec4(1.0, 0.5, 0.2, 1.0); // Orange color
|
|
}
|
|
)glsl";
|
|
|
|
int main() {
|
|
GLFWwindow* window = StartGLU();
|
|
GLuint shaderProgram = CreateShaderProgram(vertexShaderSource, fragmentShaderSource);
|
|
|
|
//vertex data
|
|
float vertices[] = {
|
|
-0.5f, -0.5f, 0.0f, // Bottom left
|
|
0.5f, -0.5f, 0.0f, // Bottom right
|
|
0.0f, 0.5f, 0.0f // Top center
|
|
};
|
|
|
|
// Create VAO and VBO
|
|
GLuint VAO, VBO;
|
|
CreateVBOVAO(VAO, VBO, vertices, sizeof(vertices) / sizeof(float));
|
|
|
|
while (!glfwWindowShouldClose(window)) {
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
glUseProgram(shaderProgram);
|
|
|
|
glBindVertexArray(VAO);
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
|
|
glfwSwapBuffers(window);
|
|
glfwPollEvents();
|
|
}
|
|
|
|
glDeleteVertexArrays(1, &VAO);
|
|
glDeleteBuffers(1, &VBO);
|
|
glDeleteProgram(shaderProgram);
|
|
|
|
glfwTerminate();
|
|
return 0;
|
|
}
|
|
|
|
GLFWwindow* StartGLU() {
|
|
if (!glfwInit()) {
|
|
std::cout << "Failed to initialize GLFW, panic" << std::endl;
|
|
return nullptr;
|
|
}
|
|
GLFWwindow* window = glfwCreateWindow(800, 600, "3D_TEST", NULL, NULL);
|
|
if (!window) {
|
|
std::cerr << "Failed to create GLFW window." << std::endl;
|
|
glfwTerminate();
|
|
return nullptr;
|
|
}
|
|
glfwMakeContextCurrent(window);
|
|
|
|
glewExperimental = GL_TRUE;
|
|
if (glewInit() != GLEW_OK) {
|
|
std::cerr << "Failed to initialize GLEW." << std::endl;
|
|
glfwTerminate();
|
|
return nullptr;
|
|
}
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
return window;
|
|
}
|
|
|
|
GLuint CreateShaderProgram(const char* vertexSource, const char* fragmentSource) {
|
|
// Vertex shader
|
|
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertexShader, 1, &vertexSource, nullptr);
|
|
glCompileShader(vertexShader);
|
|
|
|
GLint success;
|
|
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
|
|
if (!success) {
|
|
char infoLog[512];
|
|
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
|
|
std::cerr << "Vertex shader compilation failed: " << infoLog << std::endl;
|
|
}
|
|
|
|
// Fragment shader
|
|
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragmentShader, 1, &fragmentSource, nullptr);
|
|
glCompileShader(fragmentShader);
|
|
|
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
|
|
if (!success) {
|
|
char infoLog[512];
|
|
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
|
|
std::cerr << "Fragment shader compilation failed: " << infoLog << std::endl;
|
|
}
|
|
|
|
// Shader program
|
|
GLuint shaderProgram = glCreateProgram();
|
|
glAttachShader(shaderProgram, vertexShader);
|
|
glAttachShader(shaderProgram, fragmentShader);
|
|
glLinkProgram(shaderProgram);
|
|
|
|
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
|
|
if (!success) {
|
|
char infoLog[512];
|
|
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
|
|
std::cerr << "Shader program linking failed: " << infoLog << std::endl;
|
|
}
|
|
|
|
glDeleteShader(vertexShader);
|
|
glDeleteShader(fragmentShader);
|
|
|
|
return shaderProgram;
|
|
}
|
|
|
|
void CreateVBOVAO(GLuint& VAO, GLuint& VBO, const float* vertices, size_t vertexCount) {
|
|
//VAO
|
|
glGenVertexArrays(1, &VAO);
|
|
glBindVertexArray(VAO);
|
|
|
|
//VBO
|
|
glGenBuffers(1, &VBO);
|
|
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
|
glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(float), vertices, GL_STATIC_DRAW);
|
|
|
|
//vertex attribute pointers
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
|
glEnableVertexAttribArray(0);
|
|
|
|
glBindVertexArray(0);
|
|
}
|