Normal maps now work as expected
This commit is contained in:
parent
bf2c02e240
commit
037ad47468
@ -52,6 +52,13 @@ void MainState::update(double deltaTime) {
|
||||
camera->moveLeft(speed * deltaTime);
|
||||
}
|
||||
|
||||
static double offset = 0.0;
|
||||
if (app->isKeyHeld(NFI_UP))
|
||||
offset += 2.0 * deltaTime;
|
||||
if (app->isKeyHeld(NFI_DOWN))
|
||||
offset -= 2.0 * deltaTime;
|
||||
test.setRotation(offset * 10.0, 0.0, 0.0);
|
||||
|
||||
light.setPosition(nf::Vec3(std::sin(circle) * 10.0, 5.0, std::cos(circle) * 10.0));
|
||||
circle += 2.0 * deltaTime;
|
||||
|
||||
@ -70,8 +77,8 @@ void MainState::render(nf::Renderer& renderer) {
|
||||
renderer.render(test);
|
||||
renderer.render(plane);
|
||||
renderer.render(light);
|
||||
renderer.render(light2);
|
||||
renderer.render(light3);
|
||||
/*renderer.render(light2);
|
||||
renderer.render(light3);*/
|
||||
renderer.render(text);
|
||||
renderer.render(uiTex);
|
||||
renderer.render(button);
|
||||
|
@ -3,6 +3,7 @@
|
||||
in vec3 fragPos;
|
||||
in vec2 texCoord;
|
||||
in vec3 normal;
|
||||
in mat3 tbn;
|
||||
|
||||
struct Material {
|
||||
bool hasDiffuseTex;
|
||||
@ -27,10 +28,12 @@ void main() {
|
||||
|
||||
if (material.hasNormTex) {
|
||||
normals = texture(material.normalTexture, texCoord).xyz;
|
||||
normals = normalize(normals * 2.0 - 1.0);
|
||||
normals = normals * 2.0 - 1.0;
|
||||
normals = normalize(tbn * normals);
|
||||
}
|
||||
else
|
||||
normals = normalize(normal);
|
||||
normals = normal;
|
||||
|
||||
|
||||
if (material.hasDiffuseTex)
|
||||
diffuse = texture(material.diffuseTexture, texCoord).rgb;
|
||||
|
@ -3,6 +3,7 @@
|
||||
layout(location = 0) in vec3 pos;
|
||||
layout(location = 1) in vec2 texCoords;
|
||||
layout(location = 2) in vec3 normals;
|
||||
layout(location = 3) in vec3 tangent;
|
||||
|
||||
uniform mat4 model;
|
||||
uniform mat4 view;
|
||||
@ -11,13 +12,19 @@ uniform mat4 proj;
|
||||
out vec3 fragPos;
|
||||
out vec2 texCoord;
|
||||
out vec3 normal;
|
||||
out vec3 tang;
|
||||
out mat3 tbn;
|
||||
|
||||
void main() {
|
||||
vec4 world = model * vec4(pos, 1.0);
|
||||
fragPos = world.xyz;
|
||||
texCoord = texCoords;
|
||||
mat3 normalMat = transpose(inverse(mat3(model)));
|
||||
normal = normalMat * normals;
|
||||
vec3 t = normalize(normalMat * tangent);
|
||||
vec3 n = normalize(normalMat * normals);
|
||||
normal = n;
|
||||
vec3 b = cross(n, t);
|
||||
tbn = mat3(t, b, n);
|
||||
|
||||
gl_Position = proj * view * world;
|
||||
}
|
@ -18,10 +18,7 @@ namespace nf {
|
||||
|
||||
m_width = Application::getApp()->getConfig().width;
|
||||
m_height = Application::getApp()->getConfig().height;
|
||||
glGenTextures(1, &m_textures[0]);
|
||||
glGenTextures(1, &m_textures[1]);
|
||||
glGenTextures(1, &m_textures[2]);
|
||||
glGenTextures(1, &m_textures[3]);
|
||||
glGenTextures(m_textures.size(), &m_textures[0]);
|
||||
for (unsigned int i = 0; i < m_textures.size(); i++) {
|
||||
glBindTexture(GL_TEXTURE_2D, m_textures[i]);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, m_width, m_height, 0, GL_RGB, GL_FLOAT, nullptr);
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "Utility.h"
|
||||
|
||||
namespace nf {
|
||||
Material::Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess, ATexture* normalTex) {
|
||||
Material::Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* tan, const size_t tanSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess, ATexture* normalTex) {
|
||||
m_vao = new VertexArray();
|
||||
m_vao->addBuffer(vb, vbSize);
|
||||
m_vao->push<float>(3);
|
||||
@ -21,6 +21,9 @@ namespace nf {
|
||||
m_vao->addBuffer(vn, vnSize);
|
||||
m_vao->push<float>(3);
|
||||
m_vao->finishBufferLayout();
|
||||
m_vao->addBuffer(tan, tanSize);
|
||||
m_vao->push<float>(3);
|
||||
m_vao->finishBufferLayout();
|
||||
m_ib = new IndexBuffer(ib, ibCount);
|
||||
if (diffTex) {
|
||||
m_hasDiffuse = true;
|
||||
@ -103,6 +106,8 @@ namespace nf {
|
||||
std::vector<float> outVN;
|
||||
std::vector<float> unindexedVN;
|
||||
std::vector<unsigned int> vnIndices;
|
||||
std::vector<float> unindexedTan;
|
||||
std::vector<float> outTan;
|
||||
std::vector<unsigned int> outIB;
|
||||
unsigned int ibCount = 0;
|
||||
|
||||
@ -243,6 +248,33 @@ namespace nf {
|
||||
mats[curr]->unindexedVN.push_back(vnY);
|
||||
mats[curr]->unindexedVN.push_back(vnZ);
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i * 9 < mats[curr]->unindexedVB.size(); i++) {
|
||||
glm::vec3 pos1(mats[curr]->unindexedVB[i * 9], mats[curr]->unindexedVB[i * 9 + 1], mats[curr]->unindexedVB[i * 9 + 2]);
|
||||
glm::vec2 uv1(mats[curr]->unindexedTC[i * 6], mats[curr]->unindexedTC[i * 6 + 1]);
|
||||
glm::vec3 pos2(mats[curr]->unindexedVB[i * 9 + 3], mats[curr]->unindexedVB[i * 9 + 4], mats[curr]->unindexedVB[i * 9 + 5]);
|
||||
glm::vec2 uv2(mats[curr]->unindexedTC[i * 6 + 2], mats[curr]->unindexedTC[i * 6 + 3]);
|
||||
glm::vec3 pos3(mats[curr]->unindexedVB[i * 9 + 6], mats[curr]->unindexedVB[i * 9 + 7], mats[curr]->unindexedVB[i * 9 + 8]);
|
||||
glm::vec2 uv3(mats[curr]->unindexedTC[i * 6 + 4], mats[curr]->unindexedTC[i * 6 + 5]);
|
||||
|
||||
glm::vec3 edge1 = pos2 - pos1;
|
||||
glm::vec3 edge2 = pos3 - pos1;
|
||||
glm::vec2 delta1 = uv2 - uv1;
|
||||
glm::vec2 delta2 = uv3 - uv1;
|
||||
float f = 1.0f / (delta1.x * delta2.y - delta2.x * delta1.y);
|
||||
float x = f * (delta2.y * edge1.x - delta1.y * edge2.x);
|
||||
float y = f * (delta2.y * edge1.y - delta1.y * edge2.y);
|
||||
float z = f * (delta2.y * edge1.z - delta1.y * edge2.z);
|
||||
mats[curr]->unindexedTan.push_back(x);
|
||||
mats[curr]->unindexedTan.push_back(y);
|
||||
mats[curr]->unindexedTan.push_back(z);
|
||||
mats[curr]->unindexedTan.push_back(x);
|
||||
mats[curr]->unindexedTan.push_back(y);
|
||||
mats[curr]->unindexedTan.push_back(z);
|
||||
mats[curr]->unindexedTan.push_back(x);
|
||||
mats[curr]->unindexedTan.push_back(y);
|
||||
mats[curr]->unindexedTan.push_back(z);
|
||||
}
|
||||
}
|
||||
|
||||
struct Vertex {
|
||||
@ -282,27 +314,27 @@ namespace nf {
|
||||
mats[curr]->outVN.push_back(currVertex.vnX);
|
||||
mats[curr]->outVN.push_back(currVertex.vnY);
|
||||
mats[curr]->outVN.push_back(currVertex.vnZ);
|
||||
mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3)]);
|
||||
mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3 + 1)]);
|
||||
mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3 + 2)]);
|
||||
unsigned int index = (mats[curr]->outVB.size() / 3) - 1;
|
||||
mats[curr]->outIB.push_back(index);
|
||||
vertexMap[currVertex] = index;
|
||||
mats[curr]->ibCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& m : mats) {
|
||||
TempMaterial& curr = *m.second;
|
||||
TempMaterial& curr2 = *m.second;
|
||||
ATexture* diff = nullptr;
|
||||
if (curr.diffuseTextureName.size())
|
||||
diff = model->neededTextures[curr.diffuseTextureName];
|
||||
if (curr2.diffuseTextureName.size())
|
||||
diff = model->neededTextures[curr2.diffuseTextureName];
|
||||
ATexture* spec = nullptr;
|
||||
if (curr.specularTextureName.size())
|
||||
spec = model->neededTextures[curr.specularTextureName];
|
||||
if (curr2.specularTextureName.size())
|
||||
spec = model->neededTextures[curr2.specularTextureName];
|
||||
ATexture* norm = nullptr;
|
||||
if (curr.normalTextureName.size())
|
||||
norm = model->neededTextures[curr.normalTextureName];
|
||||
m_materials.push_back(new Material(&curr.outVB[0], curr.outVB.size() * sizeof(float), &curr.outTC[0], curr.outTC.size() * sizeof(float), &curr.outVN[0], curr.outVN.size() * sizeof(float), &curr.outIB[0], curr.ibCount, diff, curr.diffuseColor, spec, curr.shininess, norm));
|
||||
|
||||
if (curr2.normalTextureName.size())
|
||||
norm = model->neededTextures[curr2.normalTextureName];
|
||||
m_materials.push_back(new Material(&curr2.outVB[0], curr2.outVB.size() * sizeof(float), &curr2.outTC[0], curr2.outTC.size() * sizeof(float), &curr2.outVN[0], curr2.outVN.size() * sizeof(float), &curr2.outTan[0], curr2.outTan.size() * sizeof(float), &curr2.outIB[0], curr2.ibCount, diff, curr2.diffuseColor, spec, curr2.shininess, norm));
|
||||
delete m.second;
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ namespace nf {
|
||||
m_gBuffer = new GBuffer;
|
||||
|
||||
m_directionalDepthTexSize = 4096;
|
||||
m_pointDepthTexSize = 1024;
|
||||
m_pointDepthTexSize = 2048;
|
||||
createShadowMaps();
|
||||
|
||||
if (!m_app->isCustomWindowIcon()) {
|
||||
|
@ -10,7 +10,7 @@ namespace nf {
|
||||
|
||||
class Material : public Drawable {
|
||||
public:
|
||||
Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess, ATexture* normalTex);
|
||||
Material(const void* vb, const size_t vbSize, const void* tc, const size_t tcSize, const void* vn, const size_t vnSize, const void* tan, const size_t tanSize, const void* ib, const unsigned int ibCount, ATexture* diffTex, Vec3& diffColor, ATexture* specTex, float shininess, ATexture* normalTex);
|
||||
|
||||
void render(Shader* shader, bool onlyDepth);
|
||||
|
||||
|
Reference in New Issue
Block a user