Ex06.1
This commit is contained in:
parent
19d92d9e30
commit
f561ceec19
2 changed files with 52 additions and 41 deletions
|
@ -9,58 +9,70 @@ Texture::Texture(int width, int height) { this->resize(width, height); }
|
|||
Texture::Texture(char const *fileName) { this->load(fileName); }
|
||||
|
||||
bool Texture::load(char const *fileName) {
|
||||
CImg<unsigned char> img_char(fileName);
|
||||
if (img_char.is_empty()) {
|
||||
std::cerr << "(Image): Could not open file " << fileName << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
this->image_ = CImg<float>(img_char.width(), img_char.height(), img_char.depth(), 3, 0);
|
||||
for (int c = 0; c < 3; c++)
|
||||
cimg_forXYZ(img_char, x, y, z) {
|
||||
this->image_(x, y, z, c) = img_char(x, y, z, std::min(c, img_char.spectrum() - 1)) / 255.0f;
|
||||
CImg<unsigned char> img_char(fileName);
|
||||
if (img_char.is_empty()) {
|
||||
std::cerr << "(Image): Could not open file " << fileName << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
this->image_ = CImg<float>(img_char.width(), img_char.height(), img_char.depth(), 3, 0);
|
||||
for (int c = 0; c < 3; c++)
|
||||
cimg_forXYZ(img_char, x, y, z) {
|
||||
this->image_(x, y, z, c) = img_char(x, y, z, std::min(c, img_char.spectrum() - 1)) / 255.0f;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Texture::save(char const *fileName) const {
|
||||
CImg<unsigned char> img_char;
|
||||
img_char = 255 * this->image_;
|
||||
CImg<unsigned char> img_char;
|
||||
img_char = 255 * this->image_;
|
||||
|
||||
img_char.save(fileName);
|
||||
return true;
|
||||
img_char.save(fileName);
|
||||
return true;
|
||||
}
|
||||
|
||||
Color Texture::getPixelAt(int x, int y) const {
|
||||
if ((x %= this->width()) < 0)
|
||||
x += this->width();
|
||||
if ((y %= this->height()) < 0)
|
||||
y += this->height();
|
||||
return Color(this->image_.atXY(x, y, 0), this->image_.atXY(x, y, 1), this->image_.atXY(x, y, 2));
|
||||
if ((x %= this->width()) < 0)
|
||||
x += this->width();
|
||||
if ((y %= this->height()) < 0)
|
||||
y += this->height();
|
||||
return Color(this->image_.atXY(x, y, 0), this->image_.atXY(x, y, 1), this->image_.atXY(x, y, 2));
|
||||
}
|
||||
|
||||
void Texture::setPixelAt(int x, int y, Color const &color) {
|
||||
if ((x %= this->width()) < 0)
|
||||
x += this->width();
|
||||
if ((y %= this->height()) < 0)
|
||||
y += this->height();
|
||||
this->image_(x, y, 0) = color.r;
|
||||
this->image_(x, y, 1) = color.g;
|
||||
this->image_(x, y, 2) = color.b;
|
||||
if ((x %= this->width()) < 0)
|
||||
x += this->width();
|
||||
if ((y %= this->height()) < 0)
|
||||
y += this->height();
|
||||
this->image_(x, y, 0) = color.r;
|
||||
this->image_(x, y, 1) = color.g;
|
||||
this->image_(x, y, 2) = color.b;
|
||||
}
|
||||
|
||||
Color Texture::color(float u, float v, bool interpolate) const {
|
||||
Color color;
|
||||
if (!interpolate) {
|
||||
color = this->getPixelAt(int(roundf(u * this->width())), int(roundf(v * this->height())));
|
||||
} else {
|
||||
// IMPLEMENT bilinear interpolation
|
||||
color = this->getPixelAt(int(roundf(u * this->width())), int(roundf(v * this->height())));
|
||||
}
|
||||
return color;
|
||||
Color color;
|
||||
if (!interpolate) {
|
||||
color = this->getPixelAt(int(roundf(u * this->width())), int(roundf(v * this->height())));
|
||||
} else {
|
||||
// IMPLEMENT bilinear interpolation
|
||||
float x1 = std::floor(u * this->width());
|
||||
float x2 = std::ceil(u * this->width());
|
||||
float y1 = std::floor(v * this->height());
|
||||
float y2 = std::ceil(v * this->height());
|
||||
float x = u * this->width();
|
||||
float y = v * this->height();
|
||||
Color x1y1 = this->getPixelAt(int(x1), int(y1));
|
||||
Color x2y1 = this->getPixelAt(int(x2), int(y1));
|
||||
Color x1y2 = this->getPixelAt(int(x1), int(y2));
|
||||
Color x2y2 = this->getPixelAt(int(x2), int(y2));
|
||||
Color fxy1 = ((x2 - x) / (x2 - x1)) * x1y1 + ((x - x1) / (x2 - x1)) * x2y1;
|
||||
Color fxy2 = ((x2 - x) / (x2 - x1)) * x1y2 + ((x - x1) / (x2 - x1)) * x2y2;
|
||||
color = ((y2 - y) / (y2 - y1)) * fxy1 + ((y - y1) / (y2 - y1)) * fxy2;
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
Color Texture::color(Vector2d const &surfacePosition, bool interpolate) const {
|
||||
return color(surfacePosition.u, surfacePosition.v, interpolate);
|
||||
return color(surfacePosition.u, surfacePosition.v, interpolate);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ Color MaterialShader::shade(Scene const &scene, Ray const &ray) const {
|
|||
|
||||
Color surfaceSpecularColor(0, 0, 0);
|
||||
if (this->specularMap != nullptr) {
|
||||
surfaceSpecularColor = this->specularMap->color(ray.surface);
|
||||
surfaceSpecularColor = this->specularMap->color(ray.surface, true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -82,14 +82,13 @@ Color MaterialShader::shade(Scene const &scene, Ray const &ray) const {
|
|||
fragmentColor += specular * illum.color;
|
||||
}
|
||||
|
||||
// Reflected ray
|
||||
fragmentColor += scene.traceRay(reflectionRay) * surfaceReflectanceCoefficient * illum.color;
|
||||
|
||||
}
|
||||
// Reflected ray
|
||||
fragmentColor += scene.traceRay(reflectionRay) * surfaceReflectanceCoefficient * reflectance;
|
||||
|
||||
// Opacity
|
||||
return fragmentColor * surfaceAlphaCoefficient + scene.traceRay(propagatedRay) * (1 - surfaceAlphaCoefficient);
|
||||
|
||||
// return fragmentColor;
|
||||
}
|
||||
|
||||
bool MaterialShader::isTransparent() const { return this->opacity < 1.0f || this->alphaMap; }
|
||||
|
|
Loading…
Reference in a new issue