Archived
1
Fork 0

Fix look_at, and stop scene capture from creating cubemap seams

This commit is contained in:
redstrate 2020-08-19 17:15:00 -04:00
parent 6656bd8e58
commit 56cfc02816
7 changed files with 32 additions and 32 deletions

View file

@ -167,6 +167,15 @@ constexpr inline Vector<N, T> operator*(const Vector<N, T> lhs, const Vector<N,
return vec;
}
template<std::size_t N, class T>
constexpr inline Vector<N, T> operator+(const Vector<N, T> lhs, const T scalar) {
Vector<N, T> vec;
for(std::size_t i = 0; i < N; i++)
vec[i] = lhs[i] + scalar;
return vec;
}
template<std::size_t N, class T>
constexpr inline Vector<N, T> operator*(const Vector<N, T> lhs, const T scalar) {
Vector<N, T> vec;

View file

@ -52,7 +52,7 @@ Matrix4x4 transform::orthographic(float left, float right, float bottom, float t
Matrix4x4 transform::look_at(const Vector3 eye, const Vector3 center, const Vector3 up) {
const Vector3 f = normalize(center - eye);
const Vector3 s = normalize(cross(f, up));
const Vector3 s = normalize(cross(up, f));
const Vector3 u = cross(f, s);
Matrix4x4 result(1.0f);
@ -101,11 +101,12 @@ Matrix4x4 transform::rotate(const Matrix4x4 matrix, const float angle, const Vec
Rotate[2][2] = c + temp[2] * axis[2];
Matrix4x4 result(1.0f);
result[0] = Rotate[0][0] + Rotate[0][1] + Rotate[0][2];
result[1] = Rotate[1][0] + Rotate[1][1] + Rotate[1][2];
result[2] = Rotate[2][0] + Rotate[2][1] + Rotate[2][2];
result[0] = matrix[0] * Rotate[0][0] + matrix[1] * Rotate[0][1] + matrix[2] * Rotate[0][2];
result[1] = matrix[0] * Rotate[1][0] + matrix[1] * Rotate[1][1] + matrix[2] * Rotate[1][2];
result[2] = matrix[0] * Rotate[2][0] + matrix[1] * Rotate[2][1] + matrix[2] * Rotate[2][2];
result[3] = matrix[3];
return matrix * result;
return result;
}
Matrix4x4 transform::scale(const Matrix4x4 matrix, const Vector3 scale) {

View file

@ -45,22 +45,12 @@ struct SceneInformation {
const int mipLevels = 5;
const std::array<Matrix4x4, 6> sceneTransforms = {
transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0,-1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0,1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0))
};
// for some reason, our sky shader does not like the up/down transforms, so we reverse them here...
const std::array<Matrix4x4, 6> skyTransforms = {
transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, 1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, -1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0))
transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), // right
transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), // left
transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, -1.0)), // top
transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, 1.0)), // bottom
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)), // back
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0)) // front
};
inline AssetPtr<Mesh> cubeMesh;
@ -293,7 +283,7 @@ void SceneCapture::render(GFXCommandBuffer* command_buffer, Scene* scene) {
float aspect;
} pc;
pc.view = skyTransforms[face];
pc.view = sceneTransforms[face];
pc.aspect = 1.0f;
for(auto& [obj, light] : scene->get_all<Light>()) {

View file

@ -15,12 +15,12 @@ struct PushConstant {
};
const std::array<Matrix4x4, 6> shadowTransforms = {
transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0,1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0,-1.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)),
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0))
transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, 1.0, 0.0)), // right
transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, 1.0, 0.0)), // left
transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, -1.0)), // top
transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, 1.0)), // bottom
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, 1.0, 0.0)), // back
transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, 1.0, 0.0)) // front
};
ShadowPass::ShadowPass(GFX* gfx) {
@ -231,7 +231,7 @@ void ShadowPass::render_spot(GFXCommandBuffer* command_buffer, Scene& scene, Obj
const Matrix4x4 realMVP = perspective * inverse(scene.get<Transform>(light_object).model);
scene.spotLightSpaces[last_spot_light] = perspective;
scene.spotLightSpaces[last_spot_light][1][1] *= -1;
scene.spotLightSpaces[1][1] *= -1;
scene.spotLightSpaces[last_spot_light] = scene.spotLightSpaces[last_spot_light] * inverse(scene.get<Transform>(light_object).model);
const auto frustum = normalize_frustum(extract_frustum(perspective * inverse(scene.get<Transform>(light_object).model)));

View file

@ -13,7 +13,7 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{
};
void main() {
const vec3 N = normalize(inPos);
vec3 N = normalize(inPos);
// make the simplyfying assumption that V equals R equals the normal
const vec3 R = N;

View file

@ -9,5 +9,5 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{
void main() {
gl_Position = mvp * vec4(inPosition, 1.0);
outPos = inPosition, 1.0;
outPos = inPosition;
}

View file

@ -8,5 +8,5 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{
void main() {
gl_Position = mvp * vec4(inPosition, 1.0);
outPos = inPosition, 1.0;
outPos = inPosition;
}