我使用「Ray Tracer從頭開始」的書作爲教程,但我沒有在相同的代碼中具有相同的resaults,我認爲它是相同的(我已經檢查過幾次)。RayTracer球形映射
代碼(d_type :: Bfloat是雙):
void getTexelCoord(const Vector3Bf localHitPoint, const d_type::Bint m_width, const d_type::Bint m_height, d_type::Bint& row, d_type::Bint& column) const
{
d_type::Bfloat theta=acosf(localHitPoint.y);
d_type::Bfloat phi= atan2f(localHitPoint.x,localHitPoint.z);
if(phi<0.0)
{
phi+=TWO_PI;
}
d_type::Bfloat u =phi*INV_TWO_PI;
d_type::Bfloat v=1-theta*INV_PI;
column = (d_type::Bint)((m_width-1)*u);
row = (d_type::Bint)((m_height-1)*v);
}
virtual Colour getColour(const Info&info)const
{
d_type::Bint row,column;
if(m_mapping)
{
m_mapping->getTexelCoord(info.m_localHitPoint,hres, vres, row, column);
}
else
{
row=(int)(info.uv.x*(hres-1));
column=(int)(info.uv.y*(vres-1));
}
return m_image->getColour(row,column);
}
Colour getColour(const int row, const int column) const {
int index = column + hres * (vres - row - 1);
int pixels_size = hres*vres;
if (index < pixels_size)
return (m_pixels[index]);
else
return (Colour::Red);
}
在球命中本地點計算如下:
info.m_localHitPoint=(ray.getOrigin()+(ray.getDirection()*t));
其中噸是關閉交點
相同....它只改變紋理的旋轉,但白色錶帶是相同的。 – Menos
因此,無論你的紋理只填充其圖像的一半,或者你在某處的高度值出來的因子爲2 – Alnitak
當我將文件的替換值更改爲紅色時,所有球體都變成紅色......所以它是somwthing與紋理錯誤。 – Menos