Created
April 17, 2023 00:56
-
-
Save asmwarrior/8c0be081ea10b0fd30fb706e501229c8 to your computer and use it in GitHub Desktop.
use opengl under codeblocks
This file contains hidden or 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 <GL/glew.h> | |
#include <GLFW/glfw3.h> | |
#include <iostream> | |
#include <glm/glm.hpp> | |
#include <glm/gtc/matrix_transform.hpp> | |
#include <glm/gtc/type_ptr.hpp> | |
const char* vertexShaderSource = R"glsl( | |
#version 330 core | |
layout (location = 0) in vec3 aPos; | |
uniform mat4 model; | |
uniform mat4 view; | |
uniform mat4 projection; | |
void main() | |
{ | |
gl_Position = projection * view * model * vec4(aPos, 1.0f); | |
} | |
)glsl"; | |
const char* fragmentShaderSource = R"glsl( | |
#version 330 core | |
out vec4 FragColor; | |
void main() | |
{ | |
FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); | |
} | |
)glsl"; | |
int main() | |
{ | |
// Initialize GLFW and create a window | |
glfwInit(); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
GLFWwindow* window = glfwCreateWindow(800, 600, "2D Grid in 3D Space", NULL, NULL); | |
glfwMakeContextCurrent(window); | |
// Initialize GLEW | |
glewExperimental = GL_TRUE; | |
glewInit(); | |
// Set up vertex data and buffers | |
float vertices[] = { | |
// Positions | |
-1.0f, -1.0f, 0.0f, | |
1.0f, -1.0f, 0.0f, | |
1.0f, 1.0f, 0.0f, | |
-1.0f, 1.0f, 0.0f | |
}; | |
unsigned int indices[] = { | |
0, 1, 2, | |
2, 3, 0 | |
}; | |
unsigned int VAO, VBO, EBO; | |
glGenVertexArrays(1, &VAO); | |
glGenBuffers(1, &VBO); | |
glGenBuffers(1, &EBO); | |
glBindVertexArray(VAO); | |
glBindBuffer(GL_ARRAY_BUFFER, VBO); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); | |
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); | |
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); | |
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); | |
glEnableVertexAttribArray(0); | |
glBindBuffer(GL_ARRAY_BUFFER, 0); | |
glBindVertexArray(0); | |
// Compile and link shaders | |
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); | |
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); | |
glCompileShader(vertexShader); | |
int success; | |
char infoLog[512]; | |
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); | |
if (!success) | |
{ | |
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); | |
std::cout << "Vertex shader compilation failed:\n" << infoLog << std::endl; | |
} | |
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); | |
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); | |
glCompileShader(fragmentShader); | |
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); | |
if (!success) | |
{ | |
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); | |
std::cout << "Fragment shader compilation failed:\n" << infoLog << std::endl; | |
} | |
unsigned int shaderProgram = glCreateProgram(); | |
glAttachShader(shaderProgram, vertexShader); | |
glAttachShader(shaderProgram, fragmentShader); | |
glLinkProgram(shaderProgram); | |
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); | |
if (!success) | |
{ | |
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); | |
std::cout << "Shader program linking failed:\n" << infoLog << std::endl; | |
} | |
glDeleteShader(vertexShader); | |
glDeleteShader(fragmentShader); | |
// Set up projection matrix | |
float aspectRatio = 800.0f / 600.0f; | |
glm::mat4 projection = glm::perspective(glm::radians(45.0f), aspectRatio, 0.1f, 100.0f); | |
// Main loop | |
while (!glfwWindowShouldClose(window)) | |
{ | |
// Handle input | |
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) | |
glfwSetWindowShouldClose(window, true); | |
// Set up view matrix | |
glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); | |
// Set up model matrix | |
glm::mat4 model = glm::mat4(1.0f); | |
// Clear screen and depth buffer | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
// Use shader program and set uniforms | |
glUseProgram(shaderProgram); | |
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); | |
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view)); | |
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model)); | |
// Draw grid | |
glBindVertexArray(VAO); | |
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); | |
// Swap buffers and poll events | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
} | |
// Clean up | |
glDeleteVertexArrays(1, &VAO); | |
glDeleteBuffers(1, &VBO); | |
glDeleteBuffers(1, &EBO); | |
glDeleteProgram(shaderProgram); | |
glfwTerminate(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The code is mainly generated by chatGPT, but I have to modify it to remove the build errors.
Those are the linker options.
And there should be one item named:
opengl32
in the linker library list.The
glfw
andglew
andglm
library for the msys2/mingw64 has to be installed bypacman
command.Such as:
And here is the result: