diff --git a/Makefile b/Makefile index 026be22..3c5d854 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ EXEC_TEST=$(B_DIR)/test # Build settings CC=g++ -g # SDL options -CC_SDL=-lSDL2 `sdl2-config --cflags --libs` -lGLEW -lGL +CC_SDL=-lSDL2 `sdl2-config --cflags --libs` -lGLEW -lGL -lSOIL #libraries LIBS=-ljsoncpp diff --git a/engine/texture.cpp b/engine/texture.cpp new file mode 100644 index 0000000..b5a60ba --- /dev/null +++ b/engine/texture.cpp @@ -0,0 +1,30 @@ +#include "texture.hpp" +#include + +void texture::genTexureGpu(GLfloat pixels[]) { + //this->pixels = pixels; + glGenTextures(1, &ref); + glBindTexture(GL_TEXTURE_2D, ref); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 3, 0, GL_RGB, GL_FLOAT, pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +} + +void texture::loadFromPath(std::string path) { + glGenTextures(1, &ref); + glBindTexture(GL_TEXTURE_2D, ref); + + int width, height; + unsigned char *image = + SOIL_load_image(path.c_str(), &width, &height, 0, SOIL_LOAD_RGB); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, + GL_UNSIGNED_BYTE, image); + SOIL_free_image_data(image); + //this->pixels = image; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +} \ No newline at end of file diff --git a/engine/texture.hpp b/engine/texture.hpp new file mode 100644 index 0000000..64384b5 --- /dev/null +++ b/engine/texture.hpp @@ -0,0 +1,20 @@ +#ifndef __TEXTURE_H__ +#define __TEXTURE_H__ + +#include +#include +#include +#include +#include +#include + +class texture{ + public: + GLuint ref; + unsigned char *pixels; + + void genTexureGpu(GLfloat pixels[]); + void loadFromPath(std::string path); +}; + +#endif \ No newline at end of file diff --git a/sample.png b/sample.png new file mode 100644 index 0000000..3ec1d66 Binary files /dev/null and b/sample.png differ diff --git a/shaders.json b/shaders.json index 6c0e223..6144972 100644 --- a/shaders.json +++ b/shaders.json @@ -1,18 +1,23 @@ { "vertex":[ - {"path":"shaders/vertex/simple.glsl"} + {"path":"shaders/vertex/simple.glsl"}, + {"path":"shaders/vertex/texture.glsl"} ], "fragment":[ { "path":"shaders/fragment/simple.glsl", "framebuff_output":["outColor"] + }, + { + "path":"shaders/fragment/texture.glsl", + "framebuff_output":["outColor"] } ], "combos":[ { - "vertex":0, - "fragment":0 + "vertex":1, + "fragment":1 } ] } \ No newline at end of file diff --git a/shaders/fragment/texture.glsl b/shaders/fragment/texture.glsl new file mode 100644 index 0000000..2483a3c --- /dev/null +++ b/shaders/fragment/texture.glsl @@ -0,0 +1,13 @@ +#version 150 core + +in vec3 Color; +in vec2 Texcoord; + +out vec4 outColor; + +uniform sampler2D tex; + +void main() +{ + outColor = texture(tex, Texcoord) * vec4(Color, 1.0); +} \ No newline at end of file diff --git a/shaders/vertex/texture.glsl b/shaders/vertex/texture.glsl new file mode 100644 index 0000000..dcec03e --- /dev/null +++ b/shaders/vertex/texture.glsl @@ -0,0 +1,15 @@ +#version 150 core + +in vec2 position; +in vec3 color; +in vec2 texcoord; + +out vec3 Color; +out vec2 Texcoord; + +void main() +{ + Color = color; + Texcoord=texcoord; + gl_Position = vec4(position, 0.0, 1.0); +} \ No newline at end of file diff --git a/test.cpp b/test.cpp index 6a6431b..9f3af34 100644 --- a/test.cpp +++ b/test.cpp @@ -1,6 +1,7 @@ #include "engine/object.hpp" #include "engine/rendering.hpp" #include "engine/shader.hpp" +#include "engine/texture.hpp" #include #include int main(int argc, char *argv[]) { @@ -14,36 +15,39 @@ int main(int argc, char *argv[]) { renderer.Shaderinit(); GLfloat vertices[] = { - -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left - 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right - 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right - -0.5f, -0.5f, 1.0f, 1.0f, 1.0f // Bottom-left + //=========position======|===========color==============|=========texcoord + -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left + 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right + 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right + -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom-left }; - GLuint elements[] = {0, 2, 3, 1, 2, 3}; + GLuint elements[] = {0, 1, 2, 2, 3, 0}; gameobject test(&renderer.shaders.at(0)); renderer.objects.push_back(test); test.genVbo(vertices, 20); - test.genEbo(elements, 2); + test.genEbo(elements, 6); glBindVertexArray(test.vao); test.rend_shader->use(); - test.setVertexAtribPointer("position",2, false, 5, 0); - test.setVertexAtribPointer("color",3, false, 5, (void *)(2 * sizeof(GLfloat))); + texture tex; - gameobject test2(&renderer.shaders.at(0)); - renderer.objects.push_back(test2); - test2.genVbo(vertices, 20); - test2.genEbo(elements, 2); - glBindVertexArray(test2.vao); - test2.rend_shader->use(); - test2.setVertexAtribPointer("position",2, false, 5, 0); - test2.setVertexAtribPointer("color",2, false, 5, (void *)(2 * sizeof(GLfloat))); + test.setVertexAtribPointer("position", 2, false, 7, 0); + test.setVertexAtribPointer("color", 3, false, 7, + (void *)(2 * sizeof(GLfloat))); + test.setVertexAtribPointer("texcoord", 2, false, 7, + (void *)(5 * sizeof(GLfloat))); + + tex.loadFromPath("sample.png"); SDL_Event windowEvent; + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + // std::cout << err << "\n" << posAttrib; + return -1; + } - //std::cout<