Ignore:
Timestamp:
10/17/08 01:08:42 (16 years ago)
Author:
mattausch
Message:

shader system starting to work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SkyPreetham.cpp

    r3021 r3036  
    66#include "Camera.h" 
    77#include "RenderState.h" 
     8#include "ShaderProgram.h" 
     9#include "Shape.h" 
     10#include "Material.h" 
    811 
    912 
     
    2326 
    2427 
    25 static CGprogram sCgSkyProgram = NULL; 
    26 static CGprogram sCgMrtFragmentSkyDomeProgram = NULL; 
    27  
    28  
    29 static CGparameter sLightDirParam; 
    30 static CGparameter sThetaSunParam; 
    31 static CGparameter sZenithColorParam; 
    32 static CGparameter sAColorParam; 
    33 static CGparameter sBColorParam; 
    34 static CGparameter sCColorParam; 
    35 static CGparameter sDColorParam; 
    36 static CGparameter sEColorParam; 
    37 static CGparameter sMultiplierParam; 
     28static ShaderProgram *sCgSkyProgram = NULL; 
     29static ShaderProgram *sCgMrtFragmentSkyDomeProgram = NULL; 
    3830 
    3931ShaderContainer SkyPreetham::sShaders; 
     
    5446void SkyPreetham::InitCG(CGcontext context) 
    5547{        
    56         ShaderProgram *pr; 
    57  
    58         sCgSkyProgram =  
    59                 cgCreateProgramFromFile(context,  
    60                                                                 CG_SOURCE, 
    61                                                                 "src/shaders/sky_preetham.cg",  
    62                                                                 RenderState::sCgVertexProfile, 
    63                                                                 "default_vs", 
    64                                                                 NULL); 
    65  
    66         if (sCgSkyProgram != NULL) 
     48        sCgSkyProgram = new ShaderProgram(context,  
     49                                              "src/shaders/sky_preetham.cg", 
     50                                                                          RenderState::sCgVertexProfile,         
     51                                                                          "default_vs"); 
     52 
     53        if (sCgSkyProgram->IsValid()) 
    6754        { 
    68                 cgGLLoadProgram(sCgSkyProgram); 
    69  
    70                 sLightDirParam = cgGetNamedParameter(sCgSkyProgram, "lightDir"); 
    71                 sThetaSunParam = cgGetNamedParameter(sCgSkyProgram, "thetaSun"); 
    72                 sZenithColorParam = cgGetNamedParameter(sCgSkyProgram, "zenithColor"); 
    73                 sAColorParam = cgGetNamedParameter(sCgSkyProgram, "aColor"); 
    74                 sBColorParam = cgGetNamedParameter(sCgSkyProgram, "bColor"); 
    75                 sCColorParam = cgGetNamedParameter(sCgSkyProgram, "cColor"); 
    76                 sDColorParam = cgGetNamedParameter(sCgSkyProgram, "dColor"); 
    77                 sEColorParam = cgGetNamedParameter(sCgSkyProgram, "eColor"); 
    78  
    79                 sMultiplierParam = cgGetNamedParameter(sCgSkyProgram, "multiplier"); 
    80  
    81                 pr = new ShaderProgram(sCgSkyProgram); 
    82                 sShaders.push_back(pr); 
     55                sCgSkyProgram->AddParameter("lightDir", 0); 
     56                sCgSkyProgram->AddParameter("thetaSun", 1); 
     57                sCgSkyProgram->AddParameter("zenithColor", 2); 
     58                sCgSkyProgram->AddParameter("aColor", 3); 
     59                sCgSkyProgram->AddParameter("bColor", 4); 
     60                sCgSkyProgram->AddParameter("cColor", 5); 
     61                sCgSkyProgram->AddParameter("dColor", 6); 
     62                sCgSkyProgram->AddParameter("eColor", 7); 
     63                sCgSkyProgram->AddParameter("multiplier", 8); 
    8364        } 
    8465        else 
    8566                cerr << "sky program failed to load" << endl; 
    8667 
     68                sShaders.push_back(sCgSkyProgram); 
     69 
    8770        sCgMrtFragmentSkyDomeProgram =  
    88                 cgCreateProgramFromFile(context,  
    89                                                                 CG_SOURCE, 
    90                                                                 "src/shaders/sky_preetham.cg",  
    91                                                                 RenderState::sCgFragmentProfile, 
    92                                                                 "frag_skydome", 
    93                                                                 NULL); 
    94  
    95         if (sCgMrtFragmentSkyDomeProgram != NULL) 
    96         { 
    97                 cgGLLoadProgram(sCgMrtFragmentSkyDomeProgram); 
    98                 //cgGLSetParameter1f(sMaxDepthParam, MAX_DEPTH_CONST / farDist); 
    99  
    100                 pr = new ShaderProgram(sCgMrtFragmentSkyDomeProgram); 
    101                 sShaders.push_back(pr); 
    102         } 
    103         else 
     71                new ShaderProgram(context,  
     72                                  "src/shaders/sky_preetham.cg",  
     73                                                  RenderState::sCgFragmentProfile, 
     74                                                  "frag_skydome"); 
     75 
     76        // simple shader used for just pushing out the fragments to the mrts 
     77        if (!sCgMrtFragmentSkyDomeProgram->IsValid()) 
    10478                cerr << "fragment skyprogram failed to load" << endl; 
     79         
     80        sShaders.push_back(sCgMrtFragmentSkyDomeProgram); 
    10581} 
    10682 
     
    11894{ 
    11995        CreateSunQuad(); 
     96        Shape *shape = mSkyDome->GetShape(0); 
     97 
     98        Material *mat = shape->GetMaterial(); 
     99 
     100        mat->SetFragmentProgram(sCgMrtFragmentSkyDomeProgram); 
     101        mat->SetVertexProgram(sCgSkyProgram); 
    120102} 
    121103 
     
    135117        Vector3 zenithColor; 
    136118        vector<Vector3> ABCDE; 
     119 
    137120        ComputeFactors(sunDir, zenithColor, ABCDE, sun_theta); 
    138121 
     
    149132        mSkyDome->GetTransform()->SetMatrix(s * m); 
    150133         
    151         cgGLSetParameter3f(sLightDirParam, sunDir.x, sunDir.y, sunDir.z); 
    152         cgGLSetParameter2f(sThetaSunParam, sun_theta.first, sun_theta.second); 
    153         cgGLSetParameter3f(sZenithColorParam, zenithColor.x, zenithColor.y, zenithColor.z); 
    154  
    155         cgGLSetParameter3f(sAColorParam, ABCDE[0].x, ABCDE[0].y, ABCDE[0].z); 
    156         cgGLSetParameter3f(sBColorParam, ABCDE[1].x, ABCDE[1].y, ABCDE[1].z); 
    157         cgGLSetParameter3f(sCColorParam, ABCDE[2].x, ABCDE[2].y, ABCDE[2].z); 
    158         cgGLSetParameter3f(sDColorParam, ABCDE[3].x, ABCDE[3].y, ABCDE[3].z); 
    159         cgGLSetParameter3f(sEColorParam, ABCDE[4].x, ABCDE[4].y, ABCDE[4].z); 
    160  
    161         if (state->GetRenderPassType() == RenderState::DEFERRED) 
    162         { 
    163                 cgGLEnableProfile(RenderState::sCgFragmentProfile); 
    164                 cgGLBindProgram(sCgMrtFragmentSkyDomeProgram); 
    165  
    166         } 
     134        GPUProgramParameters *vtxParams = mSkyDome->GetShape(0)->GetMaterial()->GetVertexProgramParameters(); 
     135 
     136        vtxParams->SetValue3f(0, sunDir.x, sunDir.y, sunDir.z); 
     137        vtxParams->SetValue2f(1, sun_theta.first, sun_theta.second); 
     138        vtxParams->SetValue3f(2, zenithColor.x, zenithColor.y, zenithColor.z); 
     139 
     140        vtxParams->SetValue3f(3, ABCDE[0].x, ABCDE[0].y, ABCDE[0].z); 
     141        vtxParams->SetValue3f(4, ABCDE[1].x, ABCDE[1].y, ABCDE[1].z); 
     142        vtxParams->SetValue3f(5, ABCDE[2].x, ABCDE[2].y, ABCDE[2].z); 
     143        vtxParams->SetValue3f(6, ABCDE[3].x, ABCDE[3].y, ABCDE[3].z); 
     144        vtxParams->SetValue3f(7, ABCDE[4].x, ABCDE[4].y, ABCDE[4].z); 
     145 
    167146 
    168147        if (!scaleToRange) 
    169148        {        
    170149                // use tone mapping 
    171                 cgGLSetParameter1f(sMultiplierParam, 1.0f); 
     150                sCgSkyProgram->SetValue1f(8, 1.0f); 
    172151        } 
    173152        else 
    174153        { 
    175154                // no tone mapping => scale 
    176                 cgGLSetParameter1f(sMultiplierParam, 8e-5f); 
     155                sCgSkyProgram->SetValue1f(8, 8e-5f); 
    177156        } 
    178157 
    179158        cgGLEnableProfile(RenderState::sCgVertexProfile); 
    180         cgGLBindProgram(sCgSkyProgram); 
    181159 
    182160        // Render sky dome. 
     
    185163        // Render additively blended sun disc. 
    186164        //RenderSunDisk(sunDir, camera); 
    187  
    188         cgGLDisableProfile(RenderState::sCgFragmentProfile); 
    189165} 
    190166 
     
    192168void SkyPreetham::RenderSunDisk(const Vector3 &sunDir, Camera *camera) 
    193169{ 
     170#if TODOD 
    194171        // Move skybox with camera. 
    195172        Vector3 position = camera->GetPosition(); 
     
    212189        sunPos *= rotx;; 
    213190 
    214         //sunposition.rotateAroundY(-D().getScene().getLight().getHorizontalOrientation() + 90.0f); 
    215         //sunposition.rotateAroundX(-D().getScene().getLight().getVerticalOrientation()); 
     191        sunposition.rotateAroundY(-D().getScene().getLight().getHorizontalOrientation() + 90.0f); 
     192        sunposition.rotateAroundX(-D().getScene().getLight().getVerticalOrientation()); 
    216193         
    217194        glMatrixMode(GL_MODELVIEW); 
     
    222199        glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); 
    223200 
    224         //Float size = 0.5f + (1.0f - lightdirection.y) * 0.5f; 
    225  
    226         //mSunEffect->setVariableVector3("LightDiffuseColor", D().getScene().getLight().getDiffuseColor()); 
    227         //mSunEffect->setVariableFloat("SunSize", size); 
    228         //mSunEffect->setVariableTexture2D("SunTexture", mSunTexture); 
    229  
    230         /*mSunEffect->activate(); 
     201        Float size = 0.5f + (1.0f - lightdirection.y) * 0.5f; 
     202 
     203        mSunEffect->setVariableVector3("LightDiffuseColor", D().getScene().getLight().getDiffuseColor()); 
     204        mSunEffect->setVariableFloat("SunSize", size); 
     205        mSunEffect->setVariableTexture2D("SunTexture", mSunTexture); 
     206 
     207        mSunEffect->activate(); 
    231208         
    232209        mSunQuad->render(); 
    233210 
    234211        mSunEffect->deactivate(); 
    235         F().getRenderDevice().setDefaultBlendingMode(FRenderDevice::BLENDING_NONE);*/ 
     212        F().getRenderDevice().setDefaultBlendingMode(FRenderDevice::BLENDING_NONE); 
    236213 
    237214        glPopMatrix(); 
     215#endif 
    238216} 
    239217 
     
    241219void SkyPreetham::CreateSunQuad() 
    242220{ 
    243         /* 
     221#if TODO 
    244222        mSunQuad = new FVertexBuffer(); 
    245223        mSunQuad->setupPrimitiveType(FVertexBuffer::PRIMITIVES_TRIANGLES); 
     
    263241        mSunQuad->setIndex(4, 1); 
    264242        mSunQuad->setIndex(5, 3); 
    265         */ 
     243#endif 
    266244} 
    267245 
Note: See TracChangeset for help on using the changeset viewer.