feat(renderer): buggy transparency
This commit is contained in:
parent
28ed11fb53
commit
b80eb03f9d
|
@ -53,6 +53,7 @@ uniform int numPointLights;
|
||||||
uniform DirLight sunLight;
|
uniform DirLight sunLight;
|
||||||
uniform Material material;
|
uniform Material material;
|
||||||
uniform sampler2DArray studs;
|
uniform sampler2DArray studs;
|
||||||
|
uniform float transparency;
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ void main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 studPx = texture(studs, vec3(vTexCoords, vSurfaceZ));
|
vec4 studPx = texture(studs, vec3(vTexCoords, vSurfaceZ));
|
||||||
FragColor = vec4(mix(result, vec3(studPx), studPx.w), 1);
|
FragColor = vec4(mix(result, vec3(studPx), studPx.w), 1-transparency);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 calculateDirectionalLight(DirLight light) {
|
vec3 calculateDirectionalLight(DirLight light) {
|
||||||
|
|
|
@ -70,6 +70,8 @@ void renderParts() {
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
glFrontFace(GL_CW);
|
glFrontFace(GL_CW);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
// Use shader
|
// Use shader
|
||||||
shader->use();
|
shader->use();
|
||||||
|
@ -114,12 +116,40 @@ void renderParts() {
|
||||||
// Pass in the camera position
|
// Pass in the camera position
|
||||||
shader->set("viewPos", camera.cameraPos);
|
shader->set("viewPos", camera.cameraPos);
|
||||||
|
|
||||||
// TODO: Same as todo in src/physics/simulation.cpp
|
// Sort by nearest
|
||||||
|
std::map<float, std::shared_ptr<Part>> sorted;
|
||||||
for (InstanceRef inst : workspace()->GetChildren()) {
|
for (InstanceRef inst : workspace()->GetChildren()) {
|
||||||
if (inst->GetClass()->className != "Part") continue;
|
if (inst->GetClass()->className != "Part") continue;
|
||||||
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(inst);
|
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(inst);
|
||||||
|
if (part->transparency > 0.00001) {
|
||||||
|
float distance = glm::length(glm::vec3(Data::Vector3(camera.cameraPos) - part->position()));
|
||||||
|
sorted[distance] = part;
|
||||||
|
} else {
|
||||||
|
glm::mat4 model = part->cframe;
|
||||||
|
if (part->name == "camera") model = camera.getLookAt();
|
||||||
|
model = glm::scale(model, part->size);
|
||||||
|
shader->set("model", model);
|
||||||
|
shader->set("material", Material {
|
||||||
|
.diffuse = part->color,
|
||||||
|
.specular = glm::vec3(0.5f, 0.5f, 0.5f),
|
||||||
|
.shininess = 16.0f,
|
||||||
|
});
|
||||||
|
glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(model)));
|
||||||
|
shader->set("normalMatrix", normalMatrix);
|
||||||
|
shader->set("texScale", part->size);
|
||||||
|
shader->set("transparency", part->transparency);
|
||||||
|
|
||||||
|
CUBE_MESH->bind();
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, CUBE_MESH->vertexCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Same as todo in src/physics/simulation.cpp
|
||||||
|
// According to LearnOpenGL, std::map automatically sorts its contents.
|
||||||
|
for (std::map<float, std::shared_ptr<Part>>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); it++) {
|
||||||
|
std::shared_ptr<Part> part = it->second;
|
||||||
glm::mat4 model = part->cframe;
|
glm::mat4 model = part->cframe;
|
||||||
if (inst->name == "camera") model = camera.getLookAt();
|
if (part->name == "camera") model = camera.getLookAt();
|
||||||
model = glm::scale(model, part->size);
|
model = glm::scale(model, part->size);
|
||||||
shader->set("model", model);
|
shader->set("model", model);
|
||||||
shader->set("material", Material {
|
shader->set("material", Material {
|
||||||
|
@ -130,6 +160,7 @@ void renderParts() {
|
||||||
glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(model)));
|
glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(model)));
|
||||||
shader->set("normalMatrix", normalMatrix);
|
shader->set("normalMatrix", normalMatrix);
|
||||||
shader->set("texScale", part->size);
|
shader->set("texScale", part->size);
|
||||||
|
shader->set("transparency", part->transparency);
|
||||||
|
|
||||||
CUBE_MESH->bind();
|
CUBE_MESH->bind();
|
||||||
glDrawArrays(GL_TRIANGLES, 0, CUBE_MESH->vertexCount);
|
glDrawArrays(GL_TRIANGLES, 0, CUBE_MESH->vertexCount);
|
||||||
|
|
Loading…
Reference in a new issue