Created
November 21, 2023 19:22
-
-
Save JesseGuerrero/d35c2fce8c0d84fb824a2026ed320d98 to your computer and use it in GitHub Desktop.
C++ Dependencies OpenGL, SDL2, GLEW Example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SDL.h> | |
#include <GL/glew.h> | |
#include <iostream> | |
const int SCREEN_WIDTH = 800; | |
const int SCREEN_HEIGHT = 600; | |
// Vertex shader source code | |
const char* vertexShaderSource = R"( | |
#version 330 core | |
layout (location = 0) in vec3 aPos; | |
void main() | |
{ | |
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); | |
} | |
)"; | |
// Fragment shader source code | |
const char* fragmentShaderSource = R"( | |
#version 330 core | |
out vec4 FragColor; | |
void main() | |
{ | |
FragColor = vec4(1.0, 0.5, 0.2, 1.0); | |
} | |
)"; | |
int main(int argc, char* argv[]) { | |
// Initialize SDL | |
if (SDL_Init(SDL_INIT_VIDEO) < 0) { | |
std::cerr << "SDL initialization failed: " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
// Create an SDL window and OpenGL context | |
SDL_Window* window = SDL_CreateWindow("OpenGL Triangle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL); | |
if (!window) { | |
std::cerr << "SDL window creation failed: " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
SDL_GLContext context = SDL_GL_CreateContext(window); | |
if (!context) { | |
std::cerr << "SDL OpenGL context creation failed: " << SDL_GetError() << std::endl; | |
return -1; | |
} | |
// Initialize GLEW | |
glewExperimental = GL_TRUE; // Enable GLEW experimental features | |
GLenum glewError = glewInit(); | |
if (glewError != GLEW_OK) { | |
std::cerr << "GLEW initialization failed: " << glewGetErrorString(glewError) << std::endl; | |
return -1; | |
} | |
// Vertex Shader | |
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); | |
glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); | |
glCompileShader(vertexShader); | |
// Check for shader compile errors | |
GLint success; | |
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); | |
if (!success) { | |
GLchar infoLog[512]; | |
glGetShaderInfoLog(vertexShader, sizeof(infoLog), nullptr, infoLog); | |
std::cerr << "Vertex shader compilation failed:\n" << infoLog << std::endl; | |
return -1; | |
} | |
// Fragment Shader | |
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); | |
glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); | |
glCompileShader(fragmentShader); | |
// Check for shader compile errors | |
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); | |
if (!success) { | |
GLchar infoLog[512]; | |
glGetShaderInfoLog(fragmentShader, sizeof(infoLog), nullptr, infoLog); | |
std::cerr << "Fragment shader compilation failed:\n" << infoLog << std::endl; | |
return -1; | |
} | |
// Link shaders | |
GLuint shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glLinkProgram(shaderProgram); | |
// Check for linking errors | |
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); | |
if (!success) { | |
GLchar infoLog[512]; | |
glGetProgramInfoLog(shaderProgram, sizeof(infoLog), nullptr, infoLog); | |
std::cerr << "Shader program linking failed:\n" << infoLog << std::endl; | |
return -1; | |
} | |
glDeleteShader(vertexShader); | |
glDeleteShader(fragmentShader); | |
// Set up vertex data | |
GLfloat vertices[] = { | |
-0.5f, -0.5f, 0.0f, // Bottom left | |
0.5f, -0.5f, 0.0f, // Bottom right | |
0.0f, 0.5f, 0.0f // Top | |
}; | |
// Create VBO and VAO | |
GLuint VBO, VAO; | |
glGenVertexArrays(1, &VAO); | |
glGenBuffers(1, &VBO); | |
glBindVertexArray(VAO); | |
glBindBuffer(GL_ARRAY_BUFFER, VBO); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); | |
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); | |
glEnableVertexAttribArray(0); | |
glBindBuffer(GL_ARRAY_BUFFER, 0); | |
glBindVertexArray(0); | |
// Main loop | |
bool quit = false; | |
while (!quit) { | |
SDL_Event event; | |
while (SDL_PollEvent(&event)) { | |
if (event.type == SDL_QUIT) { | |
quit = true; | |
} | |
} | |
// Clear the screen | |
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); | |
glClear(GL_COLOR_BUFFER_BIT); | |
// Use the shader program | |
glUseProgram(shaderProgram); | |
// Draw the triangle | |
glBindVertexArray(VAO); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
glBindVertexArray(0); | |
// Swap the buffer | |
SDL_GL_SwapWindow(window); | |
} | |
// Cleanup | |
glDeleteVertexArrays(1, &VAO); | |
glDeleteBuffers(1, &VBO); | |
glDeleteProgram(shaderProgram); | |
SDL_GL_DeleteContext(context); | |
SDL_DestroyWindow(window); | |
SDL_Quit(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment