From a112e8e4f1a6cc10b8bd11ea5fcf6b6a247896f7 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 5 Oct 2019 00:10:15 +0100 Subject: [PATCH] S h a d e r s - can sleep now --- resources/shaders/simple.frag | 12 ++++ resources/shaders/simple.vert | 15 ++++ resources/textures/dirt.png | Bin 0 -> 266 bytes resources/textures/grass_side.png | Bin 0 -> 660 bytes resources/textures/grass_top.png | Bin 0 -> 766 bytes src/game.cpp | 5 ++ src/renderer/shader.cpp | 111 ++++++++++++++++++++++++++++++ src/renderer/shader.hpp | 21 ++++++ src/util/filereader.cpp | 15 ++++ src/util/filereader.hpp | 14 ++++ 10 files changed, 193 insertions(+) create mode 100644 resources/shaders/simple.frag create mode 100644 resources/shaders/simple.vert create mode 100644 resources/textures/dirt.png create mode 100644 resources/textures/grass_side.png create mode 100644 resources/textures/grass_top.png create mode 100644 src/util/filereader.cpp create mode 100644 src/util/filereader.hpp diff --git a/resources/shaders/simple.frag b/resources/shaders/simple.frag new file mode 100644 index 0000000..9ce4bb4 --- /dev/null +++ b/resources/shaders/simple.frag @@ -0,0 +1,12 @@ +#version 330 + +in vec2 TexCoord; +out vec4 outColour; + +uniform vec3 triangleColour; + +uniform sampler2D tex; + +void main() { + outColour = texture(tex, TexCoord); +} diff --git a/resources/shaders/simple.vert b/resources/shaders/simple.vert new file mode 100644 index 0000000..6e080eb --- /dev/null +++ b/resources/shaders/simple.vert @@ -0,0 +1,15 @@ +#version 330 + +in vec3 position; +in vec2 texcoord; + +out vec2 TexCoord; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 proj; + +void main() { + TexCoord = texcoord; + gl_Position = proj * view * model * vec4(position, 1.0); +} diff --git a/resources/textures/dirt.png b/resources/textures/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..617d353e0d67a14a2952b2a98375eb8a50b97d79 GIT binary patch literal 266 zcmV+l0rmcgP)7w`V=NDEI+d2EruJ8Nt`?O29*Y((K z=DVK`tGLh7MTtz%ds&v@Ga&DZ$;xQ1!Z)iihj}Hm*4l8eo1~Im3;+ie&}VWdpbDk0 z+*Vd{tJH?~A!2frcub(;r0KIVImhR2X8sP4PM&T#KQlJngXEsPNu_c;# zj2A0tbfmyB_f1S^g6x^QT2YWaZ|9A0rZL;l$|NdG{#j@PkULH z+3fY7k(rU<-=BXB-#+|e00DMx7KYDne=u+furu(9aWee+_J`s7$6pM8|NdiOVqygI zKfU?EAg;{EzyyR0Kfe41E9MpDVBnMBWOzB@5d%9nD_H!+tq%3Zzewm+w}3}cZM%OlR>Uv<6>d>GXDjGpd>fgAdo9X6nGiF zEPToE;n`P)-{1c-yq)rdficon^S`jZGsD}9d%@0^D3)h<(fg1A2DoCy7``oj#UPp| z%kX;AV+I8YL52q}-h-tds37$`9??re?uf8fGB zxRd#ed>KBS+YIJ|6o42Yd1N-oGMKBGWrcYfK#D*LK&F0sc9VghhlAnM*B@ZN{{8=- z;nLmb47}VN4DY{u2aAK`K!$+yF~JxhTR>ib`5opB5FZpKAU?7jC=5V+7MN2&0x*BT z*f75%Yee@76HF55tN$RAVQ~)&6HuB!jvWRx0P_mi z3&;uQ-kV?GL;BhEp3evn`jpnYGF^DuTM`Ky(w`6a;l0ff3PN_uY0G2zD(|B2pJ2 zUX+E$tenTqX>(3@a?Hc@i|38};N$22zxR9I=kWfj>%%o|Fc`46w}(t71Fq82QY4c} zn9XL`Y&L9dZDDhBQ)*bt_e3HAm&*n9wC}pk<#MPq*MLtJ%xx^8q@)BpJ3DeIaMUl) zrOj1rY;2&ctPH!myC^IygnISqo_07K*xug8m+27{6%|2iEdX3B;sv|GEN5e(pTdqT zFST|+-Fe-jEf$L$k}|vUawHPL{{FrIaGOjf*`%M(=TT5lATrd;!Mi#X3JJ~ca}zk# z;1e0aU=VJ%8x<85csJNDEZXXu1?+2ZRKVC&Js-HGNqKQ`5$%m9F&_Sfs;VlHVbvyt zGf@Gd!PK42W?{8jQCwUsTit&X(BA3>(G*Jmk?yHf3Pz(*irIy92~Lw|;vv*q4q+u1 zhar`Rdfaf zgKx9rIO91XCRJBgOXrb=A3~i{YK%5v%cY+6-_&bsYq;n?Cni$6qsS@)#CJ-eVM-|h zTV7s9Yu#~7Ed540orZex@wPVSjYuFX$di$2T=2C^N6UUGd_Es~Klj1!_hWW;7UkvT zGBb>rzNv>j9h%XNE>5A*aRjm5B-Yp0MJuWEN%yIrk{BZw0XR3RXR=GPYb+KML=M&e z*=Gtgw7I!ix>A3O^O(dpJToS2RQK2u&De&fh7U%Vu~GAl&a0T8pNGfeK{y=7>P|vZ zibkVos&)UH1O5x7GoOfvDVN*M3xkE^vH;Rxn#aX+GGJPa{BT7r)T6hZy0WrT4v8EH w1f+oT?ss`5iO#0ect137FjS<@Cj1Hi0=0vO8h?Sj)c^nh07*qoM6N<$f;^FEhyVZp literal 0 HcmV?d00001 diff --git a/src/game.cpp b/src/game.cpp index 93fe743..e3b382b 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3,6 +3,7 @@ #define LOGGER_DEFINITION #include +#include "renderer/shader.hpp" #include "renderer/camera.hpp" #include "common.hpp" @@ -119,6 +120,10 @@ void Game::Run() { const float clear[] = { 0.1f, 0.45f, 0.9f, 1.0f }; glClearBufferfv(GL_COLOR, 0, clear); + Shader shader; + shader.Load("E:/Games/minecraft/resources/shaders/simple"); + shader.Use(); + while (IsDisplayOpen) { Input(&e); diff --git a/src/renderer/shader.cpp b/src/renderer/shader.cpp index e69de29..7308060 100644 --- a/src/renderer/shader.cpp +++ b/src/renderer/shader.cpp @@ -0,0 +1,111 @@ +#include "shader.hpp" + +Shader::Shader() + : m_fileReader() { + + m_program = 0; + m_frag = 0; + m_vert = 0; + + m_logger = std::make_shared(); + +} + + +void Shader::Load(std::string path) { + + std::string vertexLocation = path + ".vert"; + Load(vertexLocation, GL_VERTEX_SHADER); + *m_logger << LOGGER_INFO << "Vertex shader at '" << vertexLocation << "' loaded..." << LOGGER_ENDL; + + + std::string fragmentLocation = path + ".frag"; + Load(fragmentLocation, GL_FRAGMENT_SHADER); + *m_logger << LOGGER_INFO << "Fragment shader at '" << fragmentLocation << "' loaded..." << LOGGER_ENDL; + + Link(); + +} + + +void Shader::Load(std::string path, GLenum type) { + + GLuint activeShader = 0; + + if (type == GL_VERTEX_SHADER) + m_vert = activeShader = glCreateShader(type); + + if (type == GL_FRAGMENT_SHADER) + m_frag = activeShader = glCreateShader(type); + + std::string loadedShaderSource = m_fileReader.LoadTextFromFile(path); + const char* shaderSource = loadedShaderSource.c_str(); + int shaderSourceLength = loadedShaderSource.length(); + + glShaderSource(activeShader, 1, &shaderSource, &shaderSourceLength); + +} + +void Shader::Link() { + + if (m_vert == 0 || m_frag == 0) { + *m_logger << LOGGER_ERROR << "Failed to link programs: Both programs not present" << LOGGER_ENDL; + return; + } + + glCompileShader(m_vert); + if (m_CheckShader(m_vert)) { + *m_logger << LOGGER_INFO << "Vertex shader '" << m_vert << "' compiled..." << LOGGER_ENDL; + } + + glCompileShader(m_frag); + if (m_CheckShader(m_frag)) { + *m_logger << LOGGER_INFO << "Fragment shader '" << m_frag << "' compiled..." << LOGGER_ENDL; + } + + m_program = glCreateProgram(); + + glAttachShader(m_program, m_vert); + glAttachShader(m_program, m_frag); + + glLinkProgram(m_program); + + glDeleteShader(m_vert); + glDeleteShader(m_frag); + + *m_logger << LOGGER_INFO << "Program '" << m_program << "' loaded..." << LOGGER_ENDL; + +} + +void Shader::Use() { + + glUseProgram(m_program); + +} + + +bool Shader::m_CheckShader(GLuint uid) { + + GLint status = GL_TRUE; + + glGetShaderiv(uid, GL_COMPILE_STATUS, &status); + + if (status == GL_FALSE) { + char buf[512]; + glGetShaderInfoLog(uid, 512, NULL, buf); + *m_logger << LOGGER_ERROR << buf << LOGGER_ENDL; + delete buf; + return false; + } + + return true; +} + + +Shader::~Shader() { + + glDeleteProgram(m_program); + glDeleteShader(m_vert); + glDeleteShader(m_frag); + +} diff --git a/src/renderer/shader.hpp b/src/renderer/shader.hpp index 3d83677..8dc8a94 100644 --- a/src/renderer/shader.hpp +++ b/src/renderer/shader.hpp @@ -1,12 +1,33 @@ #ifndef MINECRAFT_RENDERER_SHADER_H_ #define MINECRAFT_RENDERER_SHADER_H_ +#include +#include "../util/filereader.hpp" +#include "../common.hpp" class Shader { public: + Shader(); + void Load(std::string path); + void Load(std::string path, GLenum type); + void Link(); + + void Use(); + + ~Shader(); +private: + std::shared_ptr m_logger; + + bool m_CheckShader(GLuint uid); + + FileReader m_fileReader; + + GLuint m_program; + GLuint m_vert; + GLuint m_frag; }; #endif diff --git a/src/util/filereader.cpp b/src/util/filereader.cpp new file mode 100644 index 0000000..8228074 --- /dev/null +++ b/src/util/filereader.cpp @@ -0,0 +1,15 @@ +#include "filereader.hpp" + +#include + +FileReader::FileReader() { + +} + +std::string FileReader::LoadTextFromFile(std::string path) { + std::ifstream t(path); + std::string text((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + return text; +} + diff --git a/src/util/filereader.hpp b/src/util/filereader.hpp new file mode 100644 index 0000000..dc1cf24 --- /dev/null +++ b/src/util/filereader.hpp @@ -0,0 +1,14 @@ +#ifndef MINECRAFT_UTIL_FILEREADER_H_ +#define MINECRAFT_UTIL_FILEREADER_H_ + +#include + +class FileReader { +public: + FileReader(); + + std::string LoadTextFromFile(std::string path); + +}; + +#endif