gridtexture GLSL implementation for the material test ball scene
parent
121f49d05a
commit
b5b56bd20d
|
@ -192,6 +192,8 @@ public:
|
||||||
*/
|
*/
|
||||||
inline Spectrum sampleCos(BSDFQueryRecord &bRec) const {
|
inline Spectrum sampleCos(BSDFQueryRecord &bRec) const {
|
||||||
Spectrum bsdfVal = sample(bRec);
|
Spectrum bsdfVal = sample(bRec);
|
||||||
|
if (bsdfVal.isBlack())
|
||||||
|
return bsdfVal; // bRec.wo is undefined, play safe
|
||||||
return bsdfVal * std::abs(Frame::cosTheta(bRec.wo));
|
return bsdfVal * std::abs(Frame::cosTheta(bRec.wo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,6 +214,8 @@ public:
|
||||||
*/
|
*/
|
||||||
inline Spectrum sampleCos(BSDFQueryRecord &bRec, Float &pdf) const {
|
inline Spectrum sampleCos(BSDFQueryRecord &bRec, Float &pdf) const {
|
||||||
Spectrum bsdfVal(sample(bRec, pdf));
|
Spectrum bsdfVal(sample(bRec, pdf));
|
||||||
|
if (bsdfVal.isBlack())
|
||||||
|
return bsdfVal; // bRec.wo is undefined, play safe
|
||||||
return bsdfVal * std::abs(Frame::cosTheta(bRec.wo));
|
return bsdfVal * std::abs(Frame::cosTheta(bRec.wo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <mitsuba/render/texture.h>
|
#include <mitsuba/render/texture.h>
|
||||||
#include <mitsuba/render/shape.h>
|
#include <mitsuba/render/shape.h>
|
||||||
#include <mitsuba/core/properties.h>
|
#include <mitsuba/core/properties.h>
|
||||||
|
#include <mitsuba/hw/gpuprogram.h>
|
||||||
|
|
||||||
MTS_NAMESPACE_BEGIN
|
MTS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
@ -76,6 +77,8 @@ public:
|
||||||
return "GridTexture[]";
|
return "GridTexture[]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Shader *createShader(Renderer *renderer) const;
|
||||||
|
|
||||||
MTS_DECLARE_CLASS()
|
MTS_DECLARE_CLASS()
|
||||||
protected:
|
protected:
|
||||||
Spectrum m_brightReflectance;
|
Spectrum m_brightReflectance;
|
||||||
|
@ -83,6 +86,59 @@ protected:
|
||||||
Float m_width;
|
Float m_width;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ================ Hardware shader implementation ================
|
||||||
|
|
||||||
|
class GridTextureShader : public Shader {
|
||||||
|
public:
|
||||||
|
GridTextureShader(Renderer *renderer, const Spectrum &brightReflectance,
|
||||||
|
const Spectrum &darkReflectance, Float width) : Shader(renderer, ETextureShader),
|
||||||
|
m_brightReflectance(brightReflectance), m_darkReflectance(darkReflectance), m_width(width) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void generateCode(std::ostringstream &oss,
|
||||||
|
const std::string &evalName,
|
||||||
|
const std::vector<std::string> &depNames) const {
|
||||||
|
oss << "uniform vec3 " << evalName << "_brightReflectance;" << endl
|
||||||
|
<< "uniform vec3 " << evalName << "_darkReflectance;" << endl
|
||||||
|
<< "uniform float " << evalName << "_width;" << endl
|
||||||
|
<< endl
|
||||||
|
<< "vec3 " << evalName << "(vec2 uv) {" << endl
|
||||||
|
<< " float x = uv.x - floor(uv.x);" << endl
|
||||||
|
<< " float y = uv.y - floor(uv.y);" << endl
|
||||||
|
<< " if (x > .5) x -= 1.0;" << endl
|
||||||
|
<< " if (y > .5) y -= 1.0;" << endl
|
||||||
|
<< " if (abs(x) < " << evalName << "_width || abs(y) < " << evalName << "_width)" << endl
|
||||||
|
<< " return " << evalName << "_darkReflectance;" << endl
|
||||||
|
<< " else" << endl
|
||||||
|
<< " return " << evalName << "_brightReflectance;" << endl
|
||||||
|
<< "}" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resolve(const GPUProgram *program, const std::string &evalName, std::vector<int> ¶meterIDs) const {
|
||||||
|
parameterIDs.push_back(program->getParameterID(evalName + "_brightReflectance", false));
|
||||||
|
parameterIDs.push_back(program->getParameterID(evalName + "_darkReflectance", false));
|
||||||
|
parameterIDs.push_back(program->getParameterID(evalName + "_width", false));
|
||||||
|
}
|
||||||
|
|
||||||
|
void bind(GPUProgram *program, const std::vector<int> ¶meterIDs,
|
||||||
|
int &textureUnitOffset) const {
|
||||||
|
program->setParameter(parameterIDs[0], m_brightReflectance);
|
||||||
|
program->setParameter(parameterIDs[1], m_darkReflectance);
|
||||||
|
program->setParameter(parameterIDs[2], m_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
MTS_DECLARE_CLASS()
|
||||||
|
private:
|
||||||
|
Spectrum m_brightReflectance;
|
||||||
|
Spectrum m_darkReflectance;
|
||||||
|
Float m_width;
|
||||||
|
};
|
||||||
|
|
||||||
|
Shader *GridTexture::createShader(Renderer *renderer) const {
|
||||||
|
return new GridTextureShader(renderer, m_brightReflectance, m_darkReflectance, m_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
MTS_IMPLEMENT_CLASS(GridTextureShader, false, Shader)
|
||||||
MTS_IMPLEMENT_CLASS_S(GridTexture, false, Texture)
|
MTS_IMPLEMENT_CLASS_S(GridTexture, false, Texture)
|
||||||
MTS_EXPORT_PLUGIN(GridTexture, "Grid texture");
|
MTS_EXPORT_PLUGIN(GridTexture, "Grid texture");
|
||||||
MTS_NAMESPACE_END
|
MTS_NAMESPACE_END
|
||||||
|
|
Loading…
Reference in New Issue