generated from karl/cpp-template
Add Texture class and basis for MC texturing
This commit is contained in:
parent
7a3e5364e0
commit
5de6d88d37
@ -8,7 +8,10 @@ MCRenderer::MCRenderer(int size_x, int size_y, int size_z)
|
|||||||
: size_x(size_x), size_y(size_y), size_z(size_z),
|
: size_x(size_x), size_y(size_y), size_z(size_z),
|
||||||
render_shader(Shader("Shader/mc.vs", "Shader/mc.fs", "Shader/mc.gs")),
|
render_shader(Shader("Shader/mc.vs", "Shader/mc.fs", "Shader/mc.gs")),
|
||||||
noise_shader(Shader("Shader/noise.vs", "Shader/noise.fs")),
|
noise_shader(Shader("Shader/noise.vs", "Shader/noise.fs")),
|
||||||
noise(Framebuffer3D(size_x, size_y, size_z)), camera(Camera(90, 1920, 1080, 0.1, 1000.0)) {
|
noise(Framebuffer3D(size_x, size_y, size_z)), camera(Camera(90, 1920, 1080, 0.1, 1000.0)),
|
||||||
|
albedo("Resources/Textures/PavingStones/PavingStones070_2K_Color.jpg", Texture::Settings()),
|
||||||
|
bump("Resources/Textures/PavingStones/PavingStones070_2K_Displacement.jpg",
|
||||||
|
Texture::Settings()) {
|
||||||
// Each noise layer needs vertices, so we define two triangles which span a rectangle
|
// Each noise layer needs vertices, so we define two triangles which span a rectangle
|
||||||
float data[6][2] = {{-1.0f, -1.0f}, {-1.0, 1.0}, {1.0, -1.0},
|
float data[6][2] = {{-1.0f, -1.0f}, {-1.0, 1.0}, {1.0, -1.0},
|
||||||
{1.0f, 1.0f}, {-1.0, 1.0}, {1.0, -1.0}};
|
{1.0f, 1.0f}, {-1.0, 1.0}, {1.0, -1.0}};
|
||||||
@ -81,6 +84,8 @@ void MCRenderer::render(float delta) {
|
|||||||
|
|
||||||
// Bind the noise texture to the rendering shader
|
// Bind the noise texture to the rendering shader
|
||||||
noise.bind_to(0);
|
noise.bind_to(0);
|
||||||
|
albedo.bind_to(1);
|
||||||
|
bump.bind_to(2);
|
||||||
|
|
||||||
// Draw all layers as polygons
|
// Draw all layers as polygons
|
||||||
glDrawArrays(GL_POINTS, 0, size_x * size_y * size_z);
|
glDrawArrays(GL_POINTS, 0, size_x * size_y * size_z);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "Framebuffer3D.h"
|
#include "Framebuffer3D.h"
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
|
#include "Texture.h"
|
||||||
#include "VertexBuffer.h"
|
#include "VertexBuffer.h"
|
||||||
|
|
||||||
class MCRenderer {
|
class MCRenderer {
|
||||||
@ -25,4 +26,7 @@ class MCRenderer {
|
|||||||
VertexBuffer vertex_rectangle;
|
VertexBuffer vertex_rectangle;
|
||||||
|
|
||||||
Camera camera;
|
Camera camera;
|
||||||
|
|
||||||
|
Texture albedo;
|
||||||
|
Texture bump;
|
||||||
};
|
};
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 1.4 MiB |
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Color.jpg
Normal file
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Color.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.7 MiB |
Binary file not shown.
After Width: | Height: | Size: 1.4 MiB |
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Normal.jpg
Normal file
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Normal.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.2 MiB |
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Roughness.jpg
Normal file
BIN
Resources/Textures/PavingStones/PavingStones070_2K_Roughness.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 MiB |
@ -9,4 +9,4 @@ env.CompilationDatabase()
|
|||||||
|
|
||||||
env.Append(LIBS=['glfw', 'dl'])
|
env.Append(LIBS=['glfw', 'dl'])
|
||||||
|
|
||||||
env.Program('program.out', [Glob('*.cpp', 'Util/*.cpp'), 'Util/glad.c'])
|
env.Program('program.out', [Glob('*.cpp'), 'Util/glad.c'])
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
layout (binding = 0) uniform sampler3D densities;
|
layout (binding = 0) uniform sampler3D densities;
|
||||||
|
layout (binding = 1) uniform sampler2D albedo;
|
||||||
|
layout (binding = 2) uniform sampler2D bump;
|
||||||
|
|
||||||
in vec3 varTextureG;
|
in vec3 varTextureG;
|
||||||
|
in vec2 varUV;
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
float f = texture(densities, varTextureG).r;
|
vec3 f = texture(albedo, varUV).rgb;
|
||||||
color = vec4(f, f, f, 1.0);
|
color = vec4(f, 1.0);
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,9 @@ uniform mat4 view;
|
|||||||
|
|
||||||
in vec3 varTexture[];
|
in vec3 varTexture[];
|
||||||
in int varIndex[];
|
in int varIndex[];
|
||||||
|
|
||||||
out vec3 varTextureG;
|
out vec3 varTextureG;
|
||||||
|
out vec2 varUV;
|
||||||
|
|
||||||
vec3 vectors[13] = {
|
vec3 vectors[13] = {
|
||||||
vec3(0.0, 0.0, 0.0), vec3(0.5, 1.0, 1.0), vec3(0.0, 0.5, 1.0),
|
vec3(0.0, 0.0, 0.0), vec3(0.5, 1.0, 1.0), vec3(0.0, 0.5, 1.0),
|
||||||
@ -186,9 +188,15 @@ void main(void) {
|
|||||||
vec4 base = gl_in[0].gl_Position;
|
vec4 base = gl_in[0].gl_Position;
|
||||||
int index = varIndex[0] * 12;
|
int index = varIndex[0] * 12;
|
||||||
for(int i = 0; i < 12; i += 3) {
|
for(int i = 0; i < 12; i += 3) {
|
||||||
|
// TODO: Calculate tangents
|
||||||
|
vec3 tangent;
|
||||||
|
vec3 bitangent;
|
||||||
|
|
||||||
for(int k = 0; k < 3; k++) {
|
for(int k = 0; k < 3; k++) {
|
||||||
gl_Position = proj * view * (base + vec4(vectors[table[index + i + k]], 0.0));
|
gl_Position = proj * view * (base + vec4(vectors[table[index + i + k]], 0.0));
|
||||||
varTextureG = varTexture[0];
|
varTextureG = varTexture[0];
|
||||||
|
// FIXME: These UV coordinates become stretched on one axis
|
||||||
|
varUV = vectors[table[index + i + k]].xz;
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
}
|
}
|
||||||
EndPrimitive();
|
EndPrimitive();
|
||||||
|
56
Texture.cpp
Normal file
56
Texture.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "Texture.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#include "Util/stb_image.h"
|
||||||
|
|
||||||
|
bool Texture::is_valid() const {
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint Texture::load_texture(const std::string &path, Settings settings) {
|
||||||
|
uint gl_id;
|
||||||
|
|
||||||
|
glGenTextures(1, &gl_id);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, gl_id);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
|
||||||
|
if (settings.mipmaps) {
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
} else {
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
}
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
|
||||||
|
int width, height, nrChannels;
|
||||||
|
unsigned char *data = stbi_load(path.c_str(), &width, &height, &nrChannels, 0);
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
// Check number of channels
|
||||||
|
unsigned int glChannels = GL_RED;
|
||||||
|
if (nrChannels == 3)
|
||||||
|
glChannels = GL_RGB;
|
||||||
|
else if (nrChannels == 4)
|
||||||
|
glChannels = GL_RGBA;
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, glChannels, width, height, 0, glChannels, GL_UNSIGNED_BYTE,
|
||||||
|
data);
|
||||||
|
|
||||||
|
if (settings.mipmaps) {
|
||||||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
stbi_image_free(data);
|
||||||
|
|
||||||
|
return gl_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Texture::bind_to(int unit) {
|
||||||
|
glActiveTexture(GL_TEXTURE0 + unit);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, id);
|
||||||
|
}
|
34
Texture.h
Normal file
34
Texture.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Must be the first include
|
||||||
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
// Other includes
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class Texture {
|
||||||
|
public:
|
||||||
|
struct Settings {
|
||||||
|
Settings() : mipmaps(true), transparent(false){};
|
||||||
|
|
||||||
|
bool mipmaps;
|
||||||
|
bool transparent;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit Texture(const std::string &path, Settings settings)
|
||||||
|
: id(load_texture(path, settings)), valid(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_valid() const;
|
||||||
|
|
||||||
|
// Bind a texture from the given path and return its ID
|
||||||
|
uint load_texture(const std::string &path, Settings settings);
|
||||||
|
|
||||||
|
void bind_to(int unit);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const uint id;
|
||||||
|
bool valid;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user