CG_Lession 1

struct CGStruct
{
 CGparameter modelViewProj ;
 CGparameter modelViewInverse ;
 CGparameter globalAmbient ;
 CGparameter lightColor ;
 CGparameter lightPosition ;
 CGparameter eyePosition ;
 CGparameter Ke ;
 CGparameter Ka ;
 CGparameter Kd ;
 CGparameter Ks ;
 CGparameter shininess ;
}CGP;

Vertex g_pVertexArray[24] =
{
//    tu   tv     r    g    b    a      nx    ny    nz       x     y     z
    // Front face
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f, 1.0f,  -1.0f,-1.0f, 1.0f },
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f, 1.0f,   1.0f,-1.0f, 1.0f },
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f, 1.0f,   1.0f, 1.0f, 1.0f },
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f, 1.0f,  -1.0f, 1.0f, 1.0f },
    // Back face
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f,-1.0f,  -1.0f,-1.0f,-1.0f },
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f,-1.0f,  -1.0f, 1.0f,-1.0f },
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f,-1.0f,   1.0f, 1.0f,-1.0f },
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 0.0f,-1.0f,   1.0f,-1.0f,-1.0f },
    // Top face
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 1.0f, 0.0f,  -1.0f, 1.0f,-1.0f },
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 1.0f, 0.0f,  -1.0f, 1.0f, 1.0f },
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 1.0f, 0.0f,   1.0f, 1.0f, 1.0f },
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f, 1.0f, 0.0f,   1.0f, 1.0f,-1.0f },
    // Bottom face
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f,-1.0f, 0.0f,  -1.0f,-1.0f,-1.0f },
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f,-1.0f, 0.0f,   1.0f,-1.0f,-1.0f },
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f,-1.0f, 0.0f,   1.0f,-1.0f, 1.0f },
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  0.0f,-1.0f, 0.0f,  -1.0f,-1.0f, 1.0f },
    // Right face
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  1.0f, 0.0f, 0.0f,   1.0f,-1.0f,-1.0f },
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  1.0f, 0.0f, 0.0f,   1.0f, 1.0f,-1.0f },
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f,  1.0f, 0.0f, 0.0f,   1.0f, 1.0f, 1.0f },
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f,  1.0f, 0.0f, 0.0f,   1.0f,-1.0f, 1.0f },
    // Left face
    { 0.0f,0.0f,  1.0f,1.0f,1.0f,1.0f, -1.0f, 0.0f, 0.0f,  -1.0f,-1.0f,-1.0f },
    { 1.0f,0.0f,  1.0f,1.0f,1.0f,1.0f, -1.0f, 0.0f, 0.0f,  -1.0f,-1.0f, 1.0f },
    { 1.0f,1.0f,  1.0f,1.0f,1.0f,1.0f, -1.0f, 0.0f, 0.0f,  -1.0f, 1.0f, 1.0f },
    { 0.0f,1.0f,  1.0f,1.0f,1.0f,1.0f, -1.0f, 0.0f, 0.0f,  -1.0f, 1.0f,-1.0f }
};

void initShader(void)
{
 //
 // Search for a valid vertex shader profile in this order:
 //
 // CG_PROFILE_ARBVP1 - GL_ARB_vertex_program
 // CG_PROFILE_VP30   - GL_NV_vertex_program2
 // CG_PROFILE_VP20   - GL_NV_vertex_program
 //

   if( cgGLIsProfileSupported(CG_PROFILE_ARBVP1) )
        g_CGprofile = CG_PROFILE_ARBVP1;
    else
  if( cgGLIsProfileSupported(CG_PROFILE_VP30) )
        g_CGprofile = CG_PROFILE_VP30;
 else if( cgGLIsProfileSupported(CG_PROFILE_VP20) )
        g_CGprofile = CG_PROFILE_VP20;
    else
    {
        MessageBox( NULL,"Failed to initialize vertex shader! Hardware doesn't "
           "support any of the vertex shading extensions!",
           "ERROR",MB_OK|MB_ICONEXCLAMATION );
  return;
    }

 // Create the context...
 g_CGcontext = cgCreateContext();

 //
 // Create the vertex shader...
 //
 
 g_CGprogram = cgCreateProgramFromFile( g_CGcontext,
             CG_SOURCE,
             "MyCG.cg",
             g_CGprofile,
             NULL,
             NULL );

 //
 // Load the program using Cg's expanded interface...
 //

 cgGLLoadProgram( g_CGprogram );

 //
 // Bind some parameters by name so we can set them later...
 //
 CGP.modelViewProj = cgGetNamedParameter( g_CGprogram, "modelViewProj" );
 CGP.modelViewInverse = cgGetNamedParameter( g_CGprogram, "modelViewInverse" );
 CGP.eyePosition = cgGetNamedParameter( g_CGprogram, "eyePosition" );
 CGP.Ka = cgGetNamedParameter( g_CGprogram, "Ka" );
 CGP.Kd = cgGetNamedParameter( g_CGprogram, "Kd" );
 CGP.Ke = cgGetNamedParameter( g_CGprogram, "Ke" );
 CGP.Ks = cgGetNamedParameter( g_CGprogram, "Ks" );
 CGP.lightColor = cgGetNamedParameter( g_CGprogram, "lightColor" );
 CGP.lightPosition = cgGetNamedParameter( g_CGprogram, "lightPosition" );
 CGP.shininess= cgGetNamedParameter( g_CGprogram, "shininess" );

}

void setShaderConstants( void )
{
 // This matrix will be used to transform the vertices from model-space to clip-space
 cgGLSetStateMatrixParameter(  CGP.modelViewProj,
            CG_GL_MODELVIEW_PROJECTION_MATRIX,
            CG_GL_MATRIX_IDENTITY );

 // This matrix will be used to transform the normals from model-space to view-space

 cgGLSetStateMatrixParameter( CGP.modelViewInverse ,
           CG_GL_MODELVIEW_MATRIX,
                                CG_GL_MATRIX_INVERSE_TRANSPOSE );

 typedef  float  float3[3] ;
 float3  globalAmbient={ 0.8, 0.8, 0.8 } ;
 float3 lightColor = { 1.0,0.0,0.0 } ;
 float3 Ke ={ 0.8,0.8,0.8} ;
 float3 Ka ={ 1.0,1.0,1.0} ;
 float3 Ks ={ 0.8,0.0,0.5} ;
 float3 Kd ={ 1.0,1.0,1.0} ;
 float shininess[]={5.0f };

 cgGLSetParameter4fv( CGP.globalAmbient ,globalAmbient  );
 cgGLSetParameter4fv( CGP.lightColor , lightColor );
 cgGLSetParameter4fv( CGP.Ka ,Ka  );
 cgGLSetParameter4fv( CGP.Ke ,Ke  );
 cgGLSetParameter4fv( CGP.Ks , Ks );
 cgGLSetParameter4fv( CGP.Kd , Kd );
 cgGLSetParameter4fv( CGP.shininess , shininess );
}

void render( void )
{
 // Clear the screen and the depth buffer
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
 glTranslatef( 0.0f, 0.0f, -5.0f );
// glRotatef( -g_fSpinY, 1.0f, 0.0f, 0.0f );
// glRotatef( -g_fSpinX, 0.0f, 1.0f, 0.0f );

 setShaderConstants();

 cgGLBindProgram( g_CGprogram );
 cgGLEnableProfile( g_CGprofile );

    glInterleavedArrays( GL_T2F_C4F_N3F_V3F, 0, g_pVertexArray );
    glDrawArrays( GL_QUADS, 0, 24 );

 cgGLDisableProfile( g_CGprofile );

 SwapBuffers( g_hDC );
}

void shutDown(void) 
{

 cgDestroyProgram(g_CGprogram);
 cgDestroyContext(g_CGcontext);

 if( g_hRC != NULL )
 {
  wglMakeCurrent( NULL, NULL );
  wglDeleteContext( g_hRC );
  g_hRC = NULL;       
 }

 if( g_hDC != NULL )
 {
  ReleaseDC( g_hWnd, g_hDC );
  g_hDC = NULL;
 }
}

MyCG.cg :

void main(float4 position  : POSITION,
       float3 normal    : NORMAL ,

       out float4 oPosition : POSITION,
       out float4 color     : COLOR,

       uniform float4x4   modelViewProj,
       uniform float4x4   modelViewInverse,
       uniform float3  globalAmbient,
       uniform float3  lightColor,
       uniform float3  lightPosition,
       uniform float3  eyePosition,
       uniform float3  Ke,
       uniform float3  Ka,
       uniform float3  Kd,
       uniform float3  Ks,
       uniform float   shininess)
{
// position.z=0.0 ;
 oPosition = mul( modelViewProj , position ) ;
 
 float3 P = position.xyz ;
 float3 N = normal ;
 
 float3 emissive = Ke ;
 
 float3 ambient = Ka * globalAmbient ;

 float3 L = normalize(lightPosition-P ) ;
 float diffuseLight =  max( dot(N,L),0 );
 color=float4( 0.0,0.0,0.0,0.0 ) ;
 if(diffuseLight>0.0)
 {
  float3 diffuse = Kd * lightColor * diffuseLight ;
       
  float3 V = normalize( eyePosition - P ) ;
  float3 H = normalize( L+V ) ;
  float3 specular = Ks * lightColor * pow( max(dot(N,H) ,0),shininess ) ;

  color.xyz=diffuse + specular ;
 }

 color.xyz  =color.xyz + ambient+emissive ;
 color.w = 1 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值