feat(renderer): buggy transparency

This commit is contained in:
maelstrom 2025-03-05 23:55:38 +01:00
parent 28ed11fb53
commit b80eb03f9d
2 changed files with 35 additions and 3 deletions

View file

@ -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) {

View file

@ -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);