I have experienced that as well for some computers, which is why I have made a couple of changes to the code to showcase the problem in a better way.
Could you try the new version?
Code: Select all
#ifndef __CubeMapping_H__
#define __CubeMapping_H__
#include "SdkSample.h"
#include "windows.h"
//#define USE_LIGHT_ARRAYS
using namespace Ogre;
using namespace OgreBites;
class _OgreSampleClassExport Sample_CubeMapping : public SdkSample, public RenderTargetListener
{
public:
Sample_CubeMapping()
{
mInfo["Title"] = "Cube Mapping";
mInfo["Description"] = "Demonstrates the cube mapping feature where a wrap-around environment is reflected "
"off of an object. Uses render-to-texture to create dynamic cubemaps.";
mInfo["Thumbnail"] = "thumb_cubemap.png";
mInfo["Category"] = "Unsorted";
}
std::vector<Entity*> tmpEntities;
std::vector<SceneNode*> tmpSceneNodes;
bool IsNumlockToggled()
{
return (GetKeyState(VK_NUMLOCK) & 0x0001) != 0;
}
bool frameRenderingQueued(const FrameEvent& evt) override
{
bool r = SdkSample::frameRenderingQueued(evt); // don't forget the parent updates!
#ifndef USE_LIGHT_ARRAYS
ColourValue c = ColourValue(0.0f, 0.0f, 0.0f, 1.0f);
if (IsNumlockToggled())
c = ColourValue(0.5f, 0.5f, 0.5f, 1.0f);
if (tmpEntities.size() != 0)
{
Entity* e = tmpEntities[0];
MaterialPtr m = e->getSubEntity(0)->getMaterial();
GpuProgramParametersSharedPtr gpup = m->getTechnique(0)->getPass(0)->getFragmentProgramParameters();
for (int i = 0; i <= 19; i++)
{
std::string is = std::to_string(i);
gpup->setNamedConstant("lightDiffuse" + is, c);
gpup->setNamedConstant("lightSpecular" + is, c);
gpup->setNamedConstant("lightAttenuation" + is, c);
gpup->setNamedConstant("lightPosition" + is, c);
gpup->setNamedConstant("lightDirection" + is, c);
gpup->setNamedConstant("lightSpotParams" + is, c);
}
}
#endif
return r;
}
bool mouseReleased(const MouseButtonEvent& evt) override
{
if (mTrayMgr->mouseReleased(evt))
return true;
if (evt.button == BUTTON_MIDDLE)
{
std::vector<GpuProgramPtr> tmpGPUPrograms;
ResourceManager::ResourceMapIterator tmpItr = GpuProgramManager::getSingleton().getResourceIterator();
if (tmpItr.begin() == tmpItr.end())
tmpItr = HighLevelGpuProgramManager::getSingleton().getResourceIterator();
for (ResourceManager::ResourceMapIterator::const_iterator i = tmpItr.begin(); i != tmpItr.end(); ++i)
{
const ResourcePtr tmpResourcePtr = i->second;
const Ogre::String& tmpName = tmpResourcePtr->getName();
if (/*tmpName == "Test_AlphaRejection_VS" ||*/
tmpName == "TestBug_PS")
{
GpuProgramPtr tmpGpuProgram = GpuProgramManager::getSingleton().getByName(tmpName);
if (tmpGpuProgram)
tmpGPUPrograms.push_back(tmpGpuProgram);
}
}
for (size_t i = 0; i < tmpGPUPrograms.size(); i++)
tmpGPUPrograms[i]->reload();
}
#ifdef USE_LIGHT_ARRAYS
if (evt.button == BUTTON_RIGHT)
{
static std::vector<Light*> tmpLights;
if (tmpLights.size() == 0)
{
SceneNode* tmpParent = mSceneMgr->getRootSceneNode()->createChildSceneNode();
tmpParent->setPosition(Vector3(0.0f, 2.0f, 0.0f));
// Create the lights
for (int i = 0; i < 300; i++)
{
Light* tmpLight = mSceneMgr->createLight();
tmpParent->attachObject(tmpLight);
tmpLight->setCastShadows(false);
tmpLight->setType(Light::LT_POINT);
tmpLight->setDiffuseColour(ColourValue(0.5f, 0.5f, 0.5f, 1.0f));
tmpLight->setSpecularColour(ColourValue(0.01f, 0.01f, 0.01f));
tmpLight->setAttenuation(1000000.0f, 0.0f, 0.01f, 0.0f);
tmpLights.push_back(tmpLight);
}
}
else
{
SceneNode* tmpParent = tmpLights[0]->getParentSceneNode();
// Destroy the lights
for (int i = 0; i < (int)tmpLights.size(); i++)
{
Light* tmpLight = tmpLights[i];
tmpLight->detachFromParent();
mSceneMgr->destroyLight(tmpLight);
}
mSceneMgr->destroySceneNode(tmpParent);
// Clear the list of lights
tmpLights.clear();
}
}
#endif
return true;
}
protected:
// Helper functions taken from my main project
Vector3 __GetPosition(Camera* obj)
{
return obj->getDerivedPosition();
}
void __SetPosition(Camera* obj, const Vector3& vec)
{
Node* tmpNode = obj->getParentNode();
tmpNode->setPosition(vec);
}
void __LookAt(Camera* obj, const Vector3& pos)
{
Vector3 tmpPosition = __GetPosition(obj);
__SetDirection(obj, (pos - tmpPosition).normalisedCopy(), true);
}
Quaternion __GetOrientation(Camera* obj)
{
return obj->getDerivedOrientation();
}
void __SetDirection(Camera* obj, const Vector3& vec, bool yawFixed)
{
Quaternion mOrientation = Quaternion::IDENTITY;
if (vec == Vector3::ZERO) return;
Vector3 zAdjustVec = -vec;
zAdjustVec.normalise();
Quaternion targetWorldOrientation;
if (yawFixed)
{
Vector3 mYawFixedAxis = Vector3::UNIT_Y;
Vector3 xVec = mYawFixedAxis.crossProduct(zAdjustVec);
xVec.normalise();
Vector3 yVec = zAdjustVec.crossProduct(xVec);
yVec.normalise();
targetWorldOrientation.FromAxes(xVec, yVec, zAdjustVec);
}
else
{
Quaternion mRealOrientation = __GetOrientation(obj);
Vector3 axes[3];
mRealOrientation.ToAxes(axes);
Quaternion rotQuat;
if ((axes[2] + zAdjustVec).squaredLength() < 0.00005f)
{
rotQuat.FromAngleAxis(Radian(Math::PI), axes[1]);
}
else
{
rotQuat = axes[2].getRotationTo(zAdjustVec);
}
targetWorldOrientation = rotQuat * mRealOrientation;
}
mOrientation = targetWorldOrientation;
SceneNode* tmpNode = obj->getParentSceneNode();
tmpNode->_setDerivedOrientation(mOrientation);
tmpNode->_update(true, false);
}
void setupContent() override
{
// Create the vertex shader and its material
Ogre::String renderSystemName = mRoot->getRenderSystem()->getName();
bool isUsingD3D9 = renderSystemName == "Direct3D9 Rendering Subsystem";
// Create the vertex program
Ogre::GpuProgramManager& gpuProgManager = Ogre::GpuProgramManager::getSingleton();
auto vertexProgram = gpuProgManager.createProgram(
"TestBug_VS",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
"hlsl",
Ogre::GPT_VERTEX_PROGRAM);
vertexProgram->setParameter("entry_point", "main_vs");
if(isUsingD3D9)
vertexProgram->setParameter("target", "vs_3_0");
else
vertexProgram->setParameter("target", "vs_5_0");
Ogre::String tmpSource =
R"(float4x4 modelViewProj;
struct VS_OUTPUT
{
float3 oVertexPos : TEXCOORD0;
float2 oUV : TEXCOORD1;
};
VS_OUTPUT main_vs(float4 position : POSITION,
out float4 oPosition : POSITION,
float2 iUV : TEXCOORD0)
{
VS_OUTPUT Out;
oPosition = mul(modelViewProj, position);
Out.oVertexPos = position.xyz;
Out.oUV = iUV;
return Out;
})";
vertexProgram->setSource(tmpSource);
vertexProgram->load();
/*
vertex_program TestBug_VS hlsl
{
//source X_VS.hlsl
entry_point main_vs
target vs_5_0
default_params
{
param_named_auto modelViewProj worldviewproj_matrix
}
}
*/
// Add default parameters to the vertex program
auto vertexParams = vertexProgram->getDefaultParameters();
vertexParams->setNamedAutoConstant("modelViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
// Create the fragment shader and its material
auto fragmentProgram = gpuProgManager.createProgram(
"TestBug_PS",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
"hlsl",
Ogre::GPT_FRAGMENT_PROGRAM);
fragmentProgram->setParameter("entry_point", "main_ps");
if(isUsingD3D9)
fragmentProgram->setParameter("target", "ps_3_0");
else
fragmentProgram->setParameter("target", "ps_5_0");
tmpSource =
R"(
struct LIGHT_OUTPUT
{
float3 diffuse;
float3 specular;
};
float computeAttenuation( float3 vertexposition, float3 lightposition,
float4 attenuation )
{
float d = distance( vertexposition, lightposition );
return 1/(attenuation.y + attenuation.z * d + attenuation.w * d * d);
}
float computeSpotlight( float3 LightToVertexNorm, float3 lightdirection, float3 spotlightparams )
{
float cosSpotLightAngle = saturate(dot(LightToVertexNorm, lightdirection));
float spotFactor = pow(saturate(cosSpotLightAngle - spotlightparams.y) / (spotlightparams.x - spotlightparams.y), spotlightparams.z);
return spotFactor;
}
LIGHT_OUTPUT computeLighting( float3 lightposition, float3 P, float3 N, float3 V, float materialsh,
float4 lightattenuation,
float3 lightspecular, float3 lightdiffuse, float3 spotlightparams,
float3 lightdirection )
{
float3 L = normalize( lightposition - P );
float diffuseLight = max( dot( N, L ), 0);
float3 H = normalize( L + V );
float specularLight = pow(max( dot( N, H ), 0 ), materialsh);
if( diffuseLight <= 0 ) specularLight = 0;
float AttenuationFactor = computeAttenuation( P, lightposition, lightattenuation );
float spotlight = 1.0f;
if( spotlightparams[ 0 ] != 1.0f )
spotlight = computeSpotlight( normalize( (P - lightposition) ), lightdirection, spotlightparams );
LIGHT_OUTPUT Out;
Out.diffuse = diffuseLight * AttenuationFactor * spotlight * lightdiffuse;
Out.specular = specularLight * AttenuationFactor * spotlight * lightspecular;
return Out;
}
)";
#ifdef USE_LIGHT_ARRAYS
tmpSource +=
R"(
float4 lightDiffuse[20];
float4 lightSpecular[20];
float4 lightAttenuation[20];
float4 lightPosition[20];
float4 lightDirection[20];
float4 lightSpotParams[20];
)";
#else
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightDiffuse" + is + ";\n";
}
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightSpecular" + is + ";\n";
}
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightAttenuation" + is + ";\n";
}
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightPosition" + is + ";\n";
}
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightDirection" + is + ";\n";
}
for (int i = 0; i < 20; i++)
{
std::string is = std::to_string(i);
tmpSource += "float4 lightSpotParams" + is + ";\n";
}
tmpSource += "\n\n\n";
#endif
if (isUsingD3D9)
{
tmpSource +=
R"(sampler DiffuseMap : register(s0);)";
}
else
{
tmpSource +=
R"(SamplerState DiffuseMap_state : register(s0);
Texture2D DiffuseMap : register(t0);)";
}
tmpSource +=
R"(
float4 main_ps(float3 position : TEXCOORD0,
float2 uv : TEXCOORD1 ) : COLOR0
{
float4 color = float4(0,0,0,0);
)";
if (isUsingD3D9)
{
tmpSource +=
R"(
float3 DiffuseMapColour = tex2D(DiffuseMap, uv).xyz;
)";
}
else
{
tmpSource +=
R"(
float3 DiffuseMapColour = DiffuseMap.Sample(DiffuseMap_state, uv).xyz;
)";
}
tmpSource +=
R"(
color.xyz += DiffuseMapColour * 0.5;
color.w = 0.5;
float asdw = 0.0;
asdw += position.x * 0.00001;
asdw += position.y * 0.00001;
asdw += position.z * 0.00001;
const float multiplierAsd = 0.01;)";
tmpSource += "\n";
tmpSource += "\tfloat3 P = float3(1, 0, 0);\n";
tmpSource += "\tfloat3 V = float3(0, 0, 1);\n";
tmpSource += "\tfloat3 N = float3(0, 1, 0);\n";
tmpSource += "\tfloat3 diffuse = float3(0, 0, 0);\n";
tmpSource += "\tfloat3 specular = float3(0, 0, 0);\n";
tmpSource += "\tfloat materialsh = 0.5;\n";
tmpSource += "\n";
#ifdef USE_LIGHT_ARRAYS
tmpSource += R"(
[unroll]
for(int i = 0; i < 20; i++)
{
LIGHT_OUTPUT tmpLightOut = computeLighting(lightPosition[i].xyz, P, N, V, materialsh, lightAttenuation[i], lightSpecular[i].xyz, lightDiffuse[i].xyz, lightSpotParams[i].xyz, lightDirection[i].xyz);
diffuse += tmpLightOut.diffuse;
specular += tmpLightOut.specular;
}
)";
#else
for (int i = 0; i <= 19; i++)
{
std::string is = std::to_string(i);
tmpSource += "\n\t";
if (i == 0)
tmpSource += "LIGHT_OUTPUT ";
tmpSource += "tmpLightOut = computeLighting(lightPosition" + is + ".xyz, P, N, V, materialsh, lightAttenuation" + is + ", lightSpecular" + is + ".xyz, lightDiffuse" + is + ".xyz, lightSpotParams" + is + ".xyz, lightDirection" + is + ".xyz);";
tmpSource += "\n\t";
tmpSource += "diffuse += tmpLightOut.diffuse;";
tmpSource += "\n\t";
tmpSource += "specular += tmpLightOut.specular;";
tmpSource += "\n";
}
#endif
tmpSource += "\n";
tmpSource += "\tdiffuse = saturate(diffuse);\n";
tmpSource += "\tspecular = saturate(specular);\n";
tmpSource += "\tasdw += diffuse.x * multiplierAsd;\n";
tmpSource += "\tasdw += diffuse.y * multiplierAsd;\n";
tmpSource += "\tasdw += diffuse.z * multiplierAsd;\n";
tmpSource += "\tasdw += specular.x * multiplierAsd;\n";
tmpSource += "\tasdw += specular.y * multiplierAsd;\n";
tmpSource += "\tasdw += specular.z * multiplierAsd;\n";
#ifdef USE_LIGHT_ARRAYS
tmpSource +=
R"(
color.x += asdw;
color.x *= 0.000001;
color.x += lightDiffuse[0].x;
return color;
})";
#else
tmpSource +=
R"(
color.x += asdw;
color.x *= 0.000001;
color.x += lightDiffuse0.x;
return color;
})";
#endif
fragmentProgram->setSource(tmpSource);
fragmentProgram->load();
// Add default parameters to the fragment program
auto fragmentParams = fragmentProgram->getDefaultParameters();
#ifdef USE_LIGHT_ARRAYS
/*
fragment_program TestBug_PS hlsl
{
//source X_PS.hlsl
entry_point main_ps
target ps_5_0
default_params
{
param_named_auto lightDiffuse light_diffuse_colour_array 20
param_named_auto lightSpecular light_diffuse_colour_array 20
param_named_auto lightAttenuation light_diffuse_colour_array 20
param_named_auto lightPosition light_diffuse_colour_array 20
param_named_auto lightDirection light_diffuse_colour_array 20
param_named_auto lightSpotParams light_diffuse_colour_array 20
}
}
*/
fragmentParams->setNamedAutoConstant("lightDiffuse", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20); // Easiest to use diffuse on all of them to show the bug
fragmentParams->setNamedAutoConstant("lightSpecular", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightAttenuation", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightPosition", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightDirection", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightSpotParams", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 20);
/*fragmentParams->setNamedAutoConstant("lightSpecular", GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightAttenuation", GpuProgramParameters::ACT_LIGHT_ATTENUATION_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightPosition", GpuProgramParameters::ACT_LIGHT_POSITION_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightDirection", GpuProgramParameters::ACT_LIGHT_DIRECTION_ARRAY, 20);
fragmentParams->setNamedAutoConstant("lightSpotParams", GpuProgramParameters::ACT_SPOTLIGHT_PARAMS_ARRAY, 20);*/
#else
/*
fragment_program TestBug_PS hlsl
{
//source X_PS.hlsl
entry_point main_ps
target ps_5_0
default_params
{
param_named lightDiffuse0 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse1 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse2 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse3 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse4 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse5 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse6 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse7 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse8 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse9 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse10 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse11 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse12 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse13 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse14 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse15 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse16 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse17 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse18 float4 0.0 0.0 0.0 0.0
param_named lightDiffuse19 float4 0.0 0.0 0.0 0.0
param_named lightSpecular0 float4 0.0 0.0 0.0 0.0
param_named lightSpecular1 float4 0.0 0.0 0.0 0.0
param_named lightSpecular2 float4 0.0 0.0 0.0 0.0
param_named lightSpecular3 float4 0.0 0.0 0.0 0.0
param_named lightSpecular4 float4 0.0 0.0 0.0 0.0
param_named lightSpecular5 float4 0.0 0.0 0.0 0.0
param_named lightSpecular6 float4 0.0 0.0 0.0 0.0
param_named lightSpecular7 float4 0.0 0.0 0.0 0.0
param_named lightSpecular8 float4 0.0 0.0 0.0 0.0
param_named lightSpecular9 float4 0.0 0.0 0.0 0.0
param_named lightSpecular10 float4 0.0 0.0 0.0 0.0
param_named lightSpecular11 float4 0.0 0.0 0.0 0.0
param_named lightSpecular12 float4 0.0 0.0 0.0 0.0
param_named lightSpecular13 float4 0.0 0.0 0.0 0.0
param_named lightSpecular14 float4 0.0 0.0 0.0 0.0
param_named lightSpecular15 float4 0.0 0.0 0.0 0.0
param_named lightSpecular16 float4 0.0 0.0 0.0 0.0
param_named lightSpecular17 float4 0.0 0.0 0.0 0.0
param_named lightSpecular18 float4 0.0 0.0 0.0 0.0
param_named lightSpecular19 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation0 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation1 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation2 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation3 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation4 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation5 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation6 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation7 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation8 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation9 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation10 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation11 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation12 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation13 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation14 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation15 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation16 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation17 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation18 float4 0.0 0.0 0.0 0.0
param_named lightAttenuation19 float4 0.0 0.0 0.0 0.0
param_named lightPosition0 float4 0.0 0.0 0.0 0.0
param_named lightPosition1 float4 0.0 0.0 0.0 0.0
param_named lightPosition2 float4 0.0 0.0 0.0 0.0
param_named lightPosition3 float4 0.0 0.0 0.0 0.0
param_named lightPosition4 float4 0.0 0.0 0.0 0.0
param_named lightPosition5 float4 0.0 0.0 0.0 0.0
param_named lightPosition6 float4 0.0 0.0 0.0 0.0
param_named lightPosition7 float4 0.0 0.0 0.0 0.0
param_named lightPosition8 float4 0.0 0.0 0.0 0.0
param_named lightPosition9 float4 0.0 0.0 0.0 0.0
param_named lightPosition10 float4 0.0 0.0 0.0 0.0
param_named lightPosition11 float4 0.0 0.0 0.0 0.0
param_named lightPosition12 float4 0.0 0.0 0.0 0.0
param_named lightPosition13 float4 0.0 0.0 0.0 0.0
param_named lightPosition14 float4 0.0 0.0 0.0 0.0
param_named lightPosition15 float4 0.0 0.0 0.0 0.0
param_named lightPosition16 float4 0.0 0.0 0.0 0.0
param_named lightPosition17 float4 0.0 0.0 0.0 0.0
param_named lightPosition18 float4 0.0 0.0 0.0 0.0
param_named lightPosition19 float4 0.0 0.0 0.0 0.0
param_named lightDirection0 float4 0.0 0.0 0.0 0.0
param_named lightDirection1 float4 0.0 0.0 0.0 0.0
param_named lightDirection2 float4 0.0 0.0 0.0 0.0
param_named lightDirection3 float4 0.0 0.0 0.0 0.0
param_named lightDirection4 float4 0.0 0.0 0.0 0.0
param_named lightDirection5 float4 0.0 0.0 0.0 0.0
param_named lightDirection6 float4 0.0 0.0 0.0 0.0
param_named lightDirection7 float4 0.0 0.0 0.0 0.0
param_named lightDirection8 float4 0.0 0.0 0.0 0.0
param_named lightDirection9 float4 0.0 0.0 0.0 0.0
param_named lightDirection10 float4 0.0 0.0 0.0 0.0
param_named lightDirection11 float4 0.0 0.0 0.0 0.0
param_named lightDirection12 float4 0.0 0.0 0.0 0.0
param_named lightDirection13 float4 0.0 0.0 0.0 0.0
param_named lightDirection14 float4 0.0 0.0 0.0 0.0
param_named lightDirection15 float4 0.0 0.0 0.0 0.0
param_named lightDirection16 float4 0.0 0.0 0.0 0.0
param_named lightDirection17 float4 0.0 0.0 0.0 0.0
param_named lightDirection18 float4 0.0 0.0 0.0 0.0
param_named lightDirection19 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams0 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams1 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams2 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams3 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams4 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams5 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams6 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams7 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams8 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams9 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams10 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams11 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams12 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams13 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams14 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams15 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams16 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams17 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams18 float4 0.0 0.0 0.0 0.0
param_named lightSpotParams19 float4 0.0 0.0 0.0 0.0
}
}
*/
for (int i = 0; i < 20; ++i)
{
std::string is = std::to_string(i);
fragmentParams->setNamedConstant("lightDiffuse" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
fragmentParams->setNamedConstant("lightSpecular" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
fragmentParams->setNamedConstant("lightAttenuation" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
fragmentParams->setNamedConstant("lightPosition" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
fragmentParams->setNamedConstant("lightDirection" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
fragmentParams->setNamedConstant("lightSpotParams" + is, Ogre::Vector4(0.0f, 0.0f, 0.0f, 0.0f));
}
#endif
// Create the material
/*
material TestBug
{
technique
{
pass
{
vertex_program_ref TestBug_VS
{
}
fragment_program_ref TestBug_PS
{
}
texture_unit DiffuseMap
{
texture nskingr.jpg // Ninja
}
}
}
}
*/
// Create a material and set its techniques and passes
Ogre::MaterialManager& matManager = Ogre::MaterialManager::getSingleton();
auto material = matManager.create(
"TestBug",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
auto technique = material->getTechnique(0);
auto pass = technique->getPass(0);
// Set vertex and fragment programs to the pass
pass->setVertexProgram(vertexProgram->getName());
pass->setFragmentProgram(fragmentProgram->getName());
pass->createTextureUnitState("nskingr.jpg");
material->load();
const float tmpSize = 70.0f;
const float tmpStepSize = 2.0f;
for (float x = -tmpSize; x < tmpSize; x += tmpStepSize)
{
for (float y = -tmpSize; y < tmpSize; y += tmpStepSize)
{
Entity* tmpEntity = mSceneMgr->createEntity("ogrehead.mesh");
tmpEntity->setMaterialName("TestBug");
SceneNode* tmpNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
tmpNode->attachObject(tmpEntity);
tmpNode->setPosition(Vector3(x, 0.0f, y));
tmpNode->setScale(Vector3(0.1f, 0.02f, 0.1f));
tmpEntities.push_back(tmpEntity);
tmpSceneNodes.push_back(tmpNode);
}
}
float tmpDistance = 2.0f;
__SetPosition(mCamera, Vector3(tmpDistance, tmpDistance, tmpDistance));
__LookAt(mCamera, Vector3::ZERO);
mCamera->setNearClipDistance(0.01f);
mCamera->setFarClipDistance(1000.0f);
mCameraMan->setStyle(CS_MANUAL);
MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::TFO_ANISOTROPIC);
MaterialManager::getSingleton().setDefaultAnisotropy(16);
mTrayMgr->showCursor();
}
void cleanupContent() override
{
for (size_t i = 0; i < tmpEntities.size(); i++)
{
tmpEntities[i]->detachFromParent();
mSceneMgr->destroyEntity(tmpEntities[i]);
}
tmpEntities.clear();
for (size_t i = 0; i < tmpSceneNodes.size(); i++)
{
mSceneMgr->destroySceneNode(tmpSceneNodes[i]);
}
tmpSceneNodes.clear();
}
};
#endif