3D cube
This commit is contained in:
@@ -12,6 +12,7 @@ set(IncludeDIR ./include)
|
|||||||
find_package(SDL2 REQUIRED)
|
find_package(SDL2 REQUIRED)
|
||||||
find_package(SDL2_image REQUIRED)
|
find_package(SDL2_image REQUIRED)
|
||||||
find_package(PNG REQUIRED)
|
find_package(PNG REQUIRED)
|
||||||
|
find_package(JPEG REQUIRED)
|
||||||
|
|
||||||
set(THREADS_PREFER_PTHREAD_FLAD ON)
|
set(THREADS_PREFER_PTHREAD_FLAD ON)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
@@ -22,6 +23,7 @@ include_directories(${executable}
|
|||||||
${SDL2_INCLUDE_DIR}
|
${SDL2_INCLUDE_DIR}
|
||||||
${SDL2_IMAGE_INCLUDE_DIR}
|
${SDL2_IMAGE_INCLUDE_DIR}
|
||||||
${PNG_INCLUDE_DIR}
|
${PNG_INCLUDE_DIR}
|
||||||
|
${JPEG_INCLUDE_DIR}
|
||||||
${GLEW_INCLUDE_DIRS}
|
${GLEW_INCLUDE_DIRS}
|
||||||
${IncludeDIR}
|
${IncludeDIR}
|
||||||
)
|
)
|
||||||
@@ -38,10 +40,10 @@ set_target_properties(${executable} PROPERTIES
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(${executable}
|
target_link_libraries(${executable}
|
||||||
${PNG_LIBRARY}
|
|
||||||
SDL2
|
SDL2
|
||||||
SDL2_image
|
SDL2_image
|
||||||
PNG::PNG
|
PNG::PNG
|
||||||
|
JPEG::JPEG
|
||||||
Threads::Threads
|
Threads::Threads
|
||||||
OpenGL::OpenGL
|
OpenGL::OpenGL
|
||||||
OpenGL::GL
|
OpenGL::GL
|
||||||
|
|||||||
Binary file not shown.
@@ -1,15 +1,18 @@
|
|||||||
#version 130
|
#version 130
|
||||||
|
|
||||||
in vec2 position;
|
in vec3 position;
|
||||||
in vec2 texcoord;
|
in vec2 texcoord;
|
||||||
in vec3 colour;
|
in vec3 colour;
|
||||||
|
|
||||||
out vec3 Colour;
|
out vec3 Colour;
|
||||||
out vec2 TexCoord;
|
out vec2 TexCoord;
|
||||||
|
|
||||||
|
uniform mat4 model;
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 proj;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
Colour = colour;
|
Colour = colour;
|
||||||
TexCoord = texcoord;
|
TexCoord = texcoord;
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = proj * view * model * vec4(position, 1.0);
|
||||||
// Equivilent to vec4(position.x, position.y, 0.0, 1.0)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB |
BIN
OpenGL/cube/resources/textures/dirt.png
Normal file
BIN
OpenGL/cube/resources/textures/dirt.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 266 B |
Binary file not shown.
|
Before Width: | Height: | Size: 7.5 KiB |
BIN
OpenGL/cube/resources/textures/grass_side.png
Normal file
BIN
OpenGL/cube/resources/textures/grass_side.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 660 B |
BIN
OpenGL/cube/resources/textures/grass_top.png
Normal file
BIN
OpenGL/cube/resources/textures/grass_top.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 766 B |
@@ -3,6 +3,8 @@
|
|||||||
#include <SDL2/SDL_image.h>
|
#include <SDL2/SDL_image.h>
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -70,13 +72,50 @@ int main(int argc, char** argv) {
|
|||||||
glClearColor(0.1f, 0.45f, 0.9f, 1.0f);
|
glClearColor(0.1f, 0.45f, 0.9f, 1.0f);
|
||||||
|
|
||||||
// GL Screen coordinates of a 2D triangle followed by the colour and the texture coordinates
|
// GL Screen coordinates of a 2D triangle followed by the colour and the texture coordinates
|
||||||
GLint numOfVerticies = 28;
|
GLint numOfVerticies = 288;
|
||||||
float vertices[] = {
|
float vertices[] = {
|
||||||
// Positions Colour Texture
|
// Positions Colour Texture
|
||||||
-0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
|
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
-0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom-left
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
|
||||||
|
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
|
||||||
|
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
|
||||||
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
-0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
|
||||||
|
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f
|
||||||
};
|
};
|
||||||
|
|
||||||
// Element array - order of verticies drawn
|
// Element array - order of verticies drawn
|
||||||
@@ -111,10 +150,14 @@ int main(int argc, char** argv) {
|
|||||||
Shader simpleShader;
|
Shader simpleShader;
|
||||||
simpleShader.load("./resources/shaders/simple").attatch().link().use();
|
simpleShader.load("./resources/shaders/simple").attatch().link().use();
|
||||||
|
|
||||||
|
|
||||||
// Load texture from file
|
// Load texture from file
|
||||||
SDL_Surface* sur = IMG_Load("./resources/textures/dirtside.png");
|
SDL_Surface* sur = IMG_Load("./resources/textures/dirt.png");
|
||||||
if (sur == NULL)
|
if (sur == NULL) {
|
||||||
std::cerr << "Failed to load image: " << IMG_GetError() << std::endl;
|
std::cerr << "Failed to load image: " << IMG_GetError() << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Loaded texture 'dirt.png'" << std::endl;
|
||||||
|
}
|
||||||
// Set up a GL texture
|
// Set up a GL texture
|
||||||
GLuint tex;
|
GLuint tex;
|
||||||
glBindTexture(GL_TEXTURE_2D, tex);
|
glBindTexture(GL_TEXTURE_2D, tex);
|
||||||
@@ -126,21 +169,42 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
GLint posAttrib = glGetAttribLocation(simpleShader.getProgram(), "position");
|
GLint posAttrib = glGetAttribLocation(simpleShader.getProgram(), "position");
|
||||||
glEnableVertexAttribArray(posAttrib);
|
glEnableVertexAttribArray(posAttrib);
|
||||||
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE,
|
||||||
7*sizeof(float), 0);
|
8*sizeof(float), 0);
|
||||||
|
|
||||||
GLint colAttrib = glGetAttribLocation(simpleShader.getProgram(), "colour");
|
GLint colAttrib = glGetAttribLocation(simpleShader.getProgram(), "colour");
|
||||||
glEnableVertexAttribArray(colAttrib);
|
glEnableVertexAttribArray(colAttrib);
|
||||||
glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE,
|
||||||
7*sizeof(float), (void*)(2*sizeof(float)));
|
8*sizeof(float), (void*)(3*sizeof(float)));
|
||||||
|
|
||||||
GLint texAttrib = glGetAttribLocation(simpleShader.getProgram(), "texcoord");
|
GLint texAttrib = glGetAttribLocation(simpleShader.getProgram(), "texcoord");
|
||||||
glEnableVertexAttribArray(texAttrib);
|
glEnableVertexAttribArray(texAttrib);
|
||||||
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE,
|
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE,
|
||||||
7*sizeof(float), (void*)(5*sizeof(float)));
|
8*sizeof(float), (void*)(6*sizeof(float)));
|
||||||
|
|
||||||
GLint triangleUniColour = glGetUniformLocation(simpleShader.getProgram(), "triangleColour");
|
|
||||||
glUniform3f(triangleUniColour, 0.2f, 0.8f, 0.3f);
|
// Model matrice
|
||||||
|
glm::mat4 model = glm::mat4(1.0f);
|
||||||
|
// Gets uniform for model matrice, to be used later
|
||||||
|
GLint uniTrans = glGetUniformLocation(simpleShader.getProgram(), "model");
|
||||||
|
|
||||||
|
// View matrice
|
||||||
|
glm::mat4 view = glm::lookAt(
|
||||||
|
glm::vec3(1.2f, 1.2f, 1.2f),
|
||||||
|
glm::vec3(0.0f, 0.0f, 0.0f),
|
||||||
|
glm::vec3(0.0f, 0.0f, 1.0f)
|
||||||
|
);
|
||||||
|
// Get uniform and send it to the GPU
|
||||||
|
GLint uniView = glGetUniformLocation(simpleShader.getProgram(), "view");
|
||||||
|
glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
|
||||||
|
|
||||||
|
// Projection matrice
|
||||||
|
glm::mat4 proj = glm::perspective(glm::radians(45.0f), 1.0f, 1.0f, 10.0f);
|
||||||
|
// Get uniform and send it to the GPU
|
||||||
|
GLint uniProj = glGetUniformLocation(simpleShader.getProgram(), "proj");
|
||||||
|
glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (!game->isWindowClosed) {
|
while (!game->isWindowClosed) {
|
||||||
@@ -149,10 +213,18 @@ int main(int argc, char** argv) {
|
|||||||
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT)
|
if (event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT)
|
||||||
game->isWindowClosed = true;
|
game->isWindowClosed = true;
|
||||||
|
|
||||||
|
// Rotate cube
|
||||||
|
model = glm::rotate(model, glm::radians(1.0f), glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
|
model = glm::rotate(model, glm::radians(1.0f), glm::vec3(1.0f, 0.0f, 0.0f));
|
||||||
|
// model = glm::rotate(model, glm::radians(1.0f), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||||
|
glm::vec4 result = model * glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
|
||||||
|
|
||||||
// Clear the screen
|
// Clear the screen
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
// Draw a triangle from the 3 vertices
|
// Draw a triangle from the 3 vertices
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||||
// Swap buffers
|
// Swap buffers
|
||||||
SDL_GL_SwapWindow(game->window);
|
SDL_GL_SwapWindow(game->window);
|
||||||
}
|
}
|
||||||
|
|||||||
2
OpenGL/cube/src/texture.cpp
Normal file
2
OpenGL/cube/src/texture.cpp
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include "texture.hpp"
|
||||||
|
|
||||||
6
OpenGL/cube/src/texture.hpp
Normal file
6
OpenGL/cube/src/texture.hpp
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef _TEXTURE_H_
|
||||||
|
#define _TEXTURE_H_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user