1
0
Fork 0

Replace colors with textures

This commit is contained in:
Meoweg 2015-11-06 22:47:24 +00:00
parent f35711d752
commit d68cdc0e0e
8 changed files with 7664 additions and 4978 deletions

View File

@ -3,7 +3,7 @@ set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/"
project (Matabstrix)
add_definitions ("-std=c++14 -Wall -Wextra")
set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "--preload-file data")
set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "--use-preload-plugins --preload-file data")
file (GLOB sources *.cpp)

12
data/materials/bunny.mtl Normal file
View File

@ -0,0 +1,12 @@
# Blender MTL File: 'bunny.blend'
# Material Count: 1
newmtl bunny
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd bunny.png

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,10 @@
precision lowp float;
varying vec2 f_tex_coord;
uniform sampler2D texture;
void main(void) {
gl_FragColor = vec4(0.5, 0.7, 0.5, 1.0);
vec2 flipped_tex_coord = vec2(f_tex_coord.x, 1.0 - f_tex_coord.y);
gl_FragColor = texture2D(texture, flipped_tex_coord);
}

View File

@ -1,7 +1,11 @@
attribute vec4 position;
attribute vec2 tex_coord;
varying vec2 f_tex_coord;
uniform mat4 mvp;
void main(void) {
gl_Position = mvp * position;
f_tex_coord = tex_coord;
}

BIN
data/textures/bunny.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

View File

@ -1,4 +1,5 @@
#include <cstdlib>
#include <vector>
#include <fstream>
#include <sstream>
@ -7,6 +8,8 @@
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <SDL_image.h>
#include <GL/glew.h>
#include <GL/glfw.h>
@ -30,8 +33,8 @@ public:
void attach_shader(const Shader &shader);
void bind_attrib_location(GLuint index, const GLchar *name);
void link();
void use();
GLuint get_uniform_location(const GLchar *name);
void use() const;
GLuint get_uniform_location(const GLchar *name) const;
private:
GLuint _id;
@ -72,6 +75,16 @@ private:
const Model &_model;
};
class Texture
{
public:
Texture(const char *filename);
void use() const;
private:
GLuint _id;
};
static Program build_program();
static void iterate();
@ -96,6 +109,9 @@ static Object *suzanne1;
static Object *teapot1;
static Object *bunny1;
static Texture *suzanne_tex;
static Texture *bunny_tex;
int main()
{
if (!glfwInit())
@ -132,6 +148,7 @@ int main()
cube1->position.y = -4.0;
suzanne1 = new Object(*suzanne);
suzanne1->position.z = -1;
teapot1 = new Object(*teapot);
teapot1->position.x = -3.0;
@ -140,11 +157,17 @@ int main()
bunny1 = new Object(*bunny);
bunny1->position.x = 3.0;
suzanne_tex = new Texture("/data/textures/suzanne.png");
bunny_tex = new Texture("/data/textures/bunny.png");
GLint u_texture = program.get_uniform_location("texture");
glUniform1i(u_texture, 0);
glViewport(0, 0, 640, 480);
glEnable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glClearColor(1, 1, 1, 0);
emscripten_set_main_loop(iterate, 0, 1);
}
@ -190,12 +213,12 @@ void Program::link()
glLinkProgram(_id);
}
void Program::use()
void Program::use() const
{
glUseProgram(_id);
}
GLuint Program::get_uniform_location(const GLchar *name)
GLuint Program::get_uniform_location(const GLchar *name) const
{
return glGetUniformLocation(_id, name);
}
@ -269,9 +292,14 @@ Model::Model(const char *const filename)
}
positions_id = create_array_buffer(GL_ARRAY_BUFFER, 3 * positions.size() * sizeof(GLfloat), positions.data());
if (attr_count == 3)
tex_coords_id = create_array_buffer(GL_ARRAY_BUFFER, 2 * tex_coords.size() * sizeof(GLfloat), tex_coords.data());
else
tex_coords_id = 0;
normals_id = create_array_buffer(GL_ARRAY_BUFFER, 3 * normals.size() * sizeof(GLfloat), normals.data());
id = create_array_buffer(GL_ELEMENT_ARRAY_BUFFER, elements.size() * sizeof(GLushort), elements.data());
}
@ -289,8 +317,14 @@ void Model::draw() const
glBindBuffer(GL_ARRAY_BUFFER, positions_id);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0));
glBindBuffer(GL_ARRAY_BUFFER, tex_coords_id);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0));
if (tex_coords_id == 0)
glDisableVertexAttribArray(1);
else
{
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, tex_coords_id);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0));
}
glBindBuffer(GL_ARRAY_BUFFER, normals_id);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0));
@ -312,6 +346,23 @@ void Object::draw(const glm::mat4 &mvp) const
_model.draw();
}
Texture::Texture(const char *const filename)
{
SDL_Surface *surface = IMG_Load(filename);
glGenTextures(1, &_id);
glBindTexture(GL_TEXTURE_2D, _id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
SDL_FreeSurface(surface);
}
void Texture::use() const
{
glBindTexture(GL_TEXTURE_2D, _id);
}
Program build_program()
{
const Shader vertex_shader = Shader(GL_VERTEX_SHADER, "/data/shaders/vertex.glsl");
@ -370,9 +421,16 @@ void iterate()
glm::mat4 mvp = projection * view * model;
glBindTexture(GL_TEXTURE_2D, 0);
cube1->draw(mvp);
suzanne_tex->use();
suzanne1->draw(mvp);
glBindTexture(GL_TEXTURE_2D, 0);
teapot1->draw(mvp);
bunny_tex->use();
bunny1->draw(mvp);
}

BIN
work/bunny.blend Normal file

Binary file not shown.