it works better that way, but there are lots of horrendous artifacts
This commit is contained in:
parent
4c60315805
commit
2d25ea18f6
@ -61,6 +61,11 @@ const float MAX_REFLECTION_LOD = 4.0;
|
|||||||
// FUNCTIONS
|
// FUNCTIONS
|
||||||
|
|
||||||
#ifdef AMBIENT_LIGHT
|
#ifdef AMBIENT_LIGHT
|
||||||
|
vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness)
|
||||||
|
{
|
||||||
|
return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0);
|
||||||
|
}
|
||||||
|
|
||||||
vec3 GGX(
|
vec3 GGX(
|
||||||
in vec3 albedoColor,
|
in vec3 albedoColor,
|
||||||
in float metallic,
|
in float metallic,
|
||||||
@ -71,20 +76,26 @@ vec3 GGX(
|
|||||||
float NdotV = max(dot(N, V), 0.0);
|
float NdotV = max(dot(N, V), 0.0);
|
||||||
vec3 R = reflect(-V, N);
|
vec3 R = reflect(-V, N);
|
||||||
vec3 albedo = pow(albedoColor, vec3(2.2));
|
vec3 albedo = pow(albedoColor, vec3(2.2));
|
||||||
vec3 F0 = mix(vec3(0.04), albedo, metallic);
|
// calculate reflectance at normal incidence; if dia-electric (like plastic) use F0
|
||||||
|
// of 0.04 and if it's a metal, use their albedo color as F0 (metallic workflow)
|
||||||
|
vec3 F0 = vec3(0.04);
|
||||||
|
F0 = mix(F0, albedo, metallic);
|
||||||
|
|
||||||
// ambient lighting (we now use IBL as the ambient term) (fresnelSchlickRoughness function)
|
// ambient lighting (we now use IBL as the ambient term) (fresnelSchlickRoughness function)
|
||||||
vec3 F = F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - NdotV, 5.0);
|
vec3 F = fresnelSchlickRoughness(NdotV, F0, roughness);
|
||||||
|
|
||||||
vec3 kD = 1.0 - F;
|
vec3 kS = F;
|
||||||
|
vec3 kD = 1.0 - kS;
|
||||||
kD *= 1.0 - metallic;
|
kD *= 1.0 - metallic;
|
||||||
|
|
||||||
vec3 irradiance = texture(ambientMap, inverseViewMatrix * N).rgb;
|
mat3 viewToWorld = inverseViewMatrix;
|
||||||
vec3 diffuse = irradiance * albedo;
|
|
||||||
|
vec3 irradiance = texture(ambientMap, viewToWorld*N).rgb;
|
||||||
|
vec3 diffuse = irradiance * albedo;
|
||||||
|
|
||||||
// sample both the pre-filter map and the BRDF lut and combine them together as per the Split-Sum approximation to get the IBL specular part.
|
// sample both the pre-filter map and the BRDF lut and combine them together as per the Split-Sum approximation to get the IBL specular part.
|
||||||
|
|
||||||
vec3 prefilteredColor = textureLod(reflectMap, inverseViewMatrix * R, roughness * MAX_REFLECTION_LOD).rgb;
|
vec3 prefilteredColor = textureLod(reflectMap, viewToWorld * R, roughness * MAX_REFLECTION_LOD).rgb;
|
||||||
vec2 brdf2 = texture(brdfLUT, vec2(NdotV, roughness)).rg;
|
vec2 brdf2 = texture(brdfLUT, vec2(NdotV, roughness)).rg;
|
||||||
vec3 specular = prefilteredColor * (F * brdf2.x + brdf2.y);
|
vec3 specular = prefilteredColor * (F * brdf2.x + brdf2.y);
|
||||||
|
|
||||||
|
25
shaders/skybox.frag.glsl
Normal file
25
shaders/skybox.frag.glsl
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
// - Position in view space
|
||||||
|
layout (location = 0) out vec4 outPosition;
|
||||||
|
// - Albedo + Roughness
|
||||||
|
layout (location = 1) out vec4 outAlbedo;
|
||||||
|
// - Normal buffer
|
||||||
|
layout (location = 2) out vec3 outNormal;
|
||||||
|
// - Emission + Metallic
|
||||||
|
layout (location = 3) out vec4 outEmission;
|
||||||
|
|
||||||
|
in vec3 varTexCoord;
|
||||||
|
|
||||||
|
out vec4 outColor;
|
||||||
|
|
||||||
|
uniform samplerCube skybox;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
outAlbedo.rgb = vec3(0., 0., 0.); // black
|
||||||
|
outAlbedo.a = 1.; // full roughness
|
||||||
|
outEmission.a = 0.; // not metallic
|
||||||
|
outNormal = vec3(0., 0., 1.); // oriented towards the eye
|
||||||
|
outEmission.rgb = texture(skybox, varTexCoord).rgb;
|
||||||
|
}
|
13
shaders/skybox.vert.glsl
Normal file
13
shaders/skybox.vert.glsl
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
layout(location = 0)in vec3 inPosition;
|
||||||
|
|
||||||
|
out vec3 varTexCoord;
|
||||||
|
|
||||||
|
uniform mat4 MVP;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = MVP * vec4(inPosition, 1.0);
|
||||||
|
varTexCoord = inPosition;
|
||||||
|
}
|
@ -121,6 +121,12 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.f);
|
||||||
glClearDepth(1.0f);
|
glClearDepth(1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
// draw skybox
|
||||||
|
if(m_skybox != nullptr)
|
||||||
|
{
|
||||||
|
m_skybox->renderGL(m_camera);
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
// loop on geometry
|
// loop on geometry
|
||||||
for(SceneIterator<GeometryNode*>* geometryIt = scene->getGeometry();
|
for(SceneIterator<GeometryNode*>* geometryIt = scene->getGeometry();
|
||||||
geometryIt->isValid(); geometryIt->next())
|
geometryIt->isValid(); geometryIt->next())
|
||||||
@ -156,9 +162,6 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
glBlendFunc(GL_ONE, GL_ONE);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
if(m_skybox != nullptr)
|
|
||||||
m_skybox->renderGL(m_camera);
|
|
||||||
|
|
||||||
m_gBuffer->bindTextures();
|
m_gBuffer->bindTextures();
|
||||||
for(SceneIterator<Light*>* lightIt = scene->getLights();
|
for(SceneIterator<Light*>* lightIt = scene->getLights();
|
||||||
lightIt->isValid(); lightIt->next())
|
lightIt->isValid(); lightIt->next())
|
||||||
|
@ -6,9 +6,12 @@
|
|||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "opengl.h"
|
#include "opengl.h"
|
||||||
|
#include <resource.h>
|
||||||
|
|
||||||
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
|
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
|
||||||
|
|
||||||
|
RESOURCE_PACK(shaders)
|
||||||
|
|
||||||
Skybox::Skybox(Texture* myCubeMap)
|
Skybox::Skybox(Texture* myCubeMap)
|
||||||
{
|
{
|
||||||
cubeMap = myCubeMap;
|
cubeMap = myCubeMap;
|
||||||
@ -24,6 +27,10 @@ Skybox::Skybox(Texture* myCubeMap)
|
|||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(0));
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(0));
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
|
Resource::ResourceMap shaderMap;
|
||||||
|
Resource::getResourcePack_shaders(shaderMap);
|
||||||
|
std::string vertSource = shaderMap["shaders/skybox.vert.glsl"];
|
||||||
|
std::string fragSource = shaderMap["shaders/skybox.frag.glsl"];
|
||||||
shader = new Shader(vertSource, fragSource);
|
shader = new Shader(vertSource, fragSource);
|
||||||
mvpLocation = shader->getLocation("MVP");
|
mvpLocation = shader->getLocation("MVP");
|
||||||
cubemapLocation = shader->getLocation("skybox");
|
cubemapLocation = shader->getLocation("skybox");
|
||||||
@ -39,10 +46,7 @@ Skybox::~Skybox()
|
|||||||
|
|
||||||
void Skybox::renderGL(Camera* myCamera)
|
void Skybox::renderGL(Camera* myCamera)
|
||||||
{
|
{
|
||||||
glViewport(0, 0, width, height);
|
|
||||||
glm::mat4 viewMatrix = glm::mat4(glm::mat3(myCamera->getViewMatrix()));
|
glm::mat4 viewMatrix = glm::mat4(glm::mat3(myCamera->getViewMatrix()));
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
glDepthMask(GL_FALSE);
|
|
||||||
|
|
||||||
shader->bind();
|
shader->bind();
|
||||||
shader->bindMat4(mvpLocation, myCamera->getProjectionMatrix() * viewMatrix);
|
shader->bindMat4(mvpLocation, myCamera->getProjectionMatrix() * viewMatrix);
|
||||||
@ -53,9 +57,6 @@ void Skybox::renderGL(Camera* myCamera)
|
|||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[0]);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[0]);
|
||||||
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, NULL);
|
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, NULL);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
|
||||||
glEnable(GL_CULL_FACE);
|
|
||||||
glDepthMask(GL_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const GLfloat Skybox::skyboxVertices[] = {
|
const GLfloat Skybox::skyboxVertices[] = {
|
||||||
@ -83,24 +84,3 @@ const GLubyte Skybox::skyboxIndices[] = {
|
|||||||
2, 6, 3,
|
2, 6, 3,
|
||||||
6, 7, 3
|
6, 7, 3
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::string Skybox::vertSource =
|
|
||||||
"#version 330 core\n\
|
|
||||||
layout(location = 0)in vec3 inPosition;\n\
|
|
||||||
out vec3 varTexCoord;\n\
|
|
||||||
uniform mat4 MVP;\n\
|
|
||||||
void main()\n\
|
|
||||||
{\n\
|
|
||||||
gl_Position = MVP * vec4(inPosition, 1.0);\n\
|
|
||||||
varTexCoord = inPosition;\n\
|
|
||||||
}\n";
|
|
||||||
|
|
||||||
const std::string Skybox::fragSource =
|
|
||||||
"#version 330 core\n\
|
|
||||||
in vec3 varTexCoord;\n\
|
|
||||||
out vec4 outColor;\n\
|
|
||||||
uniform samplerCube skybox;\n\
|
|
||||||
void main()\n\
|
|
||||||
{\n\
|
|
||||||
outColor = texture(skybox, varTexCoord);\n\
|
|
||||||
}\n";
|
|
||||||
|
@ -12,8 +12,6 @@ class Skybox
|
|||||||
{
|
{
|
||||||
static const GLfloat skyboxVertices[];
|
static const GLfloat skyboxVertices[];
|
||||||
static const GLubyte skyboxIndices[];
|
static const GLubyte skyboxIndices[];
|
||||||
static const std::string vertSource;
|
|
||||||
static const std::string fragSource;
|
|
||||||
|
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user