#include "EnvironmentShader.hpp" #include #include #include "Globals.hpp" #ifdef HAVE_CONFIG_H #include "config.h" #endif using namespace SH; EnvironmentShader::EnvironmentShader() { } EnvironmentShader::~EnvironmentShader() { } void EnvironmentShader::init() { ShTextureCube cubemap; std::string imageNames[6] = {"left", "right", "top", "bottom", "back", "front"}; { ShImage image; for (int i = 0; i < 6; i++) { image.loadPng(std::string(SHMEDIA_DIR "/envmaps/aniroom/") + imageNames[i] + ".png"); ShTexture2D face(image.width(), image.height()); face.load(image); cubemap.set(static_cast(i), face); } } vsh = SH_BEGIN_VERTEX_PROGRAM { ShInputNormal3f normal; ShInputTexCoord2f texture; ShInputPosition4f pos; ShOutputNormal3f out_normal; ShOutputPoint3f out_posEye; ShOutputPosition4f out_posDevice; out_posEye = (Globals::mv | pos)(0,1,2); out_posDevice = Globals::mvp | pos; out_normal = Globals::mv | normal; } SH_END_PROGRAM; ShAttrib1f Ks(1.0); ShAttrib1f roughness(0.1); ShColor3f lightColor(1, 1, 1); fsh = SH_BEGIN_FRAGMENT_PROGRAM { ShInputNormal3f normal; ShInputPoint3f posEye; ShInputPosition4f p; ShOutputColor4f out_color; out_color = cubemap(normalize(reflect(normalize(normal), normalize(-posEye)))); } SH_END_PROGRAM; } void EnvironmentShader::apply() { shBindShader(vsh); shBindShader(fsh); } void EnvironmentShader::vertex(const SH::ShPoint4f& n, // normal const SH::ShPoint4f& t, // tangent const SH::ShPoint4f& tex, // texture // coordinates const SH::ShPoint4f& t2, // secondary // tangent const SH::ShPoint4f& v // vertex ) { pushSmAttrib(n); pushSmAttrib(tex); pushSmVertex(v); } // Instantiate the shader EnvironmentShader environmentShader;