Add albedo output to the raytracer

This commit is contained in:
IlyaShurupov 2024-06-18 15:45:51 +03:00 committed by Ilya Shurupov
parent 8bfe44b3cd
commit 3cc8dbc102
4 changed files with 21 additions and 9 deletions

View file

@ -10,7 +10,7 @@ namespace tp {
mRender(renderResolution) { mRender(renderResolution) {
mImage = canvas->createImageFromTextId(mRender.getRenderBufferID(), { 0, 0 }); mImage = canvas->createImageFromTextId(mRender.getRenderBufferID(), { 0, 0 });
mGeometry = geometry; mScene = geometry;
mCanvas = canvas; mCanvas = canvas;
} }
@ -18,18 +18,18 @@ namespace tp {
void eventProcess(const Events& events) override { void eventProcess(const Events& events) override {
mRender.getRenderBuffer()->resize(this->mArea.size); mRender.getRenderBuffer()->resize(this->mArea.size);
mGeometry->mCamera.rotate(0.01f, 0.0); mScene->mCamera.rotate(0.01f, 0.0);
mGeometry->mCamera.setRatio(this->mArea.w / this->mArea.z); mScene->mCamera.setRatio(this->mArea.w / this->mArea.z);
} }
void eventDraw(Canvas& canvas) override { void eventDraw(Canvas& canvas) override {
mRender.render(*mGeometry, this->mArea.size); mRender.render(*mScene, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, PI); canvas.drawImage(this->mArea, &mImage, PI);
} }
public: public:
Render mRender; Render mRender;
Scene* mGeometry = nullptr; Scene* mScene = nullptr;
Canvas* mCanvas = nullptr; Canvas* mCanvas = nullptr;
Canvas::ImageHandle mImage; Canvas::ImageHandle mImage;
}; };

View file

@ -74,9 +74,10 @@ void renderCommand(const std::string& scenePath) {
std::cout << "\nRender finished with average render time per sample - " << (end - start) << " (ms)\n"; std::cout << "\nRender finished with average render time per sample - " << (end - start) << " (ms)\n";
writeImage(output.normals, "normals.png"); writeImage(output.normals, "normal.png");
writeImage(output.color, "color.png"); writeImage(output.color, "color.png");
writeImage(output.depth, "depth.png"); writeImage(output.depth, "depth.png");
writeImage(output.albedo, "albedo.png");
} }
int main(int argc, const char** argv) { int main(int argc, const char** argv) {

View file

@ -45,6 +45,7 @@ using namespace tp;
void RayTracer::castRay(const Ray& ray, RayCastData& out, alnf farVal) { void RayTracer::castRay(const Ray& ray, RayCastData& out, alnf farVal) {
out.hit = false; out.hit = false;
out.obj = nullptr;
farVal *= farVal; farVal *= farVal;
@ -120,6 +121,7 @@ void RayTracer::render(const Scene& scene, OutputBuffers& out, const RenderSetti
out.color.reserve({ settings.size.x, settings.size.y }); out.color.reserve({ settings.size.x, settings.size.y });
out.normals.reserve({ settings.size.x, settings.size.y }); out.normals.reserve({ settings.size.x, settings.size.y });
out.depth.reserve({ settings.size.x, settings.size.y }); out.depth.reserve({ settings.size.x, settings.size.y });
out.albedo.reserve({ settings.size.x, settings.size.y });
mScene = &scene; mScene = &scene;
mSettings = settings; mSettings = settings;
@ -169,6 +171,7 @@ void RayTracer::render(const Scene& scene, OutputBuffers& out, const RenderSetti
out.color.set({ i, j }, 0.f); out.color.set({ i, j }, 0.f);
out.normals.set({ i, j }, 0.f); out.normals.set({ i, j }, 0.f);
out.depth.set({ i, j }, 0.f); out.depth.set({ i, j }, 0.f);
out.albedo.set({ i, j }, 0.f);
} }
} }
@ -183,6 +186,13 @@ void RayTracer::render(const Scene& scene, OutputBuffers& out, const RenderSetti
castRay(ray, castData, mScene->mCamera.getFar()); castRay(ray, castData, mScene->mCamera.getFar());
halni albedoColor = abs(hash((ualni) castData.obj));
halnf albedoColorR = float((albedoColor & 0x00000011) % 155) + 100;
halnf albedoColorG = float((albedoColor & 0x00001100) % 155) + 100;
halnf albedoColorB = float((albedoColor & 0x00110000) % 155) + 100;
out.albedo.set({ i, j }, { albedoColorR, albedoColorG, albedoColorB, 1.f });
if (castData.hit) { if (castData.hit) {
LightData lightData; LightData lightData;
cycle(castData, lightData, mSettings.depth); cycle(castData, lightData, mSettings.depth);
@ -198,9 +208,9 @@ void RayTracer::render(const Scene& scene, OutputBuffers& out, const RenderSetti
accumulateColor(out.depth.get({ i, j }), { depth, depth, depth, 1.f }); accumulateColor(out.depth.get({ i, j }), { depth, depth, depth, 1.f });
} else { } else {
out.color.set({ i, j }, 0.f); // out.color.set({ i, j }, 0.f);
out.normals.set({ i, j }, 0.f); // out.normals.set({ i, j }, 0.f);
out.depth.set({ i, j }, 0.f); // out.depth.set({ i, j }, 0.f);
} }
// auto tmp = buff.get({i, j}); // auto tmp = buff.get({i, j});

View file

@ -56,6 +56,7 @@ namespace tp {
RenderBuffer normals; RenderBuffer normals;
RenderBuffer color; RenderBuffer color;
RenderBuffer depth; RenderBuffer depth;
RenderBuffer albedo;
// albedo, reflectance ... // albedo, reflectance ...
}; };