这章主要介绍一下DXUT 里面的GUI元素。要在图形界面中添加GUI元素,首先要定义一个DialogResourceManager对象用来管理对话框资源。DialogResourceManager 管理渲染时状态、Sprite控制批量显示更新、对话框字体、纹理等等。CDXUTDialog 相当于MFC里面的对话框,作为各种控件资源的容器。CD3DSettingsDlg 是一个ms已经写好的对话框类,可以用来设置各种Direct3DDevice9 创建时的参数。点击该对话框的ok 按钮,D3D设备将会重建。

  这里先建立了DialogResourceManager全局变量g_DialogResourceManager和CD3DSettingsDlg 全局变量g_SettingsDlg。并且要在 OnCreateDevice OnResetDevice MsgProc OnLostDevice OnDestroyDevice 回调函数中调用自己相应的函数如g_DialogResourceManager.OnCreateDevice(...) 等等。
  对于对话框对象使用前必须初始化 init() 参数为DialogResourceManager类对象,即g_DialogResourceManager.之后对于CDXUTDialog类对象g_HUD需要设置自己的消息回调函数 OnGUIEvent()。并且在 dxut 的消息处理函数MsgProc中调用自己的消息处理函数 g_HUD->MsgProc(), 如果是该对话框的消息,Dxut回调函数将不再处理这个消息。而交由对话框处理。
//使用DXUT 框架GUI程序
#include <dxstdafx.h>

//自定义顶点结构
struct CUSTOMVERTEX
{
 
float x,y,z,rhw;
 DWORD diffuse;
}
;

ID3DXFont
*     g_pFont = NULL;     // Font for drawing text
ID3DXSprite*    g_pTextSprite = NULL;   // Sprite for batching draw text calls
bool      g_bShowHelp = true;    // If true, it renders the UI control text
CDXUTDialogResourceManager g_DialogResourceManager;  // manager for shared resources of dialogs
CD3DSettingsDlg    g_SettingsDlg;     // Device settings dialog
CDXUTDialog     g_HUD;       // dialog for standard controls
static const int   D3DFVF_CUSTOMVERTEX = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;
LPDIRECT3DVERTEXBUFFER9  g_pVB;
bool      g_vsb = true;

//定义g_HUD对话框上按钮ID
static const int IDC_TOGGLEFULLSCREEN=1;  
static const int IDC_TOGGLEREF=2;
static const int IDC_CHANGEDEVICE=3;

HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9
* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9
* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
void    CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 
bool* pbNoFurtherProcessing, void* pUserContext );
void    CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
void    CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
void    CALLBACK OnLostDevice( void* pUserContext );
void    CALLBACK OnDestroyDevice( void* pUserContext );
void    InitApp();
void    RenderText();

INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, 
int )
{
 
//为DEBUG模式激活运行时内存检查
#if defined(DEBUG) | defined(_DEBUG)
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF 
| _CRTDBG_LEAK_CHECK_DF );
#endif
 
// 设置回调函数,这些函数允许DXUT通知应用程序更换设备,用户输入和窗口消息。
 
// 回调函数是可选的,因此你要做的仅是设置你感兴趣的事件的回调函数。
 DXUTSetCallbackDeviceCreated( OnCreateDevice );
 DXUTSetCallbackDeviceReset( OnResetDevice );
 DXUTSetCallbackDeviceLost( OnLostDevice );
 DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
 DXUTSetCallbackFrameRender( OnFrameRender );
 DXUTSetCallbackFrameMove( OnFrameMove );
 DXUTSetCallbackMsgProc( MsgProc );
 DXUTSetCallbackKeyboard( KeyboardProc );
 
// 全屏时显示鼠标
 DXUTSetCursorSettings( truetrue );
 
//InitApp();
 
// 初始化DXUT并创建想要的Win32窗口和应用程序的Direct3D设备。调用这些
 
// 可选函数中的每一个,此外它们允许你设置几个选项来控制框架的行为。
 DXUTInit( TRUE, TRUE, TRUE );
 DXUTCreateWindow( L
"ameng" );
 DXUTCreateDevice( D3DADAPTER_DEFAULT, TRUE, 
640480 );
 
// 通过DXUT来处理消息循环并分派渲染调用。当在空闲时间和处理窗口消息的
 
// 时间间隔时,框架将调用OnFrameMove和OnFrameRender回调函数。
 DXUTMainLoop();
 
return DXUTGetExitCode();
}

void InitApp()
{
 
// 初始化对话框
 g_SettingsDlg.Init(&g_DialogResourceManager );
 g_HUD.Init(
&g_DialogResourceManager );
 
//设置对话框消息处理函数。
 g_HUD.SetCallback( OnGUIEvent ); 
 
int iY = 10
 g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L
"Toggle full screen"35, iY, 12522 );
 g_HUD.AddButton( IDC_TOGGLEREF, L
"Toggle REF (F3)"35, iY += 2412522,VK_F3 );
 g_HUD.AddButton( IDC_CHANGEDEVICE, L
"Change device (F2)"35, iY += 2412522, VK_F2 );
}



HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9
* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
 HRESULT hr;
 V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) );
  InitApp();
 V_RETURN( g_SettingsDlg.OnCreateDevice( pd3dDevice ) );
 
// Initialize the font
 V_RETURN( D3DXCreateFont( pd3dDevice, 150, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
  OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH 
| FF_DONTCARE, 
  L
"Arial"&g_pFont ) );
 
return S_OK;
}

HRESULT CALLBACK OnResetDevice( IDirect3DDevice9
* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
 HRESULT hr;
 
static CUSTOMVERTEX vertices[] =
 
{
  
300.0f,  50.0f0.1f1.0f, D3DCOLOR_ARGB(255,255,0,0) }// x, y, z, rhw, color
  500.0f350.0f0.1f1.0f, D3DCOLOR_ARGB(255,0,255,0) },
  
100.0f350.0f0.1f1.0f, D3DCOLOR_ARGB(255,0,0,255) },
 }
;
 pd3dDevice
->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL);
 BYTE
* pVertices;
 
if( FAILED( g_pVB->Lock( 0sizeof(vertices), (void**)&pVertices, 0 )))
  
return E_FAIL;
 memcpy(pVertices,vertices,
sizeof(vertices));
 g_pVB
->Unlock();
 V_RETURN( g_DialogResourceManager.OnResetDevice() );
 V_RETURN( g_SettingsDlg.OnResetDevice() );
 
if( g_pFont )
  V_RETURN( g_pFont
->OnResetDevice() );
 
// Create a sprite to help batch calls when drawing many lines of text
 V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );
 g_HUD.SetLocation( pBackBufferSurfaceDesc
->Width-1700 );
 g_HUD.SetSize( 
170170 );
 
return S_OK;
}

void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{

}

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
 HRESULT hr;
 V( pd3dDevice
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0000), 1.0f0) );
 V(pd3dDevice
->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)));
 V(pd3dDevice
->SetFVF(D3DFVF_CUSTOMVERTEX));
 
if( g_SettingsDlg.IsActive() )
 
{
  g_SettingsDlg.OnRender( fElapsedTime );
  
return;
 }

 
if(SUCCEEDED(pd3dDevice->BeginScene()))
 
{
  
//更新图像
  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1));
  
if(g_vsb)
  
{
   RenderText();
  }

  V( g_HUD.OnRender( fElapsedTime ) );
//  V( g_SampleUI.OnRender( fElapsedTime ) );
  pd3dDevice->EndScene();
 }

}

void RenderText()
{
 
// The helper object simply helps keep track of text position, and color
 
// and then it calls pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
 
// If NULL is passed in as the sprite object, then it will work however the 
 
// pFont->DrawText() will not be batched together.  Batching calls will improves performance.
 CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );
 
// Output statistics
 txtHelper.Begin();
 txtHelper.SetInsertionPos( 
55 );
 txtHelper.SetForegroundColor( D3DXCOLOR( 
1.0f1.0f0.0f1.0f ) );
 txtHelper.DrawTextLine( DXUTGetFrameStats(
true) ); //为true 显现FPS,默认为false不显使FPS
 txtHelper.DrawTextLine( DXUTGetDeviceStats() );

 
 
//TODO: add UI text as needed
 txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f1.0f1.0f1.0f ) );
 txtHelper.DrawTextLine( L
"Put whatever misc status here" );

 
// 获取图象后备缓冲区
 const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
 
if( g_bShowHelp )
 
{
  txtHelper.SetInsertionPos( 
10, pd3dsdBackBuffer->Height-15*6 );
  txtHelper.SetForegroundColor( D3DXCOLOR( 
1.0f0.75f0.0f1.0f ) );
  txtHelper.DrawTextLine( L
"Controls (F1 to hide):" );
  txtHelper.SetInsertionPos( 
40, pd3dsdBackBuffer->Height-15*5 );
  txtHelper.DrawTextLine( L
"Quit: ESC" );
 }

 
else
 
{
  
//txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
  txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f1.0f1.0f1.0f ) );
  txtHelper.DrawTextLine( L
"Press F1 for help" );
 }

 
 txtHelper.End();
}


//--------------------------------------------------------------------------------------
// Before handling window messages, DXUT passes incoming windows 
// messages to the application through this callback function. If the application sets 
// *pbNoFurtherProcessing to TRUE, then DXUT will not process this message.
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
{
 
// Always allow dialog resource manager calls to handle global messages
 
// so GUI state is updated correctly
 *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
 
if*pbNoFurtherProcessing )
  
return 0;
 
if( g_SettingsDlg.IsActive() )
 
{
  g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
  
return 0;
 }

 
// Give the dialogs a chance to handle the message first
 *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
 
if*pbNoFurtherProcessing )
  
return 0;
 
return 0;
}


//--------------------------------------------------------------------------------------
// As a convenience, DXUT inspects the incoming windows messages for
// keystroke messages and decodes the message parameters to pass relevant keyboard
// messages to the application.  The framework does not remove the underlying keystroke 
// messages, which are still passed to the application's MsgProc callback.
//--------------------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
 
if( bKeyDown )
 
{
  
switch( nChar )
  
{
   
case VK_F1: 
    g_bShowHelp 
= !g_bShowHelp; 
    
break;
   
case VK_F4:
    g_HUD.SetVisible(
!g_HUD.GetVisible());
    g_vsb 
= !g_vsb;
    
break;
   
default:
    
break;
  }

 }

}


//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
 
switch( nControlID )
 
{
  
case IDC_TOGGLEFULLSCREEN: 
   DXUTToggleFullScreen(); 
   
break;
  
case IDC_TOGGLEREF:        
   DXUTToggleREF(); 
   
break;
  
case IDC_CHANGEDEVICE:     
   g_SettingsDlg.SetActive( 
!g_SettingsDlg.IsActive() ); 
   
break;
 }

}

void CALLBACK OnLostDevice( void* pUserContext )
{
 
if(g_pVB != NULL)
 
{
  g_pVB
->Release();
  g_pVB 
= NULL;
 }

 g_DialogResourceManager.OnLostDevice();
 g_SettingsDlg.OnLostDevice();
 
if( g_pFont )
  g_pFont
->OnLostDevice();
 
 SAFE_RELEASE( g_pTextSprite );
}

void CALLBACK OnDestroyDevice( void* pUserContext )
{
 g_DialogResourceManager.OnDestroyDevice();
 g_SettingsDlg.OnDestroyDevice();
 SAFE_RELEASE( g_pFont );
}

引用
DirectX SDK 2006学习笔记1——框架
友情提醒:所谓的框架是指SDK目录下\Samples\C++\Common路径下的DXUT系列函数包装。学习框架的前提是必须有足够的Windows API,GUI编程经验,必须熟悉Windows的消息机制,回调机制,最好有万行左右的C/C++编程经验。MFC在这里没有任何用处。另外我觉得最好在看程序之前对于D3D的所有概念有点了解,什么是vertex,texture,matrix,lighting,mesh等等,以及相关的数学概念。这些都可以在网上找到中文翻译,帮助你快速入门。
 
  DXSDK2006和2003版的比起来更新了不少东西,比如DirectX10,还有Managed
DirectX等等。不过我关心的还是D3D9。除了个别接口的更改之外,DXSDK2006还提供了一套图形控件的类库,它的界面还是很漂亮的:)如图:
 
  学习一个框架还是从它的入口学习比较方便,否则容易迷失在无穷无尽的API和层层包装之中。DXSDK2006的框架和2003版的DX9.0c框架有很大的不同。首先是2003版的框架中提供了一个CD3DApplication类,这个类对于初始化,清除,以及游戏窗口的创建,游戏主循环进行了包装。这是一个不错的类,不知道为什么在2006版中去掉了。不过不要紧,2006版的框架中提供的一些C包装函数已经足够了。在看这些函数之前,我们还是先来看看SDK目录下\Samples\C++ \Direct3D\Tutorials中有些什么吧。Tut01_CreateDevice是创建框架,这个程序不用框架,研究一下有助于了解D3D的大致工作流程。下面是winmain函数中的一部分。
 
    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );
 
        // Enter the message loop
        MSGmsg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
  
  在消息循环之前有个初始化设备的函数InitD3D( hWnd ),其代码如下:
HRESULTInitD3D( HWNDhWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        returnE_FAIL;
 
    D3DPRESENT_PARAMETERSd3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
 
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&g_pd3dDevice ) ) )
    {
        returnE_FAIL;
    }
    returnS_OK;
}
 
主要是调用Direct3DCreate9g_pD3D->CreateDevice这两个函数。查看DXSDK文档中关于D3DPRESENT_PARAMETERS的定义,大致了解一下。
接下来要关心的就是消息循环了,在回调函数MsgProc中处理了两个消息,一个是WM_DESTROY,里面调用了Cleanup函数,另一个是WM_PAINT函数,里面调用了Render函数。Cleanup函数很简单,就是调用D3D对象及其设备对象的Release函数释放资源,而Render函数就是D3D中最重要的函数了。
VOIDRender()
{
    if( NULL==g_pd3dDevice)
        return;
 
    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
   
    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here
   
        // End the scene
        g_pd3dDevice->EndScene();
    }
 
    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL);
}
  主要调用的函数有BeginScene, EndScene和Present函数。
    对D3D应用程序有了大概了解之后就可以看空框架程序了。这个程序可以在Samples\C++\Direct3D\EmptyProject中找到。
  从WinMain中的调用可以看到,框架首先设定一堆回调函数,很多事情的是在用户自己写的回调函数中实现。从DXUTInit开始,程序开始调用框架内的API来完成初始化——创建窗口——创建设备——主消息循环——退出等一系列操作。调查Common目录下DXUT.cpp文件就可以发现DXUTInit函数干了以下几件事情
     设定开始调用这个函数的标志符
     InitCommonControls
     保存当前的sticky/toggle/filter键
     通过事先导入winmm.dll的方法timeBeginPeriod来确保调用Sleep的准确性
     设定一些标志附,读取命令行参数
     检查版本
     获得D3D对象指针。值得一提的是框架中大部分全局变量是通过类DXUTState的静态变量state的get/set方法得到的。这些get/set方法是用宏定义的,里面调用了加锁和解锁,因此保证了全局变量设定的线程安全。这些全局性的变量包括D3D对象指针,D3D设备对象指针,BackBufferSurfaceDesc,DeviceCaps,窗口HINSTANCE,窗口句柄HWND,焦点句柄HWNDFocus,全屏设备句柄,窗口设备句柄,窗口客户端矩形,模式切换时窗口客户端矩形,模式切换时全屏客户端矩形,Time,ElapsedTime,FPS数,窗口标题,设备数据DeviceStats,以及是否暂停渲染,时间是否暂停,窗口是否激活等标志,一些窗口事件等等。这些都可以通过DXUTGETXXX/DXUTSETXXX/DXUTISXXX系列包装函数获得。
     通过DXUT_Dynamic_Direct3DCreate9创建D3D对象。很多D3D底层API都是通过动态的方式加载的,这样有利于效率的提高。
     重设全局时钟
     设定DXUTInited为true。很多DXUT系列的函数都喜欢在入口设定一个开始调这个函数的标志,在出口设定一个这个函数已经被调过的标志,这样可以在以后再次调用这个函数的时候了解当前什么工作已经做了,什么工作没做需要补做。我想这个主要是用来防止函数重入问题的吧。其他函数中的这一对函数就不再提了
 
  呼~第一个函数大致看完了,接下来是DXUTCreateWindow函数。什么?要问DXUTSetCursorSettings为什么被无视?因为这个函数不重要。DXUTCreateWindow的工作大致是这样的
     判断关于设备的CallBack有没有设定好
     判断DXUTInit()有没有被调用成功(注意不是有没有调用)。
     获得焦点句柄,因为窗口还没有创建,所以这个句柄应该是NULL
     设定HInstance
     设定窗口类
     注册窗口类
     设定窗口位置和大小。好长一段代码,汗
     创建窗口。终于。。。
     设定窗口焦点句柄,全屏设备句柄,窗口设备句柄
  
  接下来的函数是DXUTCreateDevice。这个函数就是用来选择最优设备并创建的。
     设定参数中的回调函数和上下文,以备后用
     检查窗口是否被成功创建,否则再调用一次DXUTCreateWindow
     枚举所有可能的显示模式。枚举过程非常复杂,用到了CD3DEnumeration中的一些包装函数,这些设备信息包括分辨率,颜色位深等等。这里会用到DXUTCreateDevice传进来的参数IsDeviceAcceptable
     如果命令行设定过显示模式,那么将刚才得到的信息覆盖。
     采用某种权重的算法找出最优显示模式(DXUTFindValidDeviceSettings)
     切换设备。这里用到了DXUTCreateDevice传进来的参数ModifyDeviceSettings。切换设备时要考虑很多问题:比如需要暂时忽略WM_SIZE消息;只有在第一次创建设备的时候才用命令行参数;按照需要调用DXUTCreate3DEnvironment和DXUTReset3DEnvironment;分全屏和窗口设备重设;重设完了根据需要处理WM_SIZE消息;显示窗口,允许WM_SIZE消息等等
 
  最后是DXUTMainLoop。
     检查是否有重入问题
     设定进入主循环标志
     检查设备是否已经被成功创建,没创建的话用默认参数创建一次
     检查前面三个函数是否成功调用。汗,又是检查
     处理窗口消息,注意只有在没有消息处理的时候才调用DXUTRender3DEnvironment()
     在消息循环退出之后清除加速表。应该是类似SHIFT+X这种键盘加速表的清除吧
     更改主循环标志
 
  还是有必要看一下主消息循环中的DXUTRender3DEnvironment
     检查设备是否丢失
     在窗口模式下检查桌面分辨率位深设定,以便重设设备
     尝试重设设备DXUTReset3DEnvironment
     判断上次渲染到现在时间(elapsed time)决定是否要进行渲染
     调用用户的FrameMove函数
     调用用户的FrameRender函数
     调用Present函数
     更新当前Frame
     根据命令行检查是否需要关闭应用程序
 
 
  主函数看完之后,剩下的就是一些回调函数了。要正确使用这些回调函数,除了知道它们的作用之外,还需要知道这些函数是何时被调用的。下面是调用顺序
  • 程序启动:InitApp MsgProc IsDeviceAcceptable ModifyDeviceSettings OnCreateDevice OnResetDevice 渲染主循环
  • 渲染主循环:OnFrameMove OnFrameRender
  • 改变设备:ModifyDeviceSettings OnLostDevice 根据需要调用OnDestroyDevice OnResetDevice 渲染主循环
  • 程序退出:OnLostDevice OnDestroyDevice
  下面是各函数的作用:
InitApp
初始化一些图形控件和GUI的消息处理函数
OnCreateDevice
创建设备时的回调函数,用于创建D3DPOOL_MANAGED资源
OnResetDevice
重设设备时的回调函数,用于创建D3DPOOL_DEFAULT资源
OnFrameMove
动画实现处,常用于矩阵转换等操作
OnFrameRender
渲染实现处,常用于渲染场景
OnLostDevice
设备丢失时的回调函数,释放由OnResetDevice创建的资源
OnDestroyDevice
设备析构时的回调函数,释放由OnCreateDevice创建的资源
IsDeviceAcceptable
创建设备时用来对所有可用设备进行过滤的函数
ModifyDeviceSettings
更改设备时的回调函数,用于实现更改设备时所需做的其他操作
MsgProc
安排各空件处理消息的顺序
OnGUIEvent
程序控件绑定的消息处理回调函数
 
  以上函数均可以更换名字,这里只是用框架默认的函数名字。


李锦俊 2006-11-18 09:08 发表评论

通过DXUT使用设备
DirectX设备的创建在DXUT中得到了改进。你可以让你的应用程序直接创建设备而其它有框架提供的特征仍然可用。
创建设备
选择最佳的设备设置
修改可用的设备设置
降为软件顶点处理
使用你自己的设备

创建设备
典型地,你将通过标准的Direct3D方法创建设备
HRESULT CreateDevice(
    UINT                  Adapter,
    D3DDEVTYPE            DeviceType,
    HWND                  hFocusWindow,
    DWORD                 BehaviorFlags,
    D3DPRESENT_PARAMETERS *pPresentationParameters,
    IDirect3DDevice9      **ppReturnedDeviceInterface
);
这个方法需要有效的适配器,设备类型(HAL or REF),窗口句柄,行为标志(software/hardware vertex processing 和其它驱动标志),以及呈现参数(presentation parameters).此外,D3DPRESENT_PARAMETER结构体还拥有大量的成员指定后备缓冲区,多重采样设定,交换效果,窗口模式,深度模版缓冲,刷新率,呈现间隔,以及呈现标志。
为所有这些参数选择有效的设定是具有挑战性的。框架通过DXUTCreateDevice函数简化了这一选择过程。
HRESULT DXUTCreateDevice(
    UINT AdapterOrdinal  = D3DADAPTER_DEFAULT,
    BOOL bWindowed       = TRUE,
    INT nSuggestedWidth  = 640,
    INT nSuggestedHeight = 480,
    LPDXUTCALLBACKISDEVICEACCEPTABLE pCallbackIsDeviceAcceptable     = NULL,
    LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = NULL
);
最基本的用法是全部使用缺省参数调用:
DXUTCreateDevice();
通过这样的调用框架使用缺省设置创建一个在大多数情况下可用的设备。缺省的设置如下:

Direct3D Creation Flag Description Default Value from DXUTCreateDevice
AdapterFormat parameter of CheckDeviceFormat Adapter surface format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
Adapter parameter of IDirect3D9::CreateDevice Display adapter ordinal. D3DADAPTER_DEFAULT
D3DPRESENT_PARAMETERS. BackBufferCount Number of back buffers. 2, indicating triple buffering.
D3DPRESENT_PARAMETERS. BackBufferFormat Back buffer format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Depth format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
The DeviceType parameter of IDirect3D9::CreateDevice Enumerated type of the device. D3DDEVTYPE_HAL if available, otherwise D3DDEVTYPE_REF or failure code if neither is available.
D3DPRESENT_PARAMETERS. MultiSampleQuality Quality level. MultiSampleQuality = 0, indicating multisampling is disabled.
D3DPRESENT_PARAMETERS. Flags Presentation parameters flags. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
D3DPRESENT_PARAMETERS. PresentationInterval Presentation interval. D3DPRESENT_INTERVAL_IMMEDIATE for windowed mode, or D3DPRESENT_INTERVAL_DEFAULT for full-screen mode.
D3DPRESENT_PARAMETERS. FullScreen_RefreshRateInHz Rate at which the display adapter refreshes the screen. 0, indicating windowed mode.
D3DPRESENT_PARAMETERS. BackBufferWidth and .BackBufferHeight Display mode resolution. 640 x 480 pixels for windowed mode, or the desktop resolution for full-screen mode.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Stencil format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
D3DPRESENT_PARAMETERS. SwapEffect Swap effect. D3DSWAPEFFECT_DISCARD
BehaviorFlags parameter of IDirect3D9::CreateDevice Vertex processing flags. D3DCREATE_HARDWARE_VERTEXPROCESSING if supported, otherwise D3DCREATE_SOFTWARE_VERTEXPROCESSING.
D3DPRESENT_PARAMETERS. Windowed Windowed or full-screen mode. true, indicating windowed mode.
hFocusWindow parameter of CreateDevice Handle to the created window (see Using Application Windows with DXUT). hWndFocus parameter of DXUTSetWindow
D3DPRESENT_PARAMETERS. hDeviceWindow Handle to the device window. hWndDeviceFullScreen or hWndDeviceWindowed parameters of DXUTSetWindow
D3DPRESENT_PARAMETERS. EnableAutoDepthStencil Depth-stencil buffer creation flag. true.

应用程序可以通过参数传递给CreateDevice来更多的控制设备的创建,这将比使用缺省的方式更好。例如,你可以通过nSuggestedWidth and nSuggestedHeight参数改变窗口的尺寸。
DXUTCreateDevice(
    D3DADAPTER_DEFAULT,
    false,
    1024,
    786,
    NULL,
    NULL,
    NULL
);
要得到更多的控制权,应用程序可以使用这两个可选的回调函数,LPDXUTCALLBACKISDEVICEACCEPTABLE and LPDXUTCALLBACKMODIFYDEVICESETTINGS.

选择最佳的设备设置
你可以使用IsDeviceAcceptable回调函数帮助框架为你的应用程序选择最佳的设备设置,就像下面的代码:
bool CALLBACK IsDeviceAcceptable(
D3DCAPS9*     pCaps,
D3DFORMAT     AdapterFormat,
D3DFORMAT     BackBufferFormat,
bool          bWindowed,
void*         pUserContext )
{
    // TODO: return true for acceptable settings and false otherwise.
    return true;
}
这个回调函数的模型基于LPDXUTCALLBACKISDEVICEACCEPTABLE原型(This callback function is modeled on the prototype LPDXUTCALLBACKISDEVICEACCEPTABLE),框架为每个唯一的以下5个设置的有效组合调用这个函数一次:
D3DDEVTYPE DeviceType;
UINT       AdapterOrdinal;
D3DFORMAT  AdapterFormat;
D3DFORMAT  BackBufferFormat;
bool       Windowed;
注意适配器序号和设备类型没有直接的传入回调函数,而是分别作为D3DCAPS9结构体的成员。
通过这个回调函数,应用程序可以拒绝任何它不支持的或不想要的组合。例如,应用程序可以使用下面的代码拒绝16bits的后备缓冲区格式和所有至少不能支持像素着色器PS_2_0的设备:
bool CALLBACK IsDeviceAcceptable(
    D3DCAPS9*     pCaps,
    D3DFORMAT     AdapterFormat,
    D3DFORMAT     BackBufferFormat,
    bool          bWindowed )
{
    if( pCaps->PixelShaderVersion < D3DPS_VERSION(2,0) )
     return false;
    if( BackBufferFormat == D3DFMT_X1R5G5B5 || BackBufferFormat == D3DFMT_R5G6B5 )
        return false;
    return true;
}

为每个唯一的组合调用回调函数后,框架排列剩下的可用组合,并选择它们当中最好的。排名较高的如下:
D3DDEVTYPE_HAL,获取硬件加速
如果应用程序以全屏模式显示,框架更趋向于使用匹配桌面格式的适配器格式,这样可以在全屏与窗口之间快速切换。例外的是,如果桌面显示模式小于32位,框架更趋向于D3DFMT_X8R8G8B8.
匹配适配器格式的后备缓冲区格式
在选择了这些排名高的组合后,要创建设备,行为标志和呈现参数仍然是需要的。对于这些设置,Direct3D使用上面表中的缺省值。

修改可用的设备设置
应用程序可以通过使用第二个可选的回调函数修改对框架可用的设置,这个函数是ModifyDeviceSettings:
bool CALLBACK ModifyDeviceSettings(
    DXUTDeviceSettings* pDeviceSettings,
    const D3DCAPS9*     pCaps )
{
    // TODO: Include device creation requirements here. 
    // 返回真创建设备返回False保持当前设置
    return true;
}
这个函数是基于原型LPDXUTCALLBACKMODIFYDEVICESETTINGS的。DXUTDeviceSettings结构体被框架定义为:
struct DXUTDeviceSettings
{
    UINT       AdapterOrdinal;
    D3DDEVTYPE DeviceType;
    D3DFORMAT  AdapterFormat;
    DWORD      BehaviorFlags;
    D3DPRESENT_PARAMETERS pp;
};

这个结构体包含了创建设备所需要的所有东西,除了窗口句柄,它被假定为先前创建的窗口的句柄。框架用有效的数据填充这个结构体,然后允许应用程序通过ModifyDeviceSettings回调函数改变设备创建的选择。
在这个回调函数中,应用程序可以在DXUTDeviceSettings结构体中改变行为标志以及呈现参数,乃至结构体中任何其它的东西。如果应用程序在回调函数中什么都不改变,设备会成功的创建。然而,对设备创建设置的任何改变都需要被设备支持,否则可能会导致设备创建失败。
比如,如果应用程序需要一个D3DFMT_D24S8的深度模板缓冲区格式,就必须验证设备是否支持,就像下面的代码:
bool CALLBACK ModifyDeviceSettings(
    DXUTDeviceSettings* pDeviceSettings,
    const D3DCAPS9*     pCaps )
{
    IDirect3D9* pD3D = DXUTGetD3DObject();
    if( SUCCEEDED( pD3D->CheckDeviceFormat(
         pDeviceSettings->AdapterOrdinal,
         pDeviceSettings->DeviceType,
         pDeviceSettings->AdapterFormat,
         D3DUSAGE_DEPTHSTENCIL,
         D3DRTYPE_SURFACE,
         D3DFMT_D24S8 ) ) )
    {
     if( SUCCEEDED( pD3D->CheckDepthStencilMatch(
             pDeviceSettings->AdapterOrdinal,
             pDeviceSettings->DeviceType,
             pDeviceSettings->AdapterFormat,
             pDeviceSettings->pp.BackBufferFormat,
             D3DFMT_D24S8 ) ) )
     {
         pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D24S8;
     }
    }
   
    return true;
}

候选的方案是,回调函数可以使用框架的CD3DEnumeration 对象验证D3DFMT_D24S8是否被支持:
 bool CALLBACK ModifyDeviceSettings(
    DXUTDeviceSettings* pDeviceSettings,
    const D3DCAPS9*     pCaps )
{
    CD3DEnumeration *pEnum = DXUTGetEnumeration();
    CD3DEnumDeviceSettingsCombo *pCombo;
 
    pCombo = pEnum->GetDeviceSettingsCombo( pDeviceSettings );
 
    if( pCombo->depthStencilFormatList.Contains( D3DFMT_D24S8 ) )
        pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D24S8;
       
    return true;
}

应用程序修改了设备的设置后,框架就会用新的设置创建设备。
DirectX April 2005 SDK Update中的更新,ModifyDeviceSettings 回调函数返回了一个bool值。如果应用程序返回true框架继续正常的创建设备。如果返回false框架不改变设备并且保持当前的设备,如果已经有一个存在的话。这允许应用程序能够拒绝框架将设备改变到程序不能使用的请求。例如,在多监视器的缺省配置下,在监视器之间拖动窗口会导致框架改变设备。然而,如果应用程序不能使用其它的设备的话,它应当可以拒绝改变,并继续使用当前的设备。

回降到软件顶点处理
如果你设置一个Direct3D设备到支持像素处理却不支持顶点处理的硬件,你会因此需要改变行为标志。为了确保正确地降到软件顶点处理,谨防你不能拒绝一个基于IsDeviceAcceptable回调函数中顶点着色器版本的设备,并确保行为标志在ModifyDeviceSettings 回调函数中被正确调整。这儿有一个例子演示怎样做这些事情。
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings,
                                    const D3DCAPS9* pCaps )
{
    // If device doesn't support HW T&L or doesn't support 1.1 vertex
    // shaders in HW, then switch to SWVP.
    if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
         pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
    {
        pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    }

    else
    {
        pDeviceSettings->BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    }
   
    return true;
}

使用你自己的设备
你没有必要依赖于框架来创建Direct3D设备。应用程序自己可以创建设备并将他传递给框架使用。就像应用程序可以覆盖框架的window creation 设置。简单的使用你想要的设置创建一个设备,然后调用 DXUTSetDevice函数让框架在你的设备上渲染。
注意:如果应用程序创建了不依赖于框架的设备,那么应用程序也必须在主循环执行完以后亲自的通过cleanup 释放设备接口。
另请参阅
通过DXUT作更高级的设备选择



李锦俊 2006-11-22 11:35 发表评论

Effect Framework

摘要

本文简要介绍了在DirectX 9 SDK中提供的Effect Framework支持,以及DirectX FX文件结构和Microsoft Hight Level Shading Language的基本知识。本文假定读者对DirectX Graphics有一定了解,并正在学习DirectX Effect Framework。希望能够与各位读者共同探讨、切磋。

简介

Effect的起源

在计算机3维场景中,物体表面的材质代表了其光学特性。最简单的材质可以表现为Diffuse颜色,Specular颜色,Emissive颜色等信息的集合;而为了表现物体表面的细节,可以 在材质中加入一张纹理——这些就构成了最基本的材质信息。在以前的Direct3D程序中,这些信息可以直接传送给设备,由设备自动根据它们来计算物体表面的光学效果。但是, 仅仅有这些基本的材质信息,已经不足以满足游戏制作者的要求和游戏玩家的要求了——他们希望场景中的材质更加复杂,具有更多的细节,更加逼真。

在Direct3D中,除了材质的概念,还存在一个渲染状态(Render State)的概念。在Direct3D Device中存在很多的渲染状态,它们可以在Direct3D进行渲染时控制渲染的流程和效 果,从而实现某些带有特效的材质。程序员可以通过IDirect3DDevice*::SetRenderState()方法来设置这些状态。所有的渲染状态都是一些特定的数值。对状态的设置可以通过硬 编码完成,即在程序中调用SetRenderState()方法,将设置什么样的状态“写死”在程序里,但是这样做的缺点就是太不灵活了——如果想要实现一种新的渲染状态,就需要修改 程序代码。所以更好的一种方法是将为了实现某一种特效材质的一些渲染状态值记录到一个“效果文件”中,通过在程序运行时读取该文件,从中分析出这些值,并将它们作为参 数调用SetRenderState()。这样,要想实现一种新的特效,只需修改“效果文件”而不用更改代码。

Direct3D SDK是通过Effect Framework来支持这种机制的。而前面所述的“效果文件”在Direct3D中是以*.fx文件存在的。在fx文件中保存了为实现某一特效的渲染状态,包括状态名 称和它们的对应值。所以在9.0以前版本的DirectX中就已经有Effect Framework和FX文件了,早期的Effect Framework仅仅是为了实现对渲染状态进行控制。 但是随着计算机显示硬件技术的发展,图形处理单元(GPU)正在重复CPU所走过的路——新一代的GPU已经具有了可编程特性,程序员可以通过对GPU编写一段程序来控制其渲染的 输出效果。这种程序一般称为Shader程序。目前的Shader程序分成两种,Vertex Shader和Pixel Shader。Vertex Shader主要用于对3维网格模型的每一个顶点进行处理,而Pixel Shader主要用于对要绘制到屏幕上的每一个象素进行处理。通过Shader,程序员可以制作出相当丰富的实时渲染效果。

同CPU一样,对GPU编程也是借助一定的编程语言来进行的。 在DirectX 8中,对GPU的编程是通过一种类似于汇编的语言进行的。而在DirectX 9中,使用了一种类似于C语言的高级语言——Microsoft High Level Shading Language (HLSL) 。

无论使用什么语言对GPU编程,都需要把编译好的Shader程序输送到显卡去。Direct3D Device可以通过SetVertexShader()和SetPixelShader()来向显卡输送Shader程序。然而,由 于Shader和材质具有十分紧密的关系——一般来说,一个Shader就是为了实现一种特殊的材质——最好是能够将Shader程序与材质进行整合。 所以,在DirectX 8和DirectX 9中,原来的Effect Framework发生了扩充——在原来的基础上加入了对Shader程序的支持。程序员可以把Vertex Shader和Pixel Shader程序以函数 的方式直接书写在FX文件中。

 .FX文件

FX文件中的内容大致可以分成几部分:

  • 预编译标志
  • 变量表
  • 结构定义
  • 函数
  • Technique

预编译标志:预编译标志包括

  • #define
  • #elif
  • #else
  • #endif
  • #error
  • #if
  • #ifdef
  • #ifndef
  • #include
  • #line
  • #pragma
  • #undef

其中最常用到的是#include和#define,同C语言中的意义很相似:用#include可以在一个FX文件中引入另外一个或多个文件。#define可以定义FX文件中的宏替换。例如:

#include "helper_Funcs.fx"      //引入一个名为helper_funcs.fx的fx文件
#include "public_variables.fh" //引入一个名为public_variables.fh的文件
#define MATRICES_COUNT 25      //定义宏MATRICES_COUNT为25
#define VSHADER VShader_2_0    //定义宏VSHADER为VShader_2_0

#include带来的好处和C中也是一样的-您可以在一个头文件中定义一些公有变量、函数等,在其他文件中引用它们-就不用写很多遍了。例如:

文件public.fh:

mat4x4 matWorldViewProj; // 4x4世界-视-投影变换矩阵
float3 lightPosisiton;   // 三维光源位置向量
float4 lightColor;       // 光源的颜色
float time;              // 当前时间

//定义一个名为VS_OUTPUT的结构。关于结构体定义,下文中会有介绍

struct VS_INPUT
{
    float4 LocalPos : POSITION;
    float3 Normal : NORMAL;
    float4 Color : COLOR; 
    float2 Texcoord : TEXCOORD0;
};

struct VS_OUTPUT
{
    float4 WorldPos : POSITION;
    float4 Color : COLOR;
    float2 Texcoord : TEXCOORD0;
};

//定义一个名为CaculateWorldPosition的函数。关于函数定义,下文中会有介绍

float3 CaculateWorldPosition( float4 LocalPos )
{
    return mul( LocalPos, matWorldViewProj);
}

这样,当我们在另外一个文件中include这个头文件时,上面所有的定义都可以直接使用了。

文件client.fx:

#include "public.fh"


VS_OUTPUT VS_main( VS_INPUT In ) // 可以直接使用结构体定义VS_OUTPUT和VS_INPUT
{
    VS_OUTPUT Out = 0;
    Out.WorldPos = CaculateWorldPosition( In.LocalPos ); // 可以直接使用函数
    Out.Color = In.Color;
    Out.Texcoord = In.Texcoord;
}

 

这样不仅可以复用代码,还可以使变量名、结构体、函数名的定义统一。

而#define不仅仅可以使某些常量具有比较有意义的名称,通过与#ifdef,#ifndef, #else, #endif等结合使用,还可以用来根据一些配置控制编译过程。

变量表

每个FX文件都可以有若干参数变量,通过Effect Framework可以在程序中识别出这些参数的类型、名称和用途,这样就可以将程序中的一些参数输送到Effect中去,从而更加灵活 的控制效果。参数的类型很多,可以是int, float, matrix, texture等等。例如:

matrix matWorld;    //定义一个名为matWorld的矩阵类型参数变量
float time;         //定义一个名为time的浮点类型参数变量
texture texDiffuse; //定义一个名为texDiffuse的纹理类型参数变量

 

另外,每个变量还有前缀修饰符、Semantic、Annotation等,限于篇幅,在这里不再赘述,具体的介绍请参考DirectX C++帮助文档的DirectX Graphics > Reference > HLSL Shader Reference > Variable Declaration Syntax条目。

结构定义

在FX文件中可以定义结构体,这些结构体一般用于Shader函数的参数和返回值。结构体的定义与C语言方式及其类似,例如:

struct VS_OUTPUT //结构名称
{
    float4 Pos : POSITION; //成员变量。
    float4 Color : COLOR;
    float2 Texcoord : TEXCOORD0;
};

 

上面每个成员变量后面的标识符是该变量的semantic,HLSL编译器根据这个标识符来确定该变量的用处。不一定非得是结构体成员变量才有semantic,一般来说Shader的输入输出参数变量都可以有semantic。

函数

函数部分是在Effect Framework加入了对Vertex Shader和Pixel Shader的扩充后才加入到FX文件中的。FX文件中的函数的内容可以用汇编形式书写,也可以用HLSL编写。目前一般 都是使用HLSL。用这种语言书写的函数与C语言函数十分类似,可以说,只要学过C语言,书写Shader函数就绰绰有余了。在同一个fx文件中可以定义很多函数,在函数中也可以互 相调用,但是最终Shader程序的入口将在fx文件的Technique部分中指定。对于哪个函数是Vertex shader函数,哪个是Pixel shader函数,也是在Technique中指定的。关于Technique,将在下文中介绍。 例子:

float4 CalcDiffuseColor( float3 Normal )
{
    float4 Color; ...//用于实现该函数功能的多条语句
    return Color;
}

VS_OUTPUT Vertex_Shader( float4 InPos : POSITION,
                         float3 InNor : NORMAL, 
                         float3 InTexcoord : TEXCOORD )
{
    VS_OUTPUT Out; ...//用于实现该函数功能的多条语句
    Out.Color = CalcDiffuseColor(InNor); //函数调用
    return Out;
}

 

正如上文中所说,Shader程序分为两种:Vertex shader和Pixel shader。在fx函数中就有两种相应的函数:Vertex shader函数和Pixel Shader函数。Vertex shader函数的输入参数是网格模型中的每一个顶点数据,其输出是经过该函数特殊处理的顶点数据;而Pixel Shader函数的输入,则是经过硬件光栅化过程后经过插值的Vertex shader输出结果。至于Pixel shader的输出,一般就是经过该函数计算得到的一个颜色值,即要画到后备缓冲中一个象素上的颜色值。但是这个“颜色值”有时并不一定代表颜色。而且对于支持多RenderTarget的硬件,Pixel shader还可以有多个输出,分别对应不同的RenderTarget。

technique

technique是FX文件的主体,是真正设置各种渲染状态的地方,也是指定所使用的Shader程序入口的地方。在理解Technique前首先要理解Pass的概念。Pass是Technique的组成部分 ,一个Pass就代表了绘制时的一遍。通常为了达到一种效果,仅仅绘制一遍网格模型是不够的,需要向framebuffer中多次绘制,并利用设置渲染状态中的BlendState进行Alpha混合。这就是经常提到的“Muli-pass Rendering”。但是随着硬件越来越强大,Shader程序的功能越来越强,目前的趋势是所有的特效材质都将可以用越来越少个Pass来完成。 一个technique中,可以存在一个或多个Pass,但是至少要有一个Pass时该technique才会起实际作用。当存在多个pass时,默认情况下在渲染时将会按照pass在文件中的前后顺序 作为渲染时的前后顺序。technique和Pass中的内容都是以大括号括起来。

technique的例子:

technique Tec_Shader_1_X //定义一个名为Tec_Shader_1_X的technique
{
    pass P0 //一个名为P0的pass
    {
        VertexShader = compile vs_1_1 Vertex_Shader(); //设置Vertex Shader程序入口函数
        PixelShader = compile ps_1_1 Pixel_Shader();   //设置Pixel Shader程序入口函数
        AlphaBlendEnable= true;                        //设置渲染状态       
        SrcBlend = SrcAlpha;  
        DestBlend = InvSrcAlpha; 
        ... //其他设置
    }
    pass P1 //一个名为P1的pass
    {
        ...
    }
}

 

ID3DXEffect接口

上面介绍了很多fx文件相关内容,但是在程序中如何读取和分析这些fx文件呢?在程序中对于读取fx文件,控制渲染状态、设置Shader程序等工作都是通过D3DX库中的ID3DXEffect接口来实现的。ID3DXEffect接口提供了大量的方法,基本上分为几个方面:

  • 获得Effect参数变量信息
  • 设置Effect参数变量
  • 获得technique信息
  • 设置当前使用的technique
  • 开始和结束使用当前的technique
  • 执行一个pass(渲染绘制遍)

ID3DXEffect接口的创建: 通过D3DX库中的D3DXCreateEffectFromFile()函数,可以根据一个指定的文件的内容来创建一个ID3DXEffect接口。在该函数执行成功后,所创建的接口中就包含了文件里所对应的 所有内容,包括参数变量表、Shader程序、technique和pass等。

ID3DXEffect接口的使用: 通过该接口的方法可以获得FX文件中的所有信息,并设置参数变量和当前的technique。所有的参数变量、technique、pass、shader等等都有自己的名称,根据这些名称,通过调用ID3DXEffect::GetParameterByName()、ID3DXEffect::GetTechniqueByName()和ID3DXEffect::GetPassByName()等方法就可以获得这些对象的句柄,从而在调用 ID3DXEFFECT::Set***()进行设置时使用句柄而不是字符串进行索引来提高效率。

通过ID3DXEffect::GetParameterDesc()、ID3DXEffect::GetTechniqueDesc()和GetPassDecs等方 法可以获得关于指定对象的所有细节描述信息。 D3DX库中定义了一个D3DXPARAMETER_DESC结构来专门表示参数的类型。通过ID3DXEffect::GetParameterDesc()方法,可以为一个参数获得这样一个结构的数据。

typedef struct _D3DXPARAMETER_DESC
{
    LPCSTR Name;               //参数变量名
    LPCSTR Semantic;           //参数变量的Semantic
    D3DXPARAMETER_CLASS Class; //参数变量的类别,可以是标量、矢量、矩阵、对象和结构
    D3DXPARAMETER_TYPE Type;   //参数变量的类型
    UINT Rows;                 //数组型参数的行数
    UINT Columns;              //数组型参数的列数
    UINT Elements;             //数组中的元素个数
    UINT Annotations;          //参数变量的Annotation个数
    UINT StructMembers;        //结构型参数变量成员的个数
    DWORD Flags;               //参数属性
    UINT Bytes;                //参数大小,以字节记
} D3DXPARAMETER_DESC;

 

其中的参数类型可以有下列几种:

typedef enum _D3DXPARAMETER_TYPE
{
    D3DXPT_VOID, //Void型指针
    D3DXPT_BOOL, //Bool型
    D3DXPT_INT, //整型
    D3DXPT_FLOAT, //浮点型
    D3DXPT_STRING, //字符串
    D3DXPT_TEXTURE, //纹理
    D3DXPT_TEXTURE1D, //一维纹理
    D3DXPT_TEXTURE2D, //二维纹理
    D3DXPT_TEXTURE3D, //三维纹理
    D3DXPT_TEXTURECUBE, //立方体环境纹理
    D3DXPT_SAMPLER, //纹理取样器
    D3DXPT_SAMPLER1D, //一维纹理取样器
    D3DXPT_SAMPLER2D, //二维纹理取样器
    D3DXPT_SAMPLER3D, //三维纹理取样器
    D3DXPT_SAMPLERCUBE, //立方体环境纹理取样器
    D3DXPT_PIXELSHADER, //Pixel Shader程序
    D3DXPT_VERTEXSHADER, //Vertex Shader程序
    D3DXPT_PIXELFRAGMENT, //Pixel Shader片断
    D3DXPT_VERTEXFRAGMENT, //Vertex Shader片断
    D3DXPT_FORCE_DWORD = 0x7fffffff
} D3DXPARAMETER_TYPE;

 

而真正要让Effect起作用,需要在绘制网格模型前后调用ID3DXEffect::BeginPass()和EndPass方法。在调用这两个函数之前和之后,还需调用ID3DXEffect::Begin()和 ID3DXEffect::End()方法来界定此次Effect设置的起止。大致的形式如下:

LPD3DXEffect pd3dEffect; //ID3DXEffect接口指针
... //初始化该指针
... //程序中的其他部分
...

UINT numPasses; //用于接受当前所使用的technique中的pass个数
pd3dEffect->Begin( & numPasses, 0 ) //开始使用当前的technique
for( UINT iPass = 0; iPass < numPasses; iPass ++ )
{
    //遍历所有的pass
    pd3dEffect->BeginPass( iPass ); //调用BeginPass
    DrawMesh();                     //然后进行模型的绘制。
    pd3dEffect->EndPass();          //调用EndPass
}
pd3dEffect->End();                  //不要忘记结束当前technique

 

3DS MAX对DirectX 9 Shader Material的支持;Effect数据获取和导出

在FX文件中的参数,大部分都是用来调整FX文件所指定的Effect的一些细节,例如,一种带有凹凸纹理的效果,可能在FX中就有一个参数控制着凹凸不平的程度。而这些参数是需要由美工来调整的。另外,美工也需要有一个途径能够将FX文件定义的Effect赋予到一个模型或它的一部分上去。同时美工也应该能够实时的预览该Effect在模型上的实际效果。 在以前,实现这些要求只能通过自制效果预览器、模型编辑器或者为DCC软件编写插件来完成。这对于小的工作组和工期较短的项目来说是非常困难的。幸运的是,目前的DCC软件 已经开始为游戏制作提供丰富的支持功能。通过DCC软件自身就可以预览到实时Effect的效果,并调整其参数。在《龙的传说》这个项目中,我们使用3DS MAX 6.0来作为模型建立 工具和Shader预览工具。

在3DS MAX 6.0中,新加入了一种材质类型——DirectX 9 Shader材质。这种材质是基于FX文件的。一个FX文件就可以代表一种材质。它可以同MAX中的其他材质一样赋予到模型上 。在MAX的Viewport中可以实时地观察到FX文件中设计的效果。通过为FX中的参数设置特定的Semantic,可以将这些参数与MAX中的场景信息联系起来,如摄像机位置、世界变换矩 阵等。对于控制Effect效果的一些本地参数,可以通过为它们添加特定的Annotation,使MAX能够直接识别这些参数并在用户界面中显示它们的名称和调节控件。对应不同类型的参 数,MAX可以为它们生成不同的调节控件。这样,这种材质就和MAX的其他材质一样,可以更改纹理等等的参数了。 对于美工来说,通过这种用户界面就可以调整该FX材质的参数达到最好的效果。

但是美工所调整的结果必须要能够保存下来才有意义。这个工作就得由程序员来完成了。要保存3DS MAX中编辑的所有内容,需要为3DS MAX编写文件导出插件,将其内部数据保存在特定格式的文件中。在《龙的传说》这个项目中,我们使用Microsoft DirectX .X 文件。如果从头开始写导出插件,工作量是相当大的;幸运的是,在Microsoft DirectX SDK Extra中提供了一个能够导出模型和3DS MAX标准材质到X文件的插件源代码。通过修改该源代码,可以使它能够导出DirectX 9 Shader材质。在3DS MAX 6 SDK中新增加了一个IDxMaterial接口,通过查询一个IMaterial接口是否为IDxMaterial接口,就可以确定该材质是否为DirectX 9 Shader材质。通过IDxMaterial接口可以获得该材质对应的FX文件的文件名,以及其参数信息。这样就可以将它们导出了。

.X文件中对Effect的支持;EffectInstance和EffectDefault

Microsoft DirectX .X文件的格式是基于模板的、可扩展的文件格式。通过为其制定新的模板,就可以在其中加入新的内容。一般的.X文件中的内容有三维场景的物体层级关系、网格模型几何数据、材质信息、动画信息等。在DirectX的众多X文件模板中有一个模板是专门用来代表Effect的实例的。当一个FX文件的参数被美工加以调整从而具备一些特定的值之后,该 FX文件和这些参数值的集合就形成了一个Effect实例。该模板的定义如下:

template EffectInstance
{
    < E331F7E4-0559-4cc2-8E99-1CEC1657928F >
    STRING EffectFilename;
    [ ... ]
}

 

其中, EffectFilename代表了该Effect实例中的FX文件名, [ ... ]代表在其中可以插入任何X文件模板对应的数据。这样就可以代表任何类型的参数值。

然而要想让Direct3D程序能够识别[ ... ]中的内容,需要使用X文件模板中的EffectParam系列模板,包括EffectParamDWord, EffectParamFlaots, EffectParamString。通过这三种模板对应的数据,所有类型的Effect参数值都可以被记录在X文件中。

最后,EffectInstance数据需要被放置在Material数据中才可以被识别。

Material模板:

template Material
{
    < 3D82AB4D-62DA-11CF-AB39-0020AF71E433 >
    ColorRGBA faceColor;
    FLOAT power;
    ColorRGB specularColor;
    ColorRGB emissiveColor;
    [...]
}

 

前面的一些颜色模板表明在Material数据中这些颜色信息是必须有的,而最后的[ ... ]则代表可以插入任何X文件模板对应的数据。我们的EffectInstance数据就可以放置在这里 。

举一个简单的例子:

Material { //材质
    0.500000;0.500000;0.500000;1.000000;; //faceColor
    0.000000; //power
    0.900000;0.900000;0.900000;; //specularColor
    0.000000;0.000000;0.000000;; //emissiveColor
    EffectInstance
    {                            //[...],这里是EffectInstance
        "SkyboxNew01.fx";        //fx文件的文件名。通过D3DXCreateEffectFromFile()可以
                                 //建立该文件对应的D3DXEffect对象
        //下面是EffectInstance中的[...]

        EffectParamString 
        {                        //EffectParamString,即字符串型参数值 
            "TexCloudTop";       //参数的名称,通过该名称调用ID3DXEffect::GetXXXByName()方法
                                 //可以得到与fx文件中对应的参数
            "DarkClouds01.jpg";  //参数的值 
        } 
        EffectParamString
        {                        //同上
            "TexCloudBottom";
            "DarkClouds02.jpg";
        }
        EffectParamFloats
        {                       //EffectParamFloats,即浮点数组型参数值
            "Brightness";       //参数名称
            1;                  //浮点数组大小
            0.500000;           //值
        }
    }
}

 

当我们在程序中调用D3DXLoadMeshFromX()或D3DXLoadMeshHierarchyFromX()时,就可以通过其LPD3DXBUFFER *ppEffectInstances参数来接收到网格所用的所有EffectInstance的信息。

在程序中,对应于X文件中的EffectInstance模板和EffectParam系列模板,有两个结构体用来代表Effect数据:

typedef struct _D3DXEFFECTINSTANCE
{ //EffectInstance
    LPSTR pEffectFilename; //fx文件名
    DWORD NumDefaults; //参数个数
    LPD3DXEFFECTDEFAULT pDefaults; //参数数组
} D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE;

typedef struct _D3DXEFFECTDEFAULT
{ //EffectDefault,即EffectParam
    LPSTR pParamName;           //参数名
    D3DXEFFECTDEFAULTTYPE Type; //参数类型
    DWORD NumBytes;             //参数大小,以字节记
    LPVOID pValue;              //指向参数的值的指针
} D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT;

需要注意的是,从文件中得到的参数类型只有以下几种:
typedef enum _D3DXEFFECTDEFAULTTYPE
{
    D3DXEDT_STRING = 1, //字符串
    D3DXEDT_FLOATS = 2, //浮点数组
    D3DXEDT_DWORD = 3,  //长整型
    D3DXEDT_FORCE_DWORD = 0x7fffffff //此值不使用
} D3DXEFFECTDEFAULTTYPE;

 

在调用了D3DXLoadMeshFromX()和D3DXLoadMeshHierarchyFromX()之后,X文件中的所有Effect数据信息就以上述结构体的形式放置在ppEffectInstances中了。 另外,在从3DS MAX导出参数到X文件时,对于整型和浮点数组型的变量,它们的值将直接导出到X文件中去;而对于所有的纹理贴图文件参数,导出的仅仅是该文件的文件名。所以 在程序中需要再根据这些文件名来建立纹理对象。 在《龙的传说》中,我们使用一个自定义的CEffectInstance类来处理将文件名转换为纹理对象的过程。 一般来说,建立一个完整的CEffectInstance的过程如下:

根据D3DXEFFECTINSTANCE结构中的pEffectFilename字符串寻找对应的FX文件;
根据该FX文件建立ID3DXEffect,并将指针保存在CEffectInstance中;
根据D3DXEFFECTINSTANCE结构中的pDefaults设置CEffectInstance中的参数信息: 


对于长整型和浮点数组,直接拷贝; 
对于字符串,首先调用ID3DXEffect接口中的GetParameterByName()和GetParameterDesc()方法,得到该参数的类型; 然后进一步判断:


如果确实是字符串参数,则直接拷贝
如果是纹理参数,则将该字符串作为纹理文件名建立纹理对象,并将指针保存在CEffectInstance中。

而在最新推出的DirectX 9 SDK Summer 2004中,通过ID3DXEffect::BeginParameterBlock()和ID3DXEffect::EndParameterBlock()方法,我们可以将Effect参数设置过程统一绑定到一个ParamBlock句柄上。这样,在调用ID3DXEffect::Begin()之前就可以直接使用ID3DXEffect::ApplyParameterBlock()方法来设置所有被绑定的参数值。例如:

[以前的做法]:

在读取参数时:获得每一个参数的句柄

hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
...

在实时绘制时:分别设置每一个参数

pEffect->SetValue( hParam1, value1 );
pEffect->SetValue( hParam2, value2 );
...
pEffect->Begin();
// 绘制
...

 

[在DirectX 9 SDK Summer 2004中的做法]:

在读取参数时:绑定所有参数设置到同一句柄

hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
...
pEffect->BeginParameterBlock(); // 开始绑定
pEffect->SetValue( hParam, value1 );
pEffect->SetValue( hParam, value2 );
...
hParamBlock = pEffect->EndParameterBlock(); // 结束绑定,返回句柄

在实时绘制时:统一设置绑定值

pEffect->ApplyParameterBlock( hParamBlock );
pEffect->Begin;
// 绘制
...

 

这样不仅简化了在读取时对参数的分析过程,而且提高了实际绘制时参数设置过程的效率。

总结

以上就是一些对于在DirectX 9.0中对Effect Framework的使用的简要介绍。总之,使用Effect来替代以前的标准材质是目前实时图形领域的发展趋势。通过Effect Framework,程序员和美工可以为实时三维程序实现多种多样的材质效果和视觉效果。 由于内容实在太多,限于篇幅,本文只是对Effect Framework中相关概念的一个总体概括和简要介绍,所以显得有些晦涩。在以后的文章中,将分批对这个Framework以及在其之上进行工作的流程进行比较详细的介绍。

·内容
   渲染到纹理是D3D中的一项高级技术。一方面,它很简单,另一方面它很强大并能产生很多特殊效果。 比如说发光效果,环境映射,阴影映射,都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先,我们要创造一个纹理,并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后,我们把这个纹理用在最后的渲染上。

·main.cpp
   首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外,我们还需要两个Surface对象。一个是用来存储后台缓冲区,一个用来当纹理的渲染对象。后面我再详细介绍它们。另外我们还需要两个矩阵,一个是用来当纹理的投影矩阵,另一个是存储原来的矩阵。

LPDIRECT3DTEXTURE9 pRenderTexture = NULL;
LPDIRECT3DSURFACE9 pRenderSurface = NULL,pBackBuffer = NULL;
D3DXMATRIX matProjection,matOldProjection;

   现在我们来创建纹理。前两个参数是纹理的宽度和高度,第三个参数是纹理的多级渐进纹理序列参数,在这里是设为1,第四个参数非常重要而且必须设为D3DUSAGE_RENDERTARGET,表明我们所创建的纹理是用来渲染的。剩下的参数就是指纹理格式,顶点缓冲区的内存位置,和一个指向纹理的指针。当纹理是用来当渲染对象时,顶点缓冲区的内存位置必须设为D3D_DEFAILT。

g_App.GetDevice()->CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,D3DPOOL_DEFAULT,&pRenderTexture,NULL);

   为了访问纹理内存对象,我们需要一个Surface对象,因为D3D中的纹理是用这样的一个Surface来存储纹理数据的。为了得到纹理表面的Surface,我们需要调用方法GetSurfaceLevel() 。第一个参数我们设为0,第二个参数为一个指向surface对象的指针。

pRenderTexture->GetSurfaceLevel(0,&pRenderSurface);

下一步就是创建一个适合纹理维数的投影矩阵,因为纹理的横纵比和后台缓冲区的不一样。

D3DXMatrixPerspectiveFovLH(&matProjection,D3DX_PI / 4.0f,1,1,100);

在我们的循环渲染之前,我们必须保存后台缓冲区和它的投影矩阵。

g_App.GetDevice()->GetTransform(D3DTS_PROJECTION,&matOldProjection);
g_App.GetDevice()->GetRenderTarget(0,&pBackBuffer);

   渲染循环函数可以分为两个部分。第一部分是渲染到纹理的过程。因此,渲染对象必须设为纹理表面。然后我们就可以把东西渲染到这个对象上了。渲染到另一个表面上和正常地渲染到后台缓冲区差不多。只有一点不同,那就是先不调用Prensent()函数,因为纹理上的内容并不需要显示在屏幕上。象平时一样,我们先要重置表面颜色缓冲区,并且调用BeginSence()和EndSence()方法。为了能够适当的渲染,我们必须设置和纹理表面相符的投影矩阵。否则最后的图象可能被扭曲

//render-to-texture
g_App.GetDevice()->SetRenderTarget(0,pRenderSurface); //set new render target
g_App.GetDevice()->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(100,100,100),1.0f,0); //clear texture
g_App.GetDevice()->BeginScene();

g_App.GetDevice()->SetTexture(0,pPyramideTexture);

D3DXMatrixRotationY(&matRotationY,fRotation);
D3DXMatrixTranslation(&matTranslation,0.0f,0.0f,5.0f);
g_App.GetDevice()->SetTransform(D3DTS_WORLD,&(matRotationY * matTranslation));
g_App.GetDevice()->SetTransform(D3DTS_PROJECTION,&matProjection); //set projection matrix

g_App.GetDevice()->SetStreamSource(0,pTriangleVB,0,sizeof(D3DVERTEX));
g_App.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);

g_App.GetDevice()->EndScene();

   渲染循环的第二部分就是渲染最后场景的过程(也就是显示到屏幕上的过程)。渲染对象重新设为后台缓冲区,投影矩阵重新设为原来的投影矩阵。由于纹理已经准备好了,所以它和纹理层0相关联。

//render scene with texture
g_App.GetDevice()->SetRenderTarget(0,pBackBuffer); //set back buffer
g_App.GetDevice()->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_App.GetDevice()->BeginScene();

g_App.GetDevice()->SetTexture(0,pRenderTexture); //set rendered texture

g_App.GetDevice()->SetTransform(D3DTS_WORLD,&matTranslation);
g_App.GetDevice()->SetTransform(D3DTS_PROJECTION,&matOldProjection); //restore projection matrix

g_App.GetDevice()->SetStreamSource(0,pQuadVB,0,sizeof(D3DVERTEX));
g_App.GetDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);

g_App.GetDevice()->EndScene();
g_App.GetDevice()->Present(NULL,NULL,NULL,NULL);

最后我们通过调用Release()方法释放Surface对象。

pRenderSurface->Release();
pRenderSurface = NULL;

pBackBuffer->Release();
pBackBuffer = NULL;

   渲染到纹理能让你做很多事情,但是你必须注意一些限制。首先深度缓冲区必须总是大于或等于渲染对象的大小。此外,渲染对象和深度缓冲区的格式必须一致。

  提高3D图形程序的性能是个很大的课题。图形程序的优化大致可以分成两大任务,一是要有好的场景管理程序,能快速剔除不可见多边形,并根据对象距相机远近选择合适的细节(LOD);二是要有好的渲染程序,能快速渲染送入渲染管线的可见多边形。   
  我们知道,使用OpenGL或Direct3D渲染图形时,首先要设置渲染状态,渲染状态用于控制渲染器的渲染行为。应用程序可以通过改变渲染状态来控制OpenGL或Direct3D的渲染行为。比如设置Vertex/Fragment Program、绑定纹理、打开深度测试、设置雾效等。  
  改变渲染状态对于显卡而言是比较耗时的操作,而如果能合理管理渲染状态,避免多余的状态切换,将明显提升图形程序性能。这篇文章将讨论渲染状态的管理。  

文档目录:  
  基本思想  
  实际问题  
  渲染脚本  

文档内容:  

基本思想  
  我们考虑一个典型的游戏场景,包含人、动物、植物、建筑、交通工具、武器等。稍微分析一下就会发现,实际上场景里很多对象的渲染状态是一样的,比如所有的人和动物的渲染状态一般都一样,所有的植物渲染状态也一样,同样建筑、交通工具、武器也是如此。我们可以把具有相同的渲染状态的对象归为一组,然后分组渲染,对每组对象只需要在渲染前设置一次渲染状态,并且还可以保存当前的渲染状态,设置渲染状态时只需改变和当前状态不一样的状态。这样可以大大减少多余的状态切换。下面的代码段演示了这种方法:  
   

// 渲染状态组链表,由场景管理程序填充  
RenderStateGroupList groupList;  
// 当前渲染状态  
RenderState curState;  

……  

// 遍历链表中的每个组  
RenderStateGroup *group = groupList.GetFirst();  
while ( group != NULL )  
{   
     // 设置该组的渲染状态  
     RenderState *state = group->GetRenderState();  
     state->ApplyRenderState( curState );  

     // 该渲染状态组的对象链表  
     RenderableObjectList *objList = group->GetRenderableObjectList();  
     // 遍历对象链表的每个对象  
     RenderableObject *obj = objList->GetFirst();  
     while ( obj != NULL )  
     {  
         // 渲染对象  
         obj->Render();  

         obj = objList->GetNext();  
     }  

     group = groupList.GetNext();   
}  
   
//其中RenderState类的ApplyRenderState方法形如:   
void RenderState::ApplyRenderState( RenderState &curState )   
{  
     // 深度测试   
     if ( depthTest != curState.depthTest )  
     {  
         SetDepthTest( depthTest );  
         curState.depthTest = depthTest;  
     }  

     // Alpha测试  
     if ( alphaTest != curState.alphaTest )  
     {  
         SetAlphaTest( alphaTest );  
         curState.alphaTest = alphaTest;  
     }  

     // 其它渲染状态  
     ……  
}      


  这些分组的渲染状态一般被称为Material或Shader。这里Material不同于OpenGL和Direct3D里面用于光照的材质,Shader也不同于OpenGL里面的Vertex/Fragment Program和Direct3D里面的Vertex/Pixel Shader。而是指封装了的显卡渲染图形需要的状态(也包括了OpenGL和Direct3D原来的Material和Shader)。  

  从字面上看,Material(材质)更侧重于对象表面外观属性的描述,而Shader(这个词实在不好用中文表示)则有用程序控制对象表面外观的含义。由于显卡可编程管线的引入,渲染状态中包含了Vertex/Fragment Program,这些小程序可以控制物体的渲染,所以我觉得将封装的渲染状态称为Shader更合适。这篇文章也将称之为Shader。  

  上面的代码段只是简单的演示了渲染状态管理的基本思路,实际上渲染状态的管理需要考虑很多问题。  
渲染状态管理的问题  
   

 消耗时间问题  
  改变渲染状态时,不同的状态消耗的时间并不一样,甚至在不同条件下改变渲染状态消耗的时间也不一样。比如绑定纹理是一个很耗时的操作,而当纹理已经在显卡的纹理缓存中时,速度就会非常快。而且随着硬件和软件的发展,一些很耗时的渲染状态的消耗时间可能会有减少。因此并没有一个准确的消耗时间的数据。  

  虽然消耗时间无法量化,情况不同消耗的时间也不一样,但一般来说下面这些状态切换是比较消耗时间的:  

Vertex/Fragment Program模式和固定管线模式的切换(FF,Fixed Function Pipeline)   

Vertex/Fragment Program本身程序的切换   

改变Vertex/Fragment Program常量   

纹理切换   

顶点和索引缓存(Vertex & Index Buffers)切换   

  有时需要根据消耗时间的多少来做折衷,下面将会遇到这种情况。   

   

 渲染状态分类  
  实际场景中,往往会出现这样的情况,一类对象其它渲染状态都一样,只是纹理和顶点、索引数据不同。比如场景中的人,只是身材、长相、服装等不同,也就是说只有纹理、顶点、索引数据不同,而其它如Vertex/Fragment Program、深度测试等渲染状态都一样。相反,一般不会存在纹理和顶点、索引数据相同,而其他渲染状态不同的情况。我们可以把纹理、顶点、索引数据不归入到Shader中,这样场景中所有的人都可以用一个Shader来渲染,然后在这个Shader下对纹理进行分组排序,相同纹理的人放在一起渲染。  
 多道渲染(Multipass Rendering)  
  有些比较复杂的图形效果,在低档显卡上需要渲染多次,每次渲染一种效果,然后用GL_BLEND合成为最终效果。这种方法叫多道渲染Multipass Rendering,渲染一次就是一个pass。比如做逐像素凹凸光照,需要计算环境光、漫射光凹凸效果、高光凹凸效果,在NV20显卡上只需要1个pass,而在NV10显卡上则需要3个pass。Shader应该支持多道渲染,即一个Shader应该分别包含每个pass的渲染状态。  

    不同的pass往往渲染状态和纹理都不同,而顶点、索引数据是一样的。这带来一个问题:是以对象为单位渲染,一次渲染一个对象的所有pass,然后渲染下一个对象;还是以pass为单位渲染,第一次渲染所有对象的第一个pass,第二次渲染所有对象的第二个pass。下面的程序段演示了这两种方式:  

  以对象为单位渲染   

// 渲染状态组链表,由场景管理程序填充  
ShaderGroupList groupList;  

……  

// 遍历链表中的每个组  
ShaderGroup *group = groupList.GetFirst();  
while ( group != NULL )  
{   
     Shader *shader = group->GetShader();  
   
     RenderableObjectList *objList = group->GetRenderableObjectList();  

     // 遍历相同Shader的每个对象  
     RenderableObject *obj = objList->GetFirst();  
     while ( obj != NULL )  
     {  
         // 获取shader的pass数  
         int iNumPasses = shader->GetPassNum();  
         for ( int i = 0; i < iNumPasses; i++ )
{
// 设置shader第i个pass的渲染状态
shader->ApplyPass( i );  
             // 渲染对象  
             obj->Render();  
         }  

         obj = objList->GetNext();  
     }  
   
     group = groupList->GetNext();  
}  
     

以pass为单位渲染   
   
// 渲染状态组链表,由场景管理程序填充  
ShaderGroupList groupList;  
   
……  
   
for ( int i = 0; i < MAX_PASSES_NUM; i++ )
{
// 遍历链表中的每个组
ShaderGroup *group = groupList.GetFirst();
while ( group != NULL )
{
Shader *shader = group->GetShader();  
         int iNumPasses = shader->GetPassNum();  
         // 如果shader的pass数小于循环次数,跳过此shader  
         if( i >= iNumPasses )  
         {  
             group = groupList->GetNext();  
             continue;  
         }  

         // 设置shader第i个pass的渲染状态  
         shader->ApplyPass( i );  

         RenderableObjectList *objList =   
             group->GetRenderableObjectList();  
   
         // 遍历相同Shader的每个对象  
         RenderableObject *obj = objList->GetFirst();  
         while ( obj != NULL )  
         {  
             obj->Render();  

             obj = objList->GetNext();  
         }  

         group = groupList->GetNext();  
     }  
}  
   

      
  这两种方式各有什么优缺点呢?  

  以对象为单位渲染,渲染一个对象的第一个pass后,马上紧接着渲染这个对象的第二个pass,而每个pass的顶点和索引数据是相同的,因此第一个pass将顶点和索引数据送入显卡后,显卡Cache中已经有了这个对象顶点和索引数据,后续pass不必重新将顶点和索引数据拷到显卡,因此速度会非常快。而问题是每个pass的渲染状态都不同,这使得实际上每次渲染都要设置新的渲染状态,会产生大量的多余渲染状态切换。  

  以pass为单位渲染则正好相反,以Shader分组,相同Shader的对象一起渲染,可以只在这组开始时设置一次渲染状态,相比以对象为单位,大大减少了渲染状态切换。可是每次渲染的对象不同,因此每次都要将对象的顶点和索引数据拷贝到显卡,会消耗不少时间。  
  可见想减少渲染状态切换就要频繁拷贝顶点索引数据,而想减少拷贝顶点索引数据又不得不增加渲染状态切换。鱼与熊掌不可兼得 :-(  
  由于硬件条件和场景数据的情况比较复杂,具体哪种方法效率较高并没有定式,两种方法都有人使用,具体选用那种方法需要在实际环境测试后才能知道。  
   

 多光源问题  
待续……  

   

 阴影问题  
待续……  


   

渲染脚本  
  现在很多图形程序都会自己定义一种脚本文件来描述Shader。  

  比如较早的OGRE(Object-oriented Graphics Rendering Engine,面向对象图形渲染引擎)的Material脚本,Quake3的Shader脚本,以及刚问世不久的Direct3D的Effect File,nVIDIA的CgFX脚本(文件格式与Direct3D Effect File兼容),ATI RenderMonkey使用的xml格式的脚本。OGRE Material和Quake3 Shader这两种脚本比较有历史了,不支持可编程渲染管线。而后面三种比较新的脚本都支持可编程渲染管线。  

   

脚本  特性  范例   
OGRE Material 封装各种渲染状态,不支持可编程渲染管线  >>>>   
Quake3 Shader 封装渲染状态,支持一些特效,不支持可编程渲染管线  >>>>   
Direct3D Effect File 封装渲染状态,支持multipass,支持可编程渲染管线  >>>>   
nVIDIA CgFX脚本 封装渲染状态,支持multipass,支持可编程渲染管线  >>>>   
ATI RenderMonkey脚本 封装渲染状态,支持multipass,支持可编程渲染管线  >>>>   

   

  使用脚本来控制渲染有很多好处:  

可以非常方便的修改一个物体的外观而不需重新编写或编译程序   

可以用外围工具以所见即所得的方式来创建、修改脚本文件(类似ATI RenderMonkey的工作方式),便于美工、关卡设计人员设定对象外观,建立外围工具与图形引擎的联系   

可以在渲染时将相同外观属性及渲染状态的对象(也就是Shader相同的对象)归为一组,然后分组渲染,对每组对象只需要在渲染前设置一次渲染状态,大大减少了多余的状态切换

李锦俊 2006-11-18 22:34 发表评论

引用

Direct3D10特性预览
将我在GameResBlog的老文章重新贴回来,发现写的还是很有味道,嘿嘿~~
 
刚拿到DirectX Dec2005 SDK,发现竟然有D3D10的文档和例子,速研究了一下,以下只是个人的读书笔记,仅作参考

1.去掉了固定管线
文档里列出了用DX10特性模拟的一些固定管线的操作,MS那么大度把DX都开源了(^O^)。

2.去掉了以前版本DX的设备能力检查(CAPS)
为DX10和Windows Vista提供的显示硬件必须满足DX10的所有硬件特性。这样对于开发者就比较可以放心的使用各种硬件特性了,很类似Console平台
的开发。

3.状态对象(State Object)
"从100多个渲染状态中解脱出来吧!"
D3D10对渲染状态这个概念进行淡化,一方面使用全Shader化的架构使得状态的前后设置和互相影响对渲染成功率降低到最少
另外对API架构也更为简洁,另一方面对一些关键渲染状态进行封装和分类。主要分类有:

Input Layout Object 输入层对象
这个东西很类似D3D9里的顶点声明,也就是对用户输入数据进行整合和系统化

Rasterizer Object 光栅化对象
这部分主要控制光栅器的行为:填充模式(FILL_MODE),剔除模式(CULL_MODE),多采样,DepthBias等等

DepthStencil Object 深度缓冲对象
主要控制深度缓冲的行为,像Z-buffer Enable之类的

Blend Object 混合对象
设置象素混合的方法,类似AlphaBlend SrcAlpha ,DestAlpha等等

Sampler Object 采样器对象
设置纹理采样状态,包括过滤器和MipMap

4.新的资源访问模式和资源视图(View)概念
如果对比D3D9的Shader使用代码和D3D10的类似代码会发现一个不同。
D3D9 Shader需要对纹理进行操作时,需要将纹理设置到Shader就可以了,而D3D10里没有那么简单,设置前必须将
各种资源整合后为资源创建一个视图,再提交给Shader访问。这种操作在环境贴图里是很有好处的。对于CubeMap的6张纹理
就可以采用一个视图设置到设备,而自己要访问每张贴图只要轻松访问视图就可以了,也就是说把资源规整和集成化。

5.新的可编程图形层(Stage)-几何Shader(Geometry Shader)
原来的VS和PS只是对逐个顶点或象素进行处理,而新的GS可以对每个顶点或象素的临近顶点设置Shader。也就是可以对批量几何进行处理
GS的用途有:
点精灵
动态粒子系统
皮毛系统
卷积阴影
单Pass渲染到球形贴图
逐多边形材质交换
逐多边形材质设置

6.设备的创建要求对ViewPort进行设置
D3D9里无需对ViewPort进行设置就可以进行渲染,而且默认的RenderTarget就是后备缓冲
而在D3D10里,这个过程变得更为自主化。取出后备缓冲的格式,将RenderTarget设置为屏幕
这让人感到D3D10设计更趋向于成熟的引擎设计。

7.流输出层(Stream Output State)
这个层的功能是将VS和GS处理完成的数据输出给用户,由用户进行处理后再反馈给管线继续处理

8.多边形拓扑结构从绘制代码分离
现在可以单独设置拓扑结构
g_pd3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
和使用Draw函数绘制了,很类似OpenGL


9.严格的设备对象创建时间验证
这里的设备对象就是从设备创建出来的资源。为了减少CPU占用,D3D10重新设计了硬件资源调用调度,所有的设备对象都用面向对象的方法被设备
管理。这种设计方法避免了在渲染期的资源创建操作。

10.去掉BeginScene和EndScene
这个对于图形API确实多余


Dec2005 sdk里提供的文档让人很快想到这只是一个过渡版本
在DXUT的Mesh.Create函数中可以看到一个很有趣的现象:
创建D3D9对象,使用D3DX9里的载入X模型文件的函数载入X文件
将D3D9的模型数据转成D3D10的类型。这样做无非是在告诉我们一个
这样的信息,D3D10很有可能提供一种新的模型格式来作为研究使用
。Vista的图形系统Avalon从一些视频上分析,使用了大量的XML,所以
新的模型格式很有可能使用XML,并且X格式的解析接口确实不方便。而
XML的分析器可以由第三方提供。使得更多的研究人员能更方便的使用
这种新格式。

顺便提供一些缩写对应的含义,这些在一些函数前缀会出现
IA-Input Assembler State
SO-Stream Output State
OM-Output Merger State
VS-Vertex Shader
PS-Pixel Shader
GS-Geometry Shader

Powered by Davy.xu
msn:sunicdavy@sina.com

好好的一个程序,在我的电脑(ELSA X800 256M显卡)上运行一切正常,拿到别的电脑(845G内置显卡)上。啊。花屏~~赶快调试,幸好公司的电脑也有这种内置显卡的电脑。赶快用远程调试。谁知这一调试,就花了我整整一个上午。。。赶快写下来。。。

最终排差的原因是DrawIndexedPrimitiveUP最后一个参数VertexStreamZeroStride ,这个参数是用来指定顶点所占的字节数。我自作聪明的把顶点结构后增加了一个自己用的数据,如:正常的顶点结构
struct CUSTOMVERTEX
{
 FLOAT x, y, z,rhw;
 DWORD color;
 float u,v;
};

我改了之后的顶点结构:
struct CUSTOMVERTEX
{
 FLOAT x, y, z,rhw;
 DWORD color;
 float u,v;
DWORD dwMyData; // 用来保存我自己用的数据
};

结果,在我的显卡上一切正常,这个数据也有用,然后DrawIndexedPrimitiveUP的时候,也会根据最后的参数sizeof(CUSTOMVERTEX)顺利的读取相应的顶点。但是,拿到845G的内置显卡上就死活花屏。后来终于知道是这个原因,于是解决办法就是把dwMyData去掉,放到顶点结构外面去。

顺便说说DrawIndexedPrimitiveUP的用法:
HRESULT DrawIndexedPrimitiveUP(
  D3DPRIMITIVETYPEPrimitiveType, // 图原的类型
  UINTMinVertexIndex,  // 指定0
  UINTNumVertices,  // 指定需要渲染的顶点的数量(如一个矩形可以由4个顶点组成,然后通过顶点索引来达到渲染2个三角形的效果,那么这里就应该填写4,而不是6)
  UINTPrimitiveCount, // 要渲染的图原的数量(如一个矩形,由两个三角形组成,就应该填写2)
  CONST void pIndexData, // 索引数据指针
  D3DFORMATIndexDataFormat, // 索引数据格式,一般为D3DFMT_INDEX16或D3DFMT_INDEX32 
  CONST void
pVertexStreamZeroData, // 顶点数据指针
  UINTVertexStreamZeroStride // 顶点大小一般为sizeof(顶点结构)
);

记得默认情况下渲染三角形的顺序是逆时针的(初学者经常范这个错误,本来想渲染一个矩形,结果一个三角形顺时间、另一个三角形逆时针,结果渲染出来只看到一个三角形了,被背面剔除掉了)。


李锦俊 2006-12-25 15:11 发表评论

技巧如下:

设置可变顶点格式时增加一个D3DCOLOR类型的漫反射分量,其中的alpha值指定了alpha混合因子。

// The 2D vertex format and descriptor
typedef struct
{
    
float x, y, z;      // 2D coordinates
    float rhw;          // rhw
    D3DCOLOR diffuse;   // diffuse color component
} VERTEX;

#define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// initialize vertex data
    VERTEX verts[] = {
      { 
100.0f100.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
300.0f100.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
100.0f300.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
300.0f300.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      {  
50.0f150.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      { 
350.0f150.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      {  
50.0f350.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      { 
350.0f350.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  }
    };

D3DCOLOR类型可以用D3DCOLOR_RGBA宏来生成,定义如下:

// maps unsigned 8 bits/channel to D3DCOLOR
#define D3DCOLOR_ARGB(a,r,g,b) \
    ((D3DCOLOR)((((a)
&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

#define D3DCOLOR_RGBA(r,g,b,a) D3DCOLOR_ARGB(a,r,g,b)

其中的a指定了alpha因子,a为255表示该颜色完全不透明,a为0表示该颜色完全透明。

在绘制的时候,将首先绘制的图形设置为禁用alpha混合模式,将后面绘制的图形设置为启用alpha混合模式,并设置alpha混合具体模式。

       // disable alpha blending and draw 2 polygons
        g_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
        g_d3d_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

        
// enable alpha blending and draw 2 polygons
        g_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        g_d3d_device
->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        g_d3d_device
->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
        g_d3d_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 42);   

完整源码如下:

/***************************************************************************************
PURPOSE:
    Alpha blending Demo

Required libraries:
  D3D9.LIB
 **************************************************************************************
*/

#include 
<windows.h>
#include 
<stdio.h>
#include 
"d3d9.h"

#pragma comment(lib, 
"d3d9.lib")

#define WINDOW_WIDTH    400
#define WINDOW_HEIGHT   400

#define Safe_Release(p) if((p)) (p)->Release();

// window handles, class and caption text.
HWND        g_hwnd;
HINSTANCE   g_inst;
static char g_class_name[] = "AlphaClass";
static char g_caption[]    = "Alpha Blending Demo";

// the Direct3D and device object
IDirect3D9* g_d3d = NULL;
IDirect3DDevice9
* g_d3d_device = NULL;

// The 2D vertex format and descriptor
typedef struct
{
    
float x, y, z;      // 2D coordinates
    float rhw;          // rhw
    D3DCOLOR diffuse;   // diffuse color component
} VERTEX;

#define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

IDirect3DVertexBuffer9
* g_vertex_buffer = NULL;
IDirect3DTexture9
*      g_texture = NULL;

//--------------------------------------------------------------------------------
// Window procedure.
//--------------------------------------------------------------------------------
long WINAPI Window_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
return 0;
    }

    
return (long) DefWindowProc(hwnd, msg, wParam, lParam);
}

//--------------------------------------------------------------------------------
// Initialize d3d, d3d device, vertex buffer, texutre. 
//--------------------------------------------------------------------------------
BOOL Do_Init()
{
    D3DPRESENT_PARAMETERS present_param;
    D3DDISPLAYMODE  display_mode;
    BYTE
* vertex_ptr;

    
// initialize vertex data
    VERTEX verts[] = {
      { 
100.0f100.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
300.0f100.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
100.0f300.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      { 
300.0f300.0f1.0f1.0f, D3DCOLOR_RGBA(0,64,128,255) },
      {  
50.0f150.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      { 
350.0f150.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      {  
50.0f350.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
      { 
350.0f350.0f1.0f1.0f, D3DCOLOR_RGBA(128,0,0,128)  }
    }; 

    
// do a windowed mode initialization of Direct3D
    if((g_d3d = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
        
return FALSE;

    
// retrieves the current display mode of the adapter
    if(FAILED(g_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode)))
        
return FALSE;

    ZeroMemory(
&present_param, sizeof(present_param));

    
// initialize d3d presentation parameter
    present_param.Windowed          = TRUE;
    present_param.SwapEffect        
= D3DSWAPEFFECT_DISCARD;
    present_param.BackBufferFormat  
= display_mode.Format;

    
// creates a device to represent the display adapter
    if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
&present_param, &g_d3d_device)))
        
return FALSE;     

    
// create the vertex buffer and set data
    g_d3d_device->CreateVertexBuffer(sizeof(VERTEX) * 80, VERTEX_FVF, D3DPOOL_DEFAULT, &g_vertex_buffer, NULL);

    
// locks a range of vertex data and obtains a pointer to the vertex buffer memory
    g_vertex_buffer->Lock(00, (void**)&vertex_ptr, 0);

    memcpy(vertex_ptr, verts, 
sizeof(verts));

    
// unlocks vertex data
    g_vertex_buffer->Unlock();

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Release all d3d resource.
//--------------------------------------------------------------------------------
BOOL Do_Shutdown()
{
    Safe_Release(g_vertex_buffer);
    Safe_Release(g_d3d_device);
    Safe_Release(g_d3d);

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Render a frame.
//--------------------------------------------------------------------------------
BOOL Do_Frame()
{
    
// clear device back buffer
    g_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(000255), 1.0f0);

    
// Begin scene
    if(SUCCEEDED(g_d3d_device->BeginScene()))
    {
        
// set the vertex stream, shader, and texture.

        
// binds a vertex buffer to a device data stream
        g_d3d_device->SetStreamSource(0, g_vertex_buffer, 0sizeof(VERTEX));

        
// set the current vertex stream declation
        g_d3d_device->SetFVF(VERTEX_FVF);

        
// assigns a texture to a stage for a device
        g_d3d_device->SetTexture(0, g_texture);

        
// disable alpha blending and draw 2 polygons
        g_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
        g_d3d_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

        
// enable alpha blending and draw 2 polygons
        g_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        g_d3d_device
->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        g_d3d_device
->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
        g_d3d_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 42);        

        
// end the scene
        g_d3d_device->EndScene();
    }

    
// present the contents of the next buffer in the sequence of back buffers owned by the device
    g_d3d_device->Present(NULL, NULL, NULL, NULL);

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    WNDCLASSEX  win_class;
    MSG         msg;

    g_inst 
= inst;

    
// create window class and register it
    win_class.cbSize        = sizeof(win_class);
    win_class.style         
= CS_CLASSDC;
    win_class.lpfnWndProc   
= Window_Proc;
    win_class.cbClsExtra    
= 0;
    win_class.cbWndExtra    
= 0;
    win_class.hInstance     
= inst;
    win_class.hIcon         
= LoadIcon(NULL, IDI_APPLICATION);
    win_class.hCursor       
= LoadCursor(NULL, IDC_ARROW);
    win_class.hbrBackground 
= NULL;
    win_class.lpszMenuName  
= NULL;
    win_class.lpszClassName 
= g_class_name;
    win_class.hIconSm       
= LoadIcon(NULL, IDI_APPLICATION);

    
if(! RegisterClassEx(&win_class))
        
return FALSE;

    
// create the main window
    g_hwnd = CreateWindow(g_class_name, g_caption, WS_CAPTION | WS_SYSMENU, 00,
                          WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, inst, NULL);

    
if(g_hwnd == NULL)
        
return FALSE;

    ShowWindow(g_hwnd, SW_NORMAL);
    UpdateWindow(g_hwnd);

    
// initialize game
    if(Do_Init() == FALSE)
        
return FALSE;

    
// start message pump, waiting for signal to quit.
    ZeroMemory(&msg, sizeof(MSG));

    
while(msg.message != WM_QUIT)
    {
        
if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
        {
            TranslateMessage(
&msg);
            DispatchMessage(
&msg);
        }
        
        
// draw a frame
        if(Do_Frame() == FALSE)
            
break;
    }

    
// run shutdown function
    Do_Shutdown();

    UnregisterClass(g_class_name, inst);
    
    
return (int) msg.wParam;
}

效果图:


用Vista也一年多了(非正版),最近公司换了新电脑,开始用深度的XP,用Vista习惯了,在用XP感觉真不好。

索性就换成Vista U,安装完成后才发现SYS盘空间太小,用PQ把SYS盘加大5G。

重启后发现D盘没了,在磁盘管理里提示无法加载,有提示有查找新硬件,在于设备查看器里是D盘,于是安装“通用卷”,可是已经用Vista优化大师把驱动备份删除了,于是加载Vista盘,用IMAGEX把INSTALL.WIN解压,COPY其中的Windows\System32\DriverStore\FileRepository目录到Vista系统的相对位子,重新启动OK.

(如果不行,打开设备查看器管理器重新查找驱动就行了.)

天天在论坛上看贴,今天终于发帖了!!

大侠不要骂我...

一、篇题讲解

读太阳篇我们首先要看这个篇题,就像读书首先要读书名一样。这个习惯大家应该
养成,特别是一些需要精读的书,那是一个字也不能放过。读经典必须弄清三义,即字
义、句义、总义。三义清楚了,没有读不懂的经典。我们首先从总义的角度来看这个篇
题:”辨太阳病脉证并治”,它讲的是什么内容呢?它主要讨论辨别与判断与太阳相关的
病名、病机、脉、证及其相关的治疗这样一个问题。透过这样一个题目的分析,我们就
能把握中医的一些性质。现在有一种思潮,认为中医只讲辨证不讲辨病,或者详于辨证
略于辨病,所以,要与西医相结合,要辨病加上辨证。对于持这样一个看法的人,我常
常说他们根本没有读过《伤寒论》,不能算是中医说的话。你读过《伤寒论》你就知道,
中医怎么不辨病呢?中医首先是辨病然后才是辨证。辨病是首位,辨证是次位。你不首
先确定是太阳病,你怎么去进一步肯定它是中风还是伤寒。所以,说中医没有辨病,那
是个天大的误解。

2.太阳释

(1)太阳本义 太阳有些什么意义呢?我们先来看它的本义,就是原来的意,这个
意我们通称为日。将日通称为太阳,或者将太阳通称为日,这都是大家知道的。其次就
是《灵枢·九针十二原》说的”阳中之太阳,心也”,这里把心喻作太阳,为什么呢?张
介宾说:”心为阳中之阳,故曰太阳。”太阳从它的内涵去看,也就是阳气很盛大之义,
所以,王冰说:”阳气盛大,故曰太阳。”

(2)太阳经义 以往研究《伤寒论》的人,有的认为六经就是讲经络,有的认为除
了经络还有藏府,有的认为六经是讲界面,这就告诉我们,六经的概念内涵很丰富,它
不是一个方面,它是多方面的。这里我们只从经络的角度看看太阳的意义。太阳的经络
有手足太阳经,特别是足太阳经非常重要,这一点我们在前面已经强调过。足太阳具有
什么特色呢?足太阳起于睛明,上额交巅,然后下项夹脊,行于背后,沿着人的身后、
腿后,最后到达至阴。我们比较十二正经,足太阳是最长的一条。它的分布区域在十二
经中是最长最广的,特别是布局于整个身后这一点非常有意义。大家也许有过这样的经
验,特别是对风比较敏感的人,如果风从前面吹来,你会觉得无所谓,要是风从后面吹
来,你会马上不舒服。为什么呢?明枪易躲,暗箭难防。《内经》一再强调”圣人避风如
避矢石”,所以,对这个风大家不要小看了。在《内经》的时代,能够远距离,并且在不
知不觉中伤人的有什么呢?就是这个矢石。而矢石从前面发过来,你还容易察觉,容易
躲过去,如果矢石从后面打来,那就不容易躲过了。有几个人真能像金庸小说里写的,
脑后生目,辨器听声呢?圣人把风比作矢石,可见风对于人体的危害之大。而前面来的
风我们容易察觉,后面来的风就比较困难了。这个风从后面来,偷偷摸摸的,所以,又
叫贼风。人体靠什么对付从后而来的贼风呢?这就要靠太阳。太阳居后的意义正在于此。
前人把太阳比作六经藩篱,就与太阳居后有很大的关系,并不是说太阳经的位置最浅表。
对于经络循行的这样一些部位,大家要很留心,伤寒的六经辨证有很大一部分与这个相
关。病人的腿痛,或者其他的什么地方痛,你要问得很具体,不是光问一个腿痛就了事,
是前面痛还是后面痛?是外侧痛还是内侧痛?如果是后面痛,胋窝的地方痛,那肯定与
太阳有关,你要从太阳去考虑它的治疗,这就很自然地把你带入了六经辨证。所以,要
学好伤寒,弄清楚经络的意义是很重要的。

(3)太阳府义 太阳府有足太阳膀胱府,手太阳小肠府。”膀胱者,州都之官,津
液藏焉,气化则能出矣。”所以,膀胱是津液之府,是水府。那么,这样一个水府为什么
要跟太阳相连呢?这个连接正好昭示了水与气化的密切关系。一个水、一个气化,太阳
篇的许多内容都与这个相关。另外就是手太阳小肠府,小肠府与太阳篇的关系虽然没有
膀胱那么直接,但是,它的内涵值得在此一提。《素问·灵兰秘典论》云:”小肠者,受
盛之官,化物出焉。”对于这个”受盛”,王冰解释说:”承奉胃司,受盛糟粕,受已复化,
传入大肠,故云受盛之官,化物出焉。”而张介宾则云:”小肠居胃之下,受盛胃中水谷
而分清浊,水液由此而渗于前,糟粕由此而归于后,脾气化而上升,小肠化而下降,故
曰化物出焉。”以上王张的两个解释,都将”受盛”作复词看,这个看法未必恰当。因为受
即承纳、接受之义,已经具备了上述的复词意义,盛呢?《说文》云:”黍稷在器中以祀
者也。”故盛的本义原非盛受,而是置于器中以备祭祀用的谷物。”盛”是用来作祭祀用的,
王冰把受盛释作”受盛糟粕”,而张介宾虽然未全作糟粕讲,可是也有糟粕的成分,这怎
么可能呢?古人祭祀所用,必是精挑细选的上好佳品,怎么可能是糟粕?因此,王张的
这个解释值得怀疑。盛为祭祀用的精细谷物,这与小肠接纳经胃熟化、细化的水谷甚为
相合。另外一个方面,盛是作祭祀供奉用的,在这里小肠承纳的”盛”用于供奉什么呢?
当然是供奉五藏,因为五藏乃藏神之所。用水谷之精微来营养藏神的五藏,这不就是一
种祭祀供奉吗?这样的解释才基本符合”受盛之官”的涵义。从这个涵义我们看到,古人
若不知道小肠是吸收营养的主要场所,决不会用”受盛”这个词。

(4)太阳运气义 谈过了太阳的本义、经义、府义,下面来看太阳在运气方面的意
义。在运气里,太阳在天为寒,在地为水,合起来就是太阳寒水。太阳为阳中之阳,为
什么要与寒水相配呢?我们可以从以下这些方面来思考。

①水义释 有关水的意义,我想大家应该很熟悉。水对于我们日常生活是一天也不
能缺少的东西,水是生命过程不可缺少的一个重要因素,也是生命最重要的组成部分。
我们男的称起来有100 多斤,女的有90 多斤,但主要的东西是什么呢?是水。大家还可
以打开世界地图看一看,占绝大多数的是什么?依然是水,陆地只占很少的一部分。老
子说”人法地”,所以,我们人身也是这样,水占绝大部分。从这个组成,从我们的生活
经验,水的重要性可以很容易地感受到。二十多年前,唐山发生大地震,死的人有几十
万,可是有的人被埋十来日竟又奇迹般的活过来,为什么呢?就是因为有水。所以,一
个人一个星期不吃东西是没有问题的,但是不能没有水。西医的看法也是这样,病重了,
他最关心的是什么呢?还是这个水。小便量多少?液体量多少?水电解质平不平衡?总
之,水对生命来说,它的重要再怎么形容也不过分。再举一个简单的例子,我们要过生
活,那你看看这个”活”字怎么来?没有水(氵),活得了吗?所以,要活下来,就必须得
靠水。水作为生命的要素,它还有另外一个更重要的层面,这个层面我们可以通过易卦
来体悟。易卦里代表水的叫坎(聏)卦,水本来是最阴的东西,用卦象来代表这样一个
东西应该都用阴爻,可是我们看一看坎卦却并不是这样,它是阴中挟阳,这就构成了水
的一个最重要的要素。有了这个阳,这个水就是真正的活水,就能为生命所用。没有这
样的一个阳,这个水是死水一潭,死水对生命有用处吗?没有用处!李白有一首著名的
诗,叫《将进酒》,其中有两句这样写道:”君不见黄河之水天上来,奔流到海不复还。”
华中理工大学校长杨淑子教授在看到李白的另一首诗”日照香炉生紫烟”时,从现代科学
方面作了许多有启示的联系。那么,作为一个中医,我们看到李白的这首《将进洒》会
不会有所感受,会不会问个为什么?黄河之水为什么会从天上来?天上哪来的水呢?这
就存在一个”搬运”的过程,肯定有一个东西将水搬运到了天上,这个东西就是阳,就是
太阳。《内经》讲”地气上为云”,就是指的这个过程。地气怎么上为云呢?阴的东西它总
是往下沉的,我们读读《尚书·洪范》的五行就知道:木曰曲直,火曰炎上,土曰稼穑,
金曰从革,水曰润下。水总是往下的,人往高处走,水往低处流,你做一个简单的试验
就会知道,泼出一碗水,看它往上升还是往下走。所以,水要往上升,要成为云,就必
须借助阳气,就必须借助火。因此,水要成为活水,要能循环起来,运动起来,要能真
正为生命所用,它就必须借助阳气的作用。坎卦中爻为什么不用阴爻而用阳爻呢?道理
就在这里。从坎卦的情况我们了解到,易卦揭示事物是从很深的层面去揭示,这就告诉
我们要想弄通中医的理论,易的学问不能不稍加留意。

②寒义释 按照常理,这个水被阳气蒸动起来了,就应该越蒸越上,蒸蒸日上嘛,
但它为什么又会降下来?这里有一个什么因素呢?水被蒸动因阳而上,当到达一定的高
度以后,就会遇到一个重要的因素—寒。不是有”高处不胜寒”的诗句吗?高的地方很寒
冷,你到西部高原,看看超过海拔几千米的高山,即便是盛夏时节,山脚下郁郁葱葱,
而山顶上却白雪皑皑,你会真正感受到高处不胜寒。水被阳蒸成为气,当这个气遇到高
处的寒,就又复凝结为 水。高处的水越凝越多,当达到一定的重力,再加上其他的一些
因素作用,它就会重新降下来,这就是《内经》所说的”天气下为雨”的过程。可见这个
黄河之水确实是从天上来的。可是天上的水又从哪里来?这一点李白没有作交代,但是,
我们学中医的却应该清楚这一点。上述这个过程,一个上蒸,一个下降,一个下降,一
个上蒸,水就变成活水,就”自有源头活水来”。这个水对生命的意义很大,大家想想,
靠我们人工来灌溉的植物有多少呢?就整个植物界而言,这只是很少的一部分,大部分
要靠老天来灌溉。靠老天,如果没有太阳,没有上面这些因素参与,行吗?不行!水循
环不起来,万物利用不了,再多的水也等于零。所以,这个过程,一上一下,太阳起什
么作用?寒起什么作用?水起什么作用?太阳、寒、水实在地讲一个都不能少,一环扣
一环,少了任何一个,水都循环不起来。前面我们讲”活”离不开水,是从静的层面来讲,
这里我们再要讨论”活”,就得从动的层面入手了。所以,太阳寒水这样的搭配,有它很
深刻的含义。我们讨论太阳篇,如果从很深的层面去讨论,它实际上就是讲的这个水的
循环过程。这个循环过程在任何一个地方卡住了,就成为太阳病。有些时候是在上升的
过程中卡住了,有些时候是在下降的过程中卡住了,所以,太阳篇里讲经证、府证。如
我们用麻桂二方治疗太阳经证,就是因为在蒸腾上升的这个过程出了障碍,地气不能上
为云,所以,我们要用发汗的方法,通过发汗,使汗从皮毛而出,那这个上升的障碍就
消除了。水到天上以后,又要云变为雨,这个过程是下降的过程,这个过程障碍了往往
就是府证,我们要用五苓散来解决。五苓散是太阳篇很重要的方,张仲景主要用它治疗
蓄水,治疗消渴。五苓散为什么能治消渴?它里面没有一样养阴药,没有一样生津药,
它用的是白术、茯苓、泽泻、猪苓、桂枝,反而有桂枝这样的辛温药,没有一样生津药,
它怎么能够治疗口渴?这个似乎不容易想通,不但你们不通,我也不通。但是,如果你
把它放到太阳里,放到自然里,放到水的循环里,这个疑惑就很容易解决。地气上为云
了,还要天气下为雨,如果天气不下而为雨,那大地就会出现干旱,这个事实大家都是
经历过的。那这个大地干旱在人身上是什么反应呢?地为土,脾主土,开窍于口,所以,
这个”干旱”首先就会出现在口上,就会有消渴。五苓散能使天气下为雨,解决这个下降
过程的障碍,那当然能治渴了。老子讲:”人法地,地法天,天法道,道法自然。”我们
从五苓散为什么能治渴这样一个问题的解决,应该对老子的这段话有所感悟。道法自然
是老子讲的最高境界,入到这个境界,你看什么问题都一目了然。学中医的应该很好地
领悟老子的这个窍诀。这个窍诀领悟好了,中医在你眼里是满目青山,清清楚楚,明明
白白。如果这个窍诀一点没有把握,你不”道法自然”,只是”道法现代”,那中医在你那
里,也许就会是”泥牛入海”。整个太阳篇实际上都是讲这样一个问题,大家慢慢地去体
味,这个过程很有意思。不管是麻黄汤、桂枝汤、五苓散,还是大青龙、小青龙、越婢
汤,这些方都是在讲水。所以,我给太阳篇总结了一句话:治太阳就是治水。治水就要
做大禹,不要做鲧!以上是太阳的大体涵义。

二、临证察机

《皇汉医学》讲的”临证察机,使药要和”,可简称为”察机药和”。察机实际上就是
求本,”察机药和”就是治病求本。机是病机,病是疾病,那么机呢?这个问题我们前面
已经讨论过,机就是导致事物发生的关键要素。现在政要所在的地方为什么又称机关呢?
当地要发展,看什么呢?就看那栋楼!因为它是党政机关所在。所以病机就是导致疾病
发生的那个最关键的因素。这与病理变化这个面显然有很大的区别。原子弹的威力大不
大?当然很大。可是这个启动按钮没必要搞得那么大,一点就行了。病机实际上就是这
么一回事。

1.何以察机

病机的概念出自《素问》的”至真要大论”里。至,是至高无上;真,不是假的;要,
重要。最真实不虚的,最重要的论述就在这一篇里。我们从病机放在这一篇,而不放在
其他篇,就可以看出它确实是一个关键的因素。”至真要大论”在具体讲述病机前,有黄
帝的一段引子:”夫百病之生也,皆生于风寒暑湿燥火,以之化之变也。经言盛者泻之,
虚者补之,余锡以方士,而方士用之尚未能十全,余欲令要道必行,桴鼓相应,犹拔刺
雪污,工巧神圣,可得闻乎?”黄帝在这段引子中讲到了百病产生的原因都离不开风寒暑
湿燥火,然后在这个原因的基础上再产生其他的变化。虽然,我们看病的时候,也许看
到的是这个变化后的疾病,好像它没有风寒暑湿,好像它没有”外感”,但是,这个最根
本的原因大家不能忘记,不能含糊。所以,黄帝在这里说得很肯定。接下来黄帝又说,
经典里明明说了,”盛者泻之,虚者补之”,可是我把这个方法告诉医生,医生在临床上
用起来效果并不十分满意,疗效还达不到百分之百。我想把这样一个最真实不虚,最最
重要的医道真正地流传下去,使医生能很快地把握它,用它来治病就好像拔刺雪污一样。
临床治病究竟能不能像拔刺一样,像雪污一样,立竿见影,手到病除呢?是不是真有这
样的方法?岐伯回答说:有!有这个方法,”审察病机,勿失气宜,此之谓也”。就这么
一句话,你看病机多重要。审察好了,把握好了,治起疾病来就会像拔刺一样,就会像
雪污一样,就这么简单。可是如果没有把握好,治起疾病来就没有办法做到这一点,临
床就没有办法达到百分之百的疗效。那么,怎么样才能审察好病机呢?审察病机很关键
的一点就是”勿失气宜”,要抓住”气宜”。这个提法在”至真要大论”里有两处,另一处说”
谨候气宜,勿失病机”。可见两句话是互相关联的。实在地说,病机就是气宜,气宜就是
病机,这两者讲的是一回事。那气宜是什么呢?就是前面讲的”风寒湿暑燥火”,就是六
气,就是与六气相关的这些因素。审察病机,要勿失气宜,那么这个气宜怎么求呢?比
如现在天阴了,要下雨了,这个气宜我们知道不知道?知道!这是湿来了。我们可以直
接感受这个气宜的变化,在这个时候产生的疾病,不管它是什么病,都与这个气宜有关,
抓住了这一点,不失去这一点,那你就抓住了病机。如果天气突然转冷,北风来了,这
就是寒的气宜。上面这个气宜,我们可以很明显地感受到,这个气宜叫做外气宜,或者
叫做显气宜。那么,还有另外一些我们不容易觉察出来的,那当然就叫做内气宜。或者
叫隐气宜。这个气宜可以通过舌脉来体察。除此之外,是不是还有一个更加便于我们了
解气宜的方法呢?实际上,整个《素问》的七篇大论就是讲的这个问题,这就要涉及运
气这门专门的学问。在《素问》的第九篇”六节藏象论”里,有这样一段话:”不知年之所
加,气之盛衰,虚实之所起,不可以为工。”这句话讲得非常严重。不可以为工是什么呢?
就是不可以当医生。现在大家可以问问自己,你知道年之所加吗?不知道!可是不知道
你还是在当医生,你还是要为工,这就是当今中医界的现状。年之所加,气之盛衰,虚
实之所起,这就要谈到运气的问题。今年是庚辰年,那今年的年之所加是什么呢?庚本
属金,而运气的干支讲化合,乙庚化金,所以,今年的年运是金运。年运确定以后,还
要根据地支定出年气,今岁地支为辰,辰为太阳寒水司天,太阴湿土在泉。一个金运太
过,一个寒水司天,一个湿土在泉,这就是今岁气宜的大框架。再详细一些的气宜,就
要看主客加临,气有气的主客加临,运有运的主客加临。气分六步,运分五步,这就是
五运六气的大体情况。我们临证求气宜,很大的一个方面就是要从这里面求。比如现在,
现在已步入小雪节,是六气里面最后的一个气,也是五运里面最后的一个运。这时的主
气是太阳寒水,客气是太阴湿土。凡是在这个区间患的病,不管你是什么病,都与以上
这些气宜的综合作用相关。审察病机要考虑这些因素,治疗疾病也要考虑这些因素。这
些因素不但会导致外感病,也会影响内伤病。因此,气宜不但外感病要求,内伤病也要
求。懂得了气宜,懂得了上述气宜的综合作用,你就懂得了”年之所加,气之盛衰,虚实
之所起”,你就可以为工。就是因为这一步,做医生的路就变得海阔天空,所以,运气这
门学问很重要。南宁有一位名医叫曾邕生,也是我的一位师父,他就是整天研究这个”
年之所加,虚实之所起”。早些年他自己开门诊,每天都要看一二百病人,多的时候看到
三百多。单号看农村的,双号看城里的。一个人怎么能看这么多的病人?就是因为他知
道这个”年之所加,气之盛衰,虚实之所起”。气宜清楚了,再一对照病人,病机就容易
带出来,病机一出来,方药也就跟着出来。所以,病既看得快,也看得好。所以,病机
的关键是气宜,而要抓住气宜,就要知道年之所加。

2.十九病机

知道了病机与气宜的这个关系,黄帝接着问:”愿闻病机如何?”岐伯说:”诸风掉眩,
皆属于肝。诸寒收引,皆属于肾⋯⋯”像这样的病机,岐伯一共回答了十九条,这就是著
名的十九病机。我对十九病机的研究虽说不上很深,但已隐隐约约地感受到它的重要性。
可是,现在研究它的人很少,像《中基》的病机篇,本来应该以这个十九病机为核心,
可现在连提都很少提到它。这是什么原因呢?当然,是对它的重要性认识不够。以为天
下的疾病那么多,那么错综复杂,怎么可以就用这简单的十九条病机加以概括、加以说
明呢?十九条病机能不能作如上的概括、如上的说明呢?这个回答是肯定的!岐伯在这
里用了一个”诸”和”皆”,这就是一个肯定的说法。凡是”风”,凡是”掉眩”,必定与肝有
关系,你就从这个肝去找,一定能找到病机,一定能够找到导致这个疾病发生的关键因
素。这一点,岐伯已经给你打了包票。以此类推,”诸痛痒疮,皆属于心”。凡是疼痛、
痒、疮的一类证候,必定与心有关,你可以从心去寻找问题,至于怎么寻找,我们下面
还要谈到。在岐伯陈述完这个十九病机后,他也考虑到了黄帝可能也会有类似我们一样
的疑问。为了进一步地消除这些疑惑,岐伯接着引述了《大要》的一段话:”谨守病机,
各司其属,有者求之,无者求之,盛者责之,虚者责之,必先五胜,疏其血气,令其条
达,而致和平。”病机要谨守,不要怀疑,这一点很肯定,不容含糊。要各司其属,各就
各位。风掉眩,不管你是什么风掉眩,都一定要找肝。怎么找呢?这就要落实到”有者求
之,无者求之,盛者责之,虚者责之,必先五胜”这个原则上来。比如刚刚说的风掉眩,
我们看到一个掉眩病,一个眩晕病,它肯定属于肝,这个没问题。病人一来,我们看到
他一副肝病的模样,脸色青青,脉又弦,肝的色脉非常明显,这个就叫”有”。有者求之,
这一点比较容易做到,因为它很直接。但是,如果没有呢?我们看到这个眩晕的病人,
脸色也不青,脉也不弦,一点肝家的色脉都没有,这怎么办呢?这种情况就叫”无”,无
者也要求之,反正它与肝有关系,这是病机规定的前提。那怎么求呢?这就要根据”必先
五胜”的原则。五胜是什么意思呢?就是要根据五行之间的关系去求它。明明是眩,肯定
属肝,为什么见不到肝的色脉?这个问题你要考虑,为什么会产生这个”无”?上面这个
原则就是告诉我们用一个很方便的方法来找出这个原因,这个方法就是以肝为中心,利
用五行生克的原则去考察。比如上面这个例子,你没有看到肝的色脉,你看到的是肾很
虚的表现,那么,你应该知道这是因为肾水很虚,母不生子而导致了这个”没有”。所以,
治疗就应该补母生子,用补肾的方法,这个眩晕就会好。如果肾的情况也没有,那就继
续看,看看有没有肺的情况?如果有,那还要看一看盛虚。如果是肺家盛,金太过,那
肝木就必遭克损,这个时候泄其太过,使木不遭克损,那疾病就自然会痊愈。如果是肺
虚金不及呢?那就要用佐金平木的方法。如果还不行,再看看心怎么样?脾怎么样?心
虚则子盗母气,心实则火旺克金,金不制木,这时把心火一泄,病就没了。有时又可能
是土的毛病造成的,土虚亦不能育木。从上述这个过程我们可以看到,病机的方便在于
它把这个中心坐标确定了,你根据这个中心点去搜寻,根据五胜的原则,生克的原则去
找,这就有了目标。这就比你漫无边际地去寻找要好得多,大家看是不是这样?所以,
这样的一些原则很了不起,它把一切疾病最关键的东西告诉我们了,这就是病机!导致
风、导致掉、导致眩的最最关键的因素就是肝,它告诉你了。大家想一想,这在过去是
什么?是秘诀,是窍门,是宝贝啊!可是我们拿着这样的宝贝却不当一回事,甚至拿着
金盆当尿壶,难怪古人说:传非其人,漫泄天宝。对于上面这样一种病机辨证方法现在
很少有人去研究,去关心,我打算在这方面做深入地研究,也希望大家多研究。古时候
不是有治肝三十法吗,清代名医王旭高就专门有一个”治肝三十六法”,这”三十六法”怎
么来?就从这儿来。还有所谓隔一、隔二、隔三、隔四的治法,明明是这一脏的病,他
不治这一脏,而治另一脏。用药平平淡淡,根本看不出有一味治肝的药,却把肝病治好
了。你拼命去平肝熄风,用羚羊钩藤汤、龙胆泻肝汤,治来治去没有作用。为什么呢?
你没有真正搞清楚,你只知道”对病欲愈,执方欲加”,你只知道”诸风掉眩,皆属于肝”,
却不知道还有一个”有者求之,无者求之,盛者责之,虚者责之”,却不知道还有一个”
必先五胜”的原则,却不知道”见肝之病,知肝传脾,当先实脾”,那你当然只有”守株待
兔”当下工了。所以,病机里面变化的花样很多,但是,万变不离其宗。我们利用《大要》
给出的这些原则,围绕这个”宗”去寻找,就一定能够找出疾病的症结。这里我只将大体
的思路提供出来,希望大家沿着这个思路去研究,并且在临床上加以应用。上面举例谈
到了十九病机,也把运气的基本情况给大家谈了,我想这个感受应该比较深。现在过了
小雪,我们感受到了什么气宜呢?很潮湿,人昏昏沉沉的,感冒的人特别多。这个感冒
与以往的感冒不同,如果不知年之所加,不明运气,治疗这样的感冒多少会碰壁。现在
是寒湿当令,而且湿特别重,有点像春天,只有春天才这样潮湿。前几天看过三个病人,
一个是上腭的恶性肿瘤,一个是坐骨神经痛,一个是胃痛,三个病人我都用的同一张方,
就是《和剂局方》的五积散,结果除恶性肿瘤的这一例因特殊的原因没能服药以外,其
余两例都有不错的效果。三病不同而治同,这叫作”异病同治”。其实,既然治同,那肯
定有相同的因素,这个因素就是气宜。因此,气宜把握好了,病机就容易审察清楚,病
机清楚了,治疗的方案就很容易制定出来。这实在是临床上一个很方便的法门。上述这
例恶性肿瘤的病人年纪只有26 岁,看上去气色很差,自觉症状不多,只有头胀,微咳(已
肺部转移)。切脉右弦滑,尺涩,左脉沉细,不耐按。舌淡暗,苔白水滑。像这样一个病
人我们怎么去思考呢?再一看他前面服用的药,都是大量的半枝莲,白花蛇舌草。所以,
我首先给他一个建议,就是马上停用这些药物。半枝莲、白花蛇舌草这些都是清热的药,
如果真是热毒结聚的肿瘤,那当然用之无疑,用后确实会产生抗癌作用。但,如果是寒
湿凝结的肿瘤,像上述这例病人,那再用清热的药就等于助纣为虐了。碰到癌症病人你
就想到要用半枝莲,你就想到要抗癌,那你在走”对病欲愈”这条路,你是西医,不是中
医。中医就要讲辨证,有是证才用是方。《内经》讲:寒者热之,热者寒之。这是必须遵
循的原则。如果是寒性的病,就应该用温热药,不管你是肿瘤还是什么。上述这个病人
初次发作是在1994 年,1994 年是甲戌年,甲为土运太过,戌为太阳寒水司天,太阴湿
土在泉。这样一个肿瘤病人,你很难说清他是那一天发病,他的发病界限你很难像感冒
那样用天来界定。所以,这个年的框架就显得非常重要。我们知道1994 年的”年之所加,
气之盛衰”主要是寒湿为盛,尤其是湿为盛,他这个病为什么不在1993 年发作?也许1993
年这个癌肿已经在孕养。它为什么一定要在1994 年爆发出来?可以肯定,1994 年这样
一个年运,它的六气变化对这个肿瘤的发作很有帮助,是这例肿瘤爆发的助缘,所以,
它就在这样一个特殊的年运里引发出来。我们再看今年,今年是庚辰年,司天在泉同样
是寒水湿土,这就给了我们一个提示,这个病跟寒湿有关。说明寒湿这样一个气肯定对
他的内环境不利,对他的免疫系统不利,相反的,对这个肿瘤很有帮助。大家想一想,
这个”年之所加”重不重要呢?确实很重要。如果再参照舌脉,舌脉也跟这个相应,那病
机就肯定了。所以,这个病你别管它是什么,你就从寒从湿去治疗,去掉这样一些对肿
瘤有利的因素,去掉这样一些对机体不利的因素,即便它不好,至少也不会助纣为虐。
在讨论病机的开始,黄帝就提出这样一个问题:”夫百病之生也,皆生于风寒暑湿燥火,
以之化之变也。”这里提的是百病,就是众多的疾病都受这个因素影响,没有说肿瘤例外。
肿瘤也好,其他疾病也好,都受这个大环境的影响,都受这个六气综合因素的影响。你
只要弄清楚这个因素,然后设法阻断它,改变它,那显然会对这个病的转归产生有利的
影响。从这个角度去看,为什么五积散不能抗癌呢?五积散一样能抗癌!但是,大家就
不要用它去做课题、搞实验,作出来也许没有结果。这样很多人又会对中医失望,说中
医不科学,不能普适,不能重复。其实,不是中医不能普适,不能重复,而是你的这个
做法根本不可能重复。五积散针对的是寒湿这样一个因素,对于寒湿,五积散是普适的,
是可以重复的,如果你用它对付其他的因素,这个怎么能普适?怎么能重复?就像抗菌
素它只能对细菌普适,现在你要它对病毒也普适,这个可能吗?可是现在中医的科研就
是这么一个情况,拿着抗菌素去治病毒,治不好,反而怪抗菌素不好。自己错了,反而
怪别人,天下哪有这样的道理。现在大家看杂志,看到最多的一类文章就是用某某方或
某某法治疗某某病多少例。这个例数不能少,少了做不了统计处理,而说实在话,临床
哪有这么多同类因素引起的同一种病呢?没有怎么办?那只有让风马牛也相及。这样的
做法,这样的研究态度,着实令人堪忧。而我们的科研部门,我们的杂志所制定的这些
政策,却对上述的歪风起到了推波助澜的作用。病机这门学问是中医的大学问,前面我
们只略说了”诸风掉眩”这一条,那么,还有”诸痛痒疮,皆属于心”,”诸湿肿满,皆属于
脾”,”诸暴强直,皆属于风”呢?这些也是一样,大家可以用同样的方法去逐条地剖析。
反正这个前提它给你定死了,把这个前提作为中心,围绕这个中心,按照上述这些原则
去搜寻,就一定能够查出实据。等到你将十九病机烂熟于胸,将搜求的方法烂熟于胸,
你去治病就会左右逢源。

3.抓主证,识病机

临证何以察机,以上的这些方面非常重要,这些都是经典的教证。其次的一个方面
就是”抓主证”,抓主证是刘渡舟教授提出来的。刘老是伤寒界的权威,人称北刘南陈,
这个”北刘”就指的刘渡舟,”南陈”则指我的导师陈亦人教授。刘渡舟教授有部书叫《伤
寒论十四讲》,这部书的篇幅虽然不大,但,讲的都是刘老的经验。这部书的最后一讲,
就是这个抓主证问题。刘老认为抓主证反映了辨证论治的最高水平,因此,能否抓好主
证,就成了临证的一个关键问题。为什么抓主证那么重要?我的理解有两个,其一,是
主证最能反映致病的机要,也就是最能反映病机,而只有这个能够反映病机的证能称为
主证;其二,是主证最有可能反映疾病的祛除途径,它提示你,你应该用汗法、下法还
是吐法,或者用其他的方法。这样的主证往往起到画龙点睛的作用,根据这个证你就能
辨别该从哪个方向着手。主证应该具备这两个基本特点。为什么要在《伤寒论十四讲》
里提出这样的一个问题呢?很显然,张仲景的每个条文,他所描述的这些证,很多就是
主证。你看他的条文很多都非常简单,如155 条:”心下痞,而复恶寒汗出者,附子泻心
汤主之。”301 条:”少阴病,始得之,反恶热,脉沉者,麻黄细辛附子汤主之。”也就是
说《伤寒论》的条文实际上就贯穿着一个主证问题。下面举一个病例,三四年前,江南
无线电厂的一位女工找我看病,西医的诊断是肾结石、肾积水,病情比较重,中西医都
看过,但是,效果不显。经一位老病友的介绍到我这里来就诊,按照常规,结石、积水
就要排石利水,但是,我首先没有考虑这些,而是静静地听病人讲诉病情,一边听一边
思考,其实就是为了抓主证。当病人讲到这一个月都在拉肚子,心很烦躁,睡觉也睡不
好时,就是这一刹那,我把主证抓住了。我给她开了猪苓汤原方,没有加什么排石药。
为什么开猪苓汤?因为319 条说得很清楚:”少阴病,下利六七日,咳而呕渴,心烦不得
眠者,猪苓汤主之。”这里很明确地讲到,下利然后又有心烦不得眠的,就可以用猪苓汤。
而这个病人兼而有之,这就使你很快考虑到这个上面来。你不必管它是结石还是积水,
它的主证符合猪苓汤,你就用猪苓汤。药开好后,病人走了,从此再没有回来复诊。大
概过了半年多,她又介绍另一位病人来找我,从这个病人的口里,才知道服药以后症状
很快消失,不到半个月再作检查,结石没啦,积水也消除了。这例病案给我的感受很深,
使我隐隐约约地揣摸到了刘老”抓主证”的涵义。上过临床的人都知道,有些病人的病情
是非常复杂的,特别是一些上年纪的人,她可以给你诉说半天的病情,等到后面的讲完
了,前面的也忘记了。对于这类病人,你更要抓主证,你要静静地听,那么多的东西中,
总是有一句话或一个证或一个脉对你有启发,这个就是主证。前些天我看一位同学的母
亲,她的主要情况就是感冒发烧,反反复复已经十来天,还是没有解决。感冒发烧在伤
寒来说,应该属于太阳病。太阳病不管你是什么原因引起,脉都应该浮。可是这位病人
的脉却很沉,表证而现沉脉,这就是反常,这就是一个关键点,这个就是主证。说明她
是太少两感,用一般感冒的药对她肯定没有好处。我给她开了两剂麻黄细辛附子汤,服
汤以后,烧很快就退了。所以,临床治病,只要主证抓得好,确实可以效如桴鼓。那么,
如何才能抓好主证呢?这一方面是经验,另外就是要注意三点,这里有六个字送给大家。
第一,明理。比如少阴病始得之,反发热,脉沉者,为什么会出现这样的情况,出现这
样的情况为什么要用麻黄细辛附子汤,这个道理你必须搞清楚,道理清楚了,你才能举
一反三地运用在其他方面,这才有灵活可言;第二,熟记。为什么我们一再强调学伤寒
应该背诵呢?如果你想当一个好中医,不背不行。即便不能一字不漏的背,起码对条文
你应该熟悉,特别是有方有证的条文,你必须熟悉,任何时候都能想起它大概说什么。
只有做到这一点,《伤寒论》你才能真正用起来。不熟悉条文,临证怎么抓主证?主证抓
不住,经方用起来就不灵;第三,多用。学以致用,我们学过太阳篇,就要你看看我,
我看看你,看看有没有太阳证。老是躲在深闺不识人,那起不到作用。如果自己感冒了,
你要辨一辨,看到底是太阳还是少阳还是太少两感。学中医的人,特别是学过《伤寒论》
以后,碰到感冒还是复方感冒灵,还是Vc 银翘,那你白学了,你恐怕永远是下工。应该
记住,不管是什么病,你都要凭脉辨证,有这样的脉证才用这样的方法,也就是要有的
放矢。这就是我要给大家谈的治病法要。大家应该牢牢记住,上工是一个怎样的概念,
下工是一个怎样的概念。虽然,我们不能马上成为上工,但,既定的目标应该有。大家
应该处处注意养成上工的习惯,处处注意避免下工的行为。不要这个肿瘤病来了,你就
满脑子想的白花蛇舌草、半枝莲这些抗癌药,我想这个不是中医,充其量是半吊子中医。
既然是中医,你就要有中医的思路,你就要临证察机。也只有这样,你才容易有体会,
你才容易有感受。否则,这个病人治好了,你不知道是怎么治好的,治差了你也不知道
怎么回事,当了一辈子中医自己还是糊涂虫,岂不可怜!要是这样做中医,那真的没意
思。所以,希望大家都能成为上工,至少成一个准上工。我想只要按照我们上面的这些
方法去操作,我们在形式上就已经成为上工了。在正式进入太阳篇的讨论前,这个引导
过程是很有必要的。

在正式地进入太阳篇前,我们要讨论”治病法要”这样一个问题。只有这个问题清楚
了、把握了,做医生才有一个依靠处。

一、医者的两个层次

陈存仁编辑有一套日本人写的很著名的丛书,叫做《皇汉医学》。《皇汉医学》里讲
到一个”医诫十则”,就是做医生很需要注意的十个问题。十诫中有一诫我的印象最深,
记得这是师父十多年前给我讲的。先师给我讲的许多问题都已经忘记,可是这一诫我记
忆犹新,因为它太重要了。十多年来,我一直是以这一诫来告诫自己、鞭策自己、要求
自己。现在就凭记忆把这一诫的内容转述给大家:”医有上工,有下工。对病欲愈,执方
欲加者,谓之下工。临证察机,使药要和者,谓之上工。夫察机要和者,似迂而反捷。
此贤者之所得,愚者之所失也。”我们看到这一诫里把医生分为上工、下工。上工这一类
也就是我们今天所说的高明医生,而下工这一类,就是很差劲的医生,就是庸医。作为
我们学医的人,在谈到这一诫时,就应该有所选择。我想大家应该是希望能在上工的行
列,如果没有这个信心,大家就不要学医。否则,一辈子下来,只做一个下工,一个庸
医,这有多凄凉。另外一点,做医生几乎没有中间路可走,你不是救人就是害人。你开
药,如果没有治疗作用,那就是毒副作用,中间的路很少,这是肯定的。所以,选择做
医生的路,大家应该很慎重。按照清代名医徐灵胎的话,做医生只有两条路,要么做苍
生大医,要么做含灵巨贼。

1.下工层次

什么是上工?什么是下工?它的评判标准是什么?这一诫从根本上,从源头上给我
们作了说明。”对病欲愈,执方欲加者,谓之下工。”这是什么意思?前些天我给医本的
同学上课,下课休息的时候,就有同学问我:我们家乡有一个朋友得甲状腺肿,老师您
看开个什么方?另外一个同学接着问我:老师,我最近经常失眠,您看开个什么方?现
在我们暂时放下上面的提问,先来考虑另一个问题。中医与西医在很多原则问题上应该
说是接近的,西医治疗一个甲状腺肿,不会马上想到割掉它,或者马上用什么消肿的药
物。它要通过一些手段或方法,得到一个诊断。甲状腺肿只是一个体征或症状,它还不
是诊断。它必须通过一系列手段和方法得出一个诊断,这个诊断是病因诊断。它是什么
原因导致甲状腺肿?是缺碘呢?还是甲状腺机能亢进?还是单纯性甲状腺肿瘤?或者会
是癌肿?这些都必须做相关的检查才能确定,或者做活检什么的。等到这个病因的判断
明确之后,才能提出相关的治疗方案。有人说西医光治标,这个说法我不同意,病因治
疗就是治本,只是这个”本”的层次不同而已。上面的同学告诉我一个甲状腺肿就要我开
方,这就等于省略了这许多的过程。中医与西医在这个总体原则上也是一样。我们说甲
状腺肿或者失眠,它只是一个”证”,而中医的特色是辨证论治,通过这个”证”来辨别疾
病的”因”,然后根据这个”因”来进行治疗。这也叫做辨证求因,审因论治。你现在只说
一个甲状腺肿、一个失眠,这个辨证论治的过程没有,这个诊断的过程没有,那怎么开
方?没法开方。根据上面这个认识,我们对后世提出的内科就会有一些不同的看法,它
有很多不合理的地方。比如,西医说肺结核,这是一个病,这是一个诊断,而这个诊断
已经包含了病因的判断。又比如类风湿性关节炎,红斑狼疮等,这些疾病的最终原因虽
然没有搞清楚,但是,这个病名已然包括有病因因素。而内科里面说”咳嗽”,说”胃痛”,
说”泻泄”,这些都是病。”咳嗽”、”胃痛”这些是什么东西呢?它只是一个症状,它完全
没有病因的成分,所以,西医要笑话中医,我觉得应该笑话。什么事情要模仿西医,都
应该经过严密的思考,没有经过严密的思考,盲目地去模仿,就容易搞成半吊子,两头
不到岸。当然,中医与西医在诊断上所采用的方法是大不相同的。西医有大量现代化的
手段可以借助,而且这些手段越来越先进。中医呢?什么也没有,都得靠自己。因此,
学中医要比学西医困难。学西医,整个世界的科技都在帮助你,现代物理学帮助你,现
代化学帮助你,现代生物学更加帮助你。而学中医没有人帮助你,相反都在为难你,给
你挑刺。所以要学好中医,特别是要在现代学好中医,那真是不容易。大家应该把这个
困难考虑进去,树立牢固的信心。上面提到,说一个失眠,说一个甲状腺肿就要处方,
这就是”对病欲愈,执方欲加”。很多人搞一辈子中医都是这样。听到甲亢,就开一个甲
亢的方,病人又说胃痛,加两味胃痛的,又说腰痛,再加两味对付腰痛的,现在的很多
中医就是这样看病。有些同学给我说,现在在医院里已经看不到中医了,心肌梗死就用
益气养阴,活血化瘀,已经形成套路了。当然有的病人可能会适合于益气养阴,但,这
个思路不对呀。心梗是西医的病名,由冠脉阻塞所致。中医怎么认识它呢?中医不一定
说它是心梗,你要”察色按脉,先别阴阳”,怎么就只有益气养阴,活血化瘀呢?这个与”
对病欲愈,执方欲加”有什么区别?这可是下工之所为啊。所以,我们一定要设法避免这
样的方法,走另外一条路。

2.上工层次

这一条路就是”临证察机,使药要和”。这个”机”是什么呢?这个”机”就是病机。临
证的时候,首先是要察明病机,然后再根据这个病机来处方,使方药与病机相契合,这
样一个看病的路子就是上工的路子。”临证察机,使药要和者,似迂而反捷”,这样的方
法迂不迂呀?确实好像有点迂。病人来了,还要察什么机。心梗的病人一来我就用益气
养阴、活血化瘀的协定方,这个很快呀,还察什么机。但,最后的结果呢?恐怕你那个
益气养阴、活血化瘀的结果赶不上。这就是”似迂而反捷”啊。见一个咽痛,你就清热利
咽,玄参、麦冬、桔梗、甘草,行不行呢?这样看起来快,看起来不”迂”,可实际的效
果怎么样呢?相信大家都会有经历。前些天看一个病人,咽喉痛、声音嘶哑,要用笔来
代口,浑身没力气,开什么方呢?光有这些还开不出方。你要是急着开什么山豆根、牛
蒡子,你就成下工了,因为你”对病欲愈,执方欲加”嘛。你还要”临证察机”,不要急着
用山豆根。当时,我为病人摸脉,发现两尺浮紧,紧属寒,浮是表,浮紧就是表寒,一
个典型的太阳伤寒证。太阳伤寒用什么方?用麻黄汤。再看看舌象,舌苔白腻,苔腻是
湿,所以病人浑身困倦乏力。于是我给她开了两剂麻黄汤加苍术。病人是晚上来诊的,
诊前已经输过几天抗生素,但丝毫未见效果。开药以后,当晚煎服。第二天上午给我电
话,咽痛十去七八,声音已经无碍,两剂尽后,诸证释然。大家想一想这个病例,明明
是咽喉肿痛,用压舌板一看,咽部充血几个”+”,扁桃体肿大,应该清热,应该利咽,应
该消肿,可你为什么偏偏不用这些,反而去”火上加油”呢?就是因为这个舌脉显示出病
机是表寒,所以,要用温散表寒的麻黄汤。温散药一下去,寒解了,咽喉果然就不痛。
这就是”临证察机,使药要和”。临床诊病就是这么一个过程。古人讲”必伏其所主而先其
所因”,就是这个意思。前段时间还看过一个女学生,也是咽喉肿痛。她的咽喉肿痛到什
么程度呢?三天两头要去吊针,要去打青霉素。人家油炸东西,她从那儿经过,咽喉就
要肿痛,就要化脓,更别说吃了。现在好啦,不但闻到没问题,吃下去也没问题了。咽
喉肿痛只是一个症状,不是诊断,没有理由就去用山豆根,就去用桔梗。你要获得一个
诊断,你的治疗是对诊断负责,而不是对病人说的某个症状负责。炎症好像两个火,如
果真的有火,那就应该清,用玄麦甘桔肯定好。火的表现是很明确的,你打开火看一看,
明明显显的,看得见是红的,摸起来烫手。人身的火证也是这样,它有它的指征。而我
看的这位学生,脸色青青的,唇淡、舌也淡,手冰冷,脉沉细。哪有一点火热的征象?
根据这个舌脉,根据这个四诊的材料,这个人根本不可能有火。可是你看看前面医生开
的,全是牛黄解毒、玄麦甘桔,都在清热利咽。看过这个病人,你就会明白,中医为什
么没有疗效?这个病人我始终都在用扶阳的方法,开始用归芪建中汤,后来用附子理中
汤。现在,不但咽喉不肿痛,体质也得到全面的改善。这个例子再一次告诉我们上工与
下工的路子,它的区别在哪里。”临证察机”这个路子看起来迂回了,走了弯路,可是最
后的结果却快捷得多,这正是”贤者之所得,愚者之所失也”。直接清热利咽,或者查查
药典,看哪味药治咽痛,哪味药有抗菌消炎作用,这样看起来似乎直接一些,快一些,
可实际呢?她按照这个路子搞了几年都没有搞好,从中学一直到大学还在吊针,还在吃
牛黄解毒。而在这里仅仅服药一个月,什么都解决了,至少基本解决了,哪一个更快呢?
所以,这是”贤者之所得,愚者之所失”。贤者之所以成为贤者,就是他按照这个方法去
做了;而愚者之所以成为愚者,是因为他没有按照这个方法去做,是因为他失去了”临证
察机”这个窍诀。我想大家从现在开始就应该希望做个贤者,不要做个愚者。而做个贤者
的办法就是”临证察机”。今后对每一个病人都要临证察机,开始察不对这没关系,但,
一定要履行这个手续,一定要朝着这个方向走。开始的准确性比较小,也许只有百分之
十,但,慢慢地就会增加到百分之二十、三十,到了八十、九十,十愈八九了,我们就
成了上工。大家应该具备这个信心,方法对了,只是时间问题。

4.伤寒传足不传手

这一节我们讨论阴阳的离合机制,讨论开合枢,从《素问·阴阳离合论》里我们可
以看到,它讲的是足三阴三阳,没有提手三阴三阳。而《灵枢·根结篇》里也谈到开合
枢的问题,它讲开合枢也是在足经里讲,讲手经它不提这个问题。再加上《素问·热论》
这样一篇论述”伤寒”的祖文,也是论足不论手,这就给后世的许多人产生一个误解,认
为伤寒传足不传手,温病传手不传足。大家都知道,中医很重要的一个观念是整体观念,
人与天地都是一个整体,天地的变化都会不时地影响人体,怎么可能手足之间不会产生
影响、不会相传呢?但是,《内经》、《伤寒》在谈到上述问题时,又的确是偏重在足的一
面,这是什么原因呢?要弄清这个问题,必须从以下几个方面来考虑。

第一,我们从文化的含义上谈,人是什么东西呢?人是万物之灵。所以,大家得到
这个人生着实不容易,应该真正做一些对自己、对人民有利益的事情。有些事做了对自
己有利,但,对国家对人民不一定有利,而医这个行当,只要你发心不邪,对人对己都
会有利。《素问》里常说”人禀天地之气生”,所以,考察人我们应该把他放到天地这个框
架里。有关天地,古人常把它与经纬联系起来谈,我们看《三国》就经常会碰到”经天纬
地”这个词。天以经言,地以纬言。经贯穿南北,连接上下,纬贯穿东西,连接左右。经
纬这个概念看上去很简单,可是我们是否可以透过这个简单的概念去思考一些与中医相
关的问题?大家想一想,人为什么叫万物之灵?在所有的动物中,除了人之外,其他的
都是爬行动物,它是横行的,只有人是直立动物。所以,从天地这个角度,从经纬这个
角度,人是沿经线走的,而其他动物是沿纬线走的。从禀气的多寡而言,当然人禀天气
最多,而余者禀天气较少。这是造就人成为万物之灵的重要因素。

第二,我们对干支的这个概念很熟悉,几乎每个人都知道天干地支。但是,大家想
过没有,为什么我们不可以叫地干天支呢?因为干是直立的,而长在干上的支是横行的,
所以,干象天而支象地。万物虽然都是长在地上,但是,这个地上的万物要很好的生长
却离不开天,离不开太阳。文化大革命时期我们经常唱一首红歌,”大海航行靠舵手,万
物生长靠太阳”,就说明了这个意思。花叶果实虽然都长在树枝(支)上,但,它必须靠
树干提供营养。所以,一个干支的概念也体现了天地的含义,也体现了一个纵横的问题,
也体现出人与其他动物的差别。

第三,凡属于动物这一类,不管你是直立还是爬行,从象的角度而言,头都与天相
应,足都与地相应。所以,《内经》说:”圣人象天以养头,象地以养足。”怎么养头呢?
圣人说得很清楚,你就去思考天是什么一个样子,你按这个去做就是很好的养头,这样
头脑就会发达。但是,这些都是后天的因素,而先天的东西已经固定在那里,没有办法
改变。我们前面说了,人是走经线的,所以,从先天而言,他禀受的天气最多,而天象
头。为什么人的头脑发达?为什么只有人类能够思维?为什么只有人类有智慧?为什么
人类与其他动物有如此巨大的差别?根本的一个因素就在这个禀受天气的多寡。而其他
的动物呢?它沿纬线走,所以,从先天而言,它禀受的地气最丰,而地象足。大家想一
想,动物的脚力是不是比人好?你们有谁能跑过马?跑过老虎?跑过猴子?甚至你连猫、
连狗、连鸡都跑不过。就是马家军也没办法!为什么呢?因为动物禀地气全,而人禀受
地气相对要少得多。就这一点而言,人与动物是各有千秋的。当然,动物禀受地气全,
脚力就好,这个问题还需相对来看。比如蚂蚁、乌龟,从行走的绝对速度上,那是没法
跟人相比的,但是,从相对速度上、从耐力上,是不是也要比人强,这些问题恐怕需要
大家从专门的角度来研究。

第四,也许有人会提问:人睡眠的时候不也是横卧的吗?对!这个问题提得好。所
有的动物中,只有人,他的睡眠姿势与觉醒姿势不同,觉醒的时候直立,而睡觉时就放
平了。直禀经天之气,横禀纬地之气,为什么说人禀天地之气生,天气和地气都很全,
道理就在这里。所以,人不是光禀天气,他也禀地气,他是”头脑不简单,四肢也发达”。
当然,从量上而言,他禀受的地气还是不如其他动物全。其他动物觉醒和睡眠的姿势有
不有改变?除了这个位的高低有改变,横直并没有改变。马家军的脚力很不错,跑一万
米用不了多少时间,因为马俊仁教练知道怎么超强训练队员的体能。但是,我想如果马
教练多来研究一下中医,从禀受地气的这个角度想想办法,开发队员的脚力,那么,多
拿几块奥运金牌应该不成问题。

第五,以上几个方面都思考过了,我们就知道人之所以能为万物之灵,就因为他是
禀天地之气而生,而且在这个天地,在这个经纬上,他又偏重于天经的一面,这是人之
所以为人的一个最显著的特点。也就是说人类是重经的,偏重于经,以经统纬是人的一
个特点。这也使我们想到,中医的十二经为什么不叫十二纬?这也使我们想到了圣人的
东西为什么一定要叫经典!明确了上面的这些原则,我们就可以来解答小节开首提出的
问题。在人的十二经脉当中,我们看一看哪些经能够真正地贯穿南北,连接上下?是足
经还是手经?很显然是足经。手经它只走到一半,它没有贯穿整个南北,它没有贯穿人
的整个”经”,所以,手经它并不能完全的代表人的特性,惟有足经能够做到这一点。它
从头到足,从天到地,走完人的整个”经”线,所以,足经才能真正地代表这个”经”。《内
经》也好,《伤寒》也好,在谈到很重要的问题时都是举出足经为代表,道理就在这里。
实际上,这是以足赅手,以足统手,言足经手在其中矣。并不是言足不言手,更不是传
足不传手,这个问题大家应该这样来理解。

第六,上面这个问题解决了,我们可以来思考另一个相关的问题,就是六经辨证与
其他辨证有什么区别?当然,搞温病的肯定会强调卫气营血辨证、三焦辨证,搞脏腑的
会说只有脏腑辨证、八纲辨证才行,而我们搞伤寒的是不是就要王婆卖瓜呢?我想这个
不完全是王婆卖瓜,你要有依据,有道理,不要光是感情用事。为什么六经辨证有这个
优越性呢?这就是刚刚谈到的,它是一个纵向的辨证,是一个贯穿天地的辨证,是一个
真正的”经”的辨证。因此,这样的辨证才最符合人的本性,最能够体现人的这个特征,
所以,这个辨证方法最能揭示疾病的根本。《素问》说”治病必求于本”,可以说这个辨证
模式是一个最方便的求本模式。难怪后世要把六经这个辨证模式称为能”钤百病”的模式。
而其他的辨证模式,像卫气营血辨证、三焦辨证,以及脏腑辨证,这些都是横向的辨证,
都是注重纬线的辨证。所以,这些辨证在某方面都有局限性,而六经辨证或者说阴阳辨
证没有这个局限性。

3.开合枢病变

开合枢的正常功用 我们讨论过了,这些功用失常就会产生病变。所以,六经病变
说实在的,就是开合枢的失调,就是开合枢的病变。

(1)太阳开机的病变 太阳主开,负责阳门的开启,太阳的开机为什么会发生异常
呢?这个原因可能来自内部,也可能来自外部,或兼而有之。外部的因素往往比较典型,
如我们常见的伤寒、中风,就是因为外邪侵袭,障碍、束缚了这个开机,使阳气的开发
受限,于是太阳病就发生了。除了外因,内在有哪些因素呢?有阳气虚,本身的力量不
足,太阳这个开的作用会成问题,或者由于水饮、湿等因素障碍了阳气的外出,太阳的
开机也会出现问题。总而言之,太阳开机的功能是帮助阳气外出,帮助阳气发挥作用。
而阳气的作用前面讨论过,有宣发,有卫外,有气化等等,如果太阳开机出现障碍,阳
气的作用就会受到影响,太阳病的发生就与这些影响直接相关。如太阳篇见得最多的是
表病,表病就是因为阳不卫外,遭受外邪侵袭所致。另外,阳不化气,水液的代谢就会
失调,从而导致水液代谢障碍相关的疾病。我们看看整个太阳篇,表证、水气、痰饮、
蓄水占了绝大多数,这些都是与阳用障碍有关,都与太阳开机不利有关。因此,从太阳
开机不利的角度去理解太阳病,就抓住了它的纲领。

(2)阳明合机病变 太阳的开是要使阳气升发,阳明的合是使阳气收降。阳气收降
以后,天气变燥、变凉,所以阳明与秋天相应。现在阳明的合机发生障碍,阳气该收不
收,该降不降,就会出现热,就会有不降的情况。所以,阳明病最大的特征就是两个,
一个是热,一个是不降。热表现在经证里,不降表现在腑证里。当然热与不降,经证与
腑证都可以相互影响。我们看阳明的经证用白虎汤,这就很有意思。白虎是什么?白虎
是西方的神,主宰西方变化的东西就叫白虎。西方的变化是什么?主要是阳气的收与降。
所以,从阳明病用白虎汤,就说明阳气的收降出了问题。

(3)少阳枢病 少阳主枢,负责调节开合,如果开合没有问题,你很难发现枢机的
毛病。我们看一看三阳篇,太阳篇占179 条,阳明的篇幅也不少,而少阳则仅仅十来条。
是不是少阳不重要呢?绝对不是!少阳主枢,关乎太阳、阳明的开合,怎么会不重要呢?
这个篇幅上的差距,很重要的一个原因是,少阳枢机的病变很多都体现在太阳和阳明篇
里面。比如小柴胡汤大家都公认它是少阳病的主方,可是小柴胡汤在少阳病篇的运用只
有一次,而其他大量的运用是在太阳和阳明病篇。枢机主管开合,因而枢机的病变往往
也要从开合上看。这是枢机病变的一个特色。前面讲伤寒和杂病概念的时候,我们曾经
说过,世间上的疾病,如果从发热与非发热这个角度去划分,则可以分为两类,一类是
伤寒,一类就是杂病。那么,现在我们从开合的角度讲,世间的疾病也不外乎两个,一
个是开的问题,一个是合的问题。为什么这么说呢?因为人体的生理主要就靠这个阴阳
的升降出入。升降出入正常,一切都正常;而一旦升降出入异常,一切相关的疾病就会
发生。那么,升降出入靠什么把持呢?就靠这个开合。所以,从这个层面去思维,我们
把天下的疾病分开合两类,应该是如理如法的。依着上面的这个思路再深入一步,我们
又发现,开合的作用是由枢机的转动来维系的。因此,调节枢机便能调节开合,调节开
合便能调节升降出入。所以,枢机对于整个机体来说,真可谓触一发而动万机。历史上
有许多医家善用柴胡剂,一个是小柴胡调阳枢,一个是四逆散调阴枢。利用柴胡剂加减
化裁,通治临床各科的疾病。比如北京中医学院已故元老陈慎吾先生,现尚健在的四川
乐山名医江尔逊都是善用柴胡剂者。历史上往往将这些善用柴胡剂的医家称为柴胡派,
善用一个方,就能成就一个派,这真是不简单的事。这个现象很值得思考。为什么柴胡
剂的化裁能够治疗这么多的疾病?根本的一个原因就在于它对枢机的特别作用。所以,
我们不要看到少阳篇只有十条条文,就以为它不重要,应该考虑到枢机的特殊性。枢机
影响到开的一面它的病变就表现在太阳里,枢机影响到合的一面,它的病变就表现在阳
明里。所以,临床上见到许多太阳、阳明的病变,你从本经去治,效果不理想,这个时
候如果调一调枢,往往就迎刃而解。

(4)太阴开机病变 接下来是太阴,太阴也主开,这个开是使阴门开启(收藏之门),
阳气内入转入收藏。如果太阴开机产生障碍,就会影响到阳气的内入。阳气内入有两个
作用:一方面是为了阳气本身休养生息;另一方面是内入的阳气可以温养脏腑。所以,
阳气内入障碍以后就有两方面的不妥,一是阳气得不到休养,二是脏腑得不到温养。脏
失温养就会产生太阴病。因此,整个太阴病的主导,就像太阴病提纲条文所说的:”太阴
之为病,腹满而吐,食不下,自利益甚,时腹自痛,若下之,必胸下结硬。”都是由于脏
失温养的缘故,都是由于脏塞的缘故。就如227 条所云:”自利不渴者,属太阴,以其藏
有寒故也,当温之,宜服四逆辈。”这些都说明了,脏腑失去温养是太阴病的主导。如果
太阴开机失调,阳气得不到很好的休养,人体的能量得不到贮养、蓄积,阳气就会真正
衰少,这个时候情况就会严重,就会转入少阴病。我们从太阴病治疗主要用温养的方法,
如四逆辈等,也可以说明这一点。太阴属脾土,土是主养藏的。藏什么呢?就是藏阳气。
土能生养万物,它靠什么来生养,靠的就是所藏的这个阳气。所以,土之所以能生养这
些形形色色的万物,与它的这个”开”,与它的这个”藏”是分不开的。如果开机有障碍,
接下来的藏,接下来的生养就会有问题。

(5)少阴枢病 少阴也主枢,它的作用也是或影响开,或影响合。少阴枢机的重要
性比少阳枢又进了一步,它主导水与火的枢转。少阴是水火之脏,这个枢就对水火的调
节起作用。水火并非不相容,它们需要相互接触、相互依转、相互调和。如果枢机出了
问题,就会影响到水火的调和,或者就会出现水太过,水太过必寒;或者会出现火太过,
火太过必热。所以,少阴篇的核心,就是一个寒化与热化的问题。少阴这一经真正关系
到阳的体,我们说三阴为体,三阳为用,体阴用阳。三阳的病变主要是阳用发生障碍,
用有障碍了,这个问题还不太大,用现代医学的术语这还是功能性病变的阶段。所以,
三阳的病很少死人。而病变到了三阴,这就危及到”体”了,按西医的说法就是器质性的
损害。体与用,一个讲器质,一个讲功用。少阳的枢只是对用的枢转,而少阴的枢则是
对体的枢转。体能不能得到真正的蓄养,这就要看少阴枢的功能。所以,少阴的枢转是
很重要很重要的,为什么少阴病死证这么多?就是因为少阴不好,阳之体就没有办法保
养。

(6)厥阴合机病变 前面讲过厥阴是主合的,当阳气蓄养到一定的时候,这个合机
就要启动,从而结束这个蓄养状态,开始一个新的状态。所以,厥阴又是罢极之本,罢
极就是使这个藏的状态结束,进入生的状态,进而生长收藏。前面的太阴、少阴都在收
藏,到了厥阴就要结束这个过程,使阳气转入到升发的状态,出的状态。如果这个过程
障碍了,那会出现什么结果?阳气当出不出,就会产生热。但,这个热与阳明的热不同,
阳明的热是阳气在外,当降不降产生热;厥阴的热是阳气在里,当出不出而热。所以,
阳明热与厥阴热的区别,一个是外热,一个是内热;一个是气热,一个是血热。那么,
什么原因最容易引起这个厥阴合机的障碍呢?也就是说上述这个收藏状态结束转为升发
状态的过程,或者说阳出的过程最容易受什么因素影响?是什么因素能跟这个过程相
对?当然是寒,寒主收引,因此,最容易引起这个障碍。大家看到,厥阴篇的大量篇幅
都在讨论寒热错杂,用药方面,既有大苦大寒的川连、黄柏,又有大辛大热的川椒、细
辛、附子、桂枝、干姜。看上去很矛盾,但,实际上厥阴的本身就是这个情况,就是寒
热错杂。过去都认为厥阴篇是《伤寒论》最头痛的一篇,可是,你从合机的角度去分析,
就会发现厥阴篇并不困难。以上我们从开合枢来谈了三阴三阳,谈了六经病,这虽然是
一个比较粗略的勾画,但是,六经病的脉络已然非常明晰地摆在我们面前,因此,大家
应该认识到,从这个角度,从这个层面去学习《伤寒论》,是一个比较方便的法门。

二、阴阳的离合机制

以上我们讨论了三阴三阳引入厥阴、阳明的意义,三阴三阳建立起来后,中医的基
本模型便随之确定。所以,到了《素问》的第六篇,就专门有一个”阴阳离合论”。怎么
叫”阴阳离合”呢?首先从”合”的角度讲,合就是从综合来看,从总体来看,它谈的是很
基本的层面,这个层面就是一阴一阳。阴阳的这个合的层面,在易系统里又叫做”道”,
故《易·系辞》里面说:”一阴一阳之谓道。”我们前面讲的阳生阴长,阳杀阴藏,就主
要是从合的这个层面谈。那么离呢?离就是分开来讲,《素问》里面谈到阴阳的无限可分
性:”阴阳者,数之可十,推之可百,数之可千,推之可万,万之大不可胜数。”如果这
样来分,那我们怎么能把握?所以,谈阴阳的离,我们不需这样来分,分成三就行了。
阴分为三,阳分为三,这就是三阴三阳。用道家的说法,这叫做”一气含三造化功”。因
此,阴阳的离合实际上就是谈一个分工合作的问题。合作就是要实现第二章所谈的阴阳
的生长收藏,阳气的释放和蓄积,而要实现这样一个过程,就必须有不同的作用机制,
这就要牵涉到分工,这也是《素问·阴阳离合论》最关注的一个问题。

1.门户概念的引入

《素问·阴阳离合论》在具体论述阴阳的离合时说:”是故三阳之离合也,太阳为开,
阳明为合,少阳为枢。是故三阴之离合也,太阴为开,厥阴为合,少阴为枢。”一个开,
一个合,一个枢,这是针对什么而言呢?很显然,它是针对门户而言。门户的作用大家
都非常熟悉,就是要有开合,开则能够出入,合则出入停止。那么,门要能够开合,它
靠什么起作用?它靠枢的作用。所以,门户这样一个总和的概念,要是把它分开来,就
是开合枢这三部分。没有开合,门户就不成其为门户,而要实现开合自如,没有枢又不
行。前面我们说了,天地阴阳的变化,无外乎就是一个升降出入的变化,故《素问·六
微旨大论》说:”升降出入,无器不有。”有升降出入,当然就有生长收藏。那么,怎么
个升降出入呢?古人在这个问题上动了很大脑筋。设想如果没有一个门户,一个理想中
的门户在把持,这个出入的变化怎么进行呢?什么时候出,什么时候入,从什么地方出,
从什么地方入?它总要通过一个地方。因此,在理论上,就有了一个门户概念的产生。
有了门户的概念,我们认识阴阳的升降变化,阴阳的出入变化就方便多了。《素问·四气
调神大论》曰:”夫四时阴阳者,万物之根本也,所以圣人春夏养阳,秋冬养阴,以从其
根,故与万物沉浮于生长之门。”大家看,门户的概念就这样在《内经》系统里构建出来。
这里的沉浮也就是讲出入,也就是讲升降。沉者入也,浮者出也。一方面是浮于生长之
门,这个过程是讲阳气的出,阳气的升,实际上就是阳的释放;另一方面是沉于生长之
门,这个过程是讲阳气的入,阳气的降,实际上就是阳的收藏蓄积。这里为什么要讲”
与万物沉浮”呢?很清楚,就是要说明万物的这个沉浮,实际上就是阴阳的沉浮。万物的
沉浮是表象,而它的实质,它的根本是阴阳在起变化。所以,我们观察任何事物,我们
望、闻、问、切的目的,就是要透过这个表象,看它的实质,看它的根本,看它的这个
阴阳变化。《内经》讲:”察色按脉,先别阴阳。”就是强调这个问题。毛泽东主席在一首
诗中写道:”问苍茫大地,谁主沉浮?”如果把它借用到这里,那么肯定是阴阳主沉浮。
门户的概念建立了,就必须有一个与之相应的工作机制,这就是上述的开合枢。具体地
说,三阳有一个三阳的开合枢,三阴有一个三阴的开合枢。这就意味着应该有两个门,
一个是三阳主宰的阳门,一个是三阴主宰的阴门。上面讲到的只是生长之门,其实这是
一个省略,应该还有一个收藏之门。三阳主的阳门实际就是生长之门,三阴主的阴门,
实际就是收藏之门。阳门打开了,生长之门打开了,阳气便不断升发,不断释放,随着
这个升发,释放,自然界表现的便是春夏的变化,万物在这个过程逐渐地升浮起来。而
随着阴门的打开,收藏之门的打开,阳气转到入降,转到蓄藏,这个时候秋冬开始了,
万物则在这个过程中逐渐地消沉下去。上述两个门的分工虽然不同,但是,却要非常协
调地工作。这里也体现了一个离合的思想。阳门开的时候,阴门要逐渐关闭,否则,阳
气一边出,一边入,甚至出不敷入,那这个春夏的变化,这个生长的变化,就没有办法
实现。同理,阴门开的时候,阳门也要逐渐的关闭,否则,阳气一边入,一边出,甚至
入不敷出,那这个秋冬的变化,这个收藏的变化就根本没有办法实现。所以,为什么阴
阳要强调协调统一,不能搞对立呢?如果你开你的我开我的,那整个升降出入就要搞乱。
《素问·六微旨大论》说:”出入废则神机化灭,升降息则气立孤危。”神机化灭了,气
立孤危了,那还有什么生命可言。所以,这是一个十分严重的问题。《伤寒论》讲六经,
讲三阴三阳,实际上就是讲上面这两个门。两个门要协调好,必须三阴三阳的开合枢协
调好,开合枢协调好了,阴阳的升降出入就不会有异常,升降出入没有异常,神机气立
没有异常,这个生命就不会发生异常。我们从这个层面切入,不但整个《伤寒论》会很
清楚,整个中医也会很清楚。下面就具体讨论这个问题。

2.阴阳的开合枢

(1)三阳之开合枢 上面我们提到开合枢的协调对于门户而言是非常重要的因素。
我们先来看三阳这个门。在阳门里,太阳的作用是负责开,”太阳为开”指的就是这层意
思。随着太阳主开功能的启动,阳门打开了,阳气得以逐渐地升发释放出来。这个在自
然界就表现为春夏,万物逐渐地发陈、蕃秀,而在人体呢?阳气方方面面的作用,就得
到充分地发挥。但是,太阳老是这样开,阳气老是处于这个升发释放的状态,就像我们
人,老是工作不睡觉成不成呢?这一点我们前面已经作了讨论,知道它绝对不行。所以,
开到一定的时候,就有一个关闭的机制,将阳门逐渐关闭,使上述这个蒸蒸日上,升发
释放的过程减弱下来,这个就是阳明的合,”阳明为合”指的就是这层功用。前面我们讲
过,一个开,一个合,它靠什么来转动呢?靠枢机来转动。所以,太阳的开,阳明的合,
就要靠少阳枢机的作用,”少阳为枢”指的就是这个意思。

(2)三阴之开合枢 三阳的作用清楚以后,我们接下来看三阴。阳气的升发释放到
一定的程度后,就要靠阳明的作用,使这个过程逐渐衰减下来。这个时候阳气要回头,
要从升发转到收降,从出转到入,从浮转到沉。这个时候收藏的门要打开,不能将阳气
拒之门外,而这个过程就要落实到”太阴为开”的功能上。所以,太阴开机启动后,阳气
就真正进入到收藏状态。与三阳的道理一样,阳气能不能老是呆在收藏状态呢?就像我
们老是睡觉不起床,这成何体统?所以,收藏到一定的程度后,这个状态就要慢慢地减
下来。收藏的门户要慢慢的关闭,这个关闭作用就要落实到厥阴的合上。太阴开,厥阴
合,少阴的作用是枢转开合,这是三阴的关系。

(3)协同作用 从以上这两个方面,我们应该能够看到,阴与阴,阳与阳,阴与阳
之间的配合非常重要。太阳主开,开机启动,阳气释放,当释放到一定程度后,释放要
终止,开机要关闭,这个作用要依赖阳明,在这个过程,太阳与阳明的开合要适时。释
放衰减以后,要转入收藏,这个时候阴门要打开,否则,光终止释放,不转入收藏,这
个升降的衔接就会出问题。所以,在这个关键环节上,阳明与太阴的配合非常重要。一
个阴,一个阳,一个开,一个合,只有两者默契,释放才能转入收藏。另外一方面就是,
收藏到一定程度后,这个过程也要逐渐终止,开机也要关闭,这个作用当然要依赖厥阴。
而太阳与厥阴的开合也要适时,在厥阴终止收藏的这个过程,阳门要逐渐打开,否则光
终止收藏,不转入释放,这个升降的衔接也会出现问题。因此,在这个关键环节上,厥
阴与太阳的配合十分重要。这里也是一个阴一个阳,一个开一个合,只有两者默契,入
降才能转到升出。这样一个过程,阴阳确实在互相帮助。太阳的开需要厥阴来帮助,太
阴的开需要阳明来帮助。阴阳之间的配合,在开合枢中体现得很充分。《素问·至真要大
论》云:”诸寒之而热者取之阴,热之而寒者取之阳。”这里我们可以借用《素问》的这
个说法,将它改一改:诸治阳而不愈者,当求之于阴;诸治阴而不愈者,当求之于阳。
比如我们治太阳,这个病看上去明明就是一个太阳病,可是怎么弄它都不好,这个时候
我们应该考虑,太阳开的过程还有另外一个合的机制在协助它,是不是这个合出了问题,
这时我们应当”求之于阴”考虑治治厥阴。反过来,太阴的病我们看得很明确,但是,按
照太阴的治法就是解决不了,这个时候,我们也应当”求之于阳”,考虑从阳明来协助治
疗。一个”诸寒之而热者取之阴,热之而寒者取之阳”,一个”诸治阳而不愈者求之阴,治
阴而不愈者求之阳”,加上下一章要谈的五行隔治法,这些方法掌握了,对于解决疑难问
题是很有帮助的。

一、道生一,一生二,二生三,三生万物

1.易有太极,是生两仪

上面,对阴阳已经讨论了很多,对这个问题已经有所了解。现在我们来讨论”阴阳的
工作机制”,弄清楚这个以后对理解《伤寒论》的许多问题就会很方便。阴阳是一体两面,
一分为二。它的来源与《易》很有关联。孔子在《易·系辞》里说”易有太极,是生两仪
“,两仪是什么?两仪就是阴阳,因此,阴阳是从太极来的。太极是《易》系统的一个重
要概念,这个概念弄不清楚,中医的很多问题就不容易搞究竟。”太”这个字经常用,像
太公太婆、太上皇等,所以,比较容易理解,那么,”极”呢?极这个概念在《说文》叫
做”栋”,就是屋脊的意思,是一个最高点。太极显然就是比这个脊更高的地方,比最高
的地方还高,这个说法似乎抽象了一点。有没有更具体一些的意义呢?有关极的概念,
在最早的一本天文历法书《周髀算经》中有专门的涵义,该经的下卷说:”阴阳之数,日
月之法,十九岁为一章。四章为一蔀,七十六岁。二十蔀为一遂,遂千五百二十岁。三
遂为一首,首四千五百六十岁。七首为一极,极三万一千九百二十岁。生数皆终,万物
复始。天以更元,作纪历。”以上的经文谈到五个重要的概念,就是章、蔀、遂、首、极。
章是十九岁,十九这个数就叫做章,这里面就透着一个法度。《素问·至真要大论》讲病
机,为什么讲”十九”条?为什么没有加上一个燥?这里面就有一个章法问题,不是随意
地加一个可以,减一个也可以。这个章法是很严肃的问题,这是含糊不得的。接下去是
四章为一蔀,二十蔀为一遂,三遂为一首,七首为一极。这个”极”是多少年呢?是三万
一千九百二十年。也就是说,三万一千九百二十年就叫做一极。那么,到了这个三万一
千九百二十年会有什么变化呢?有一个非常大的变化,就是”生数皆终,万物复始”。在
这个极点到来的时候,所有的”生数”都终了,在所有的生命结构及生命所需的条件完结
之后,又再开始”万物复始”的新的循环。天地宇宙便是在这样一个交替变化中行进。而
在每一个新的”极”开始的时候,从天文的角度,都需要重新纪元,重新纪历。这叫做”
天以更元,作纪历”。上述这个极的认识大家不要小看了,我们看现代科学发展到今天,
它对宇宙有些什么认识呢?一个热寂说,一个大爆炸,一个熵定律,总起来说,宇宙在
大爆炸中诞生,诞生形成以后,就按照熵的定律不断演变,直至达到熵的最大值。此时
所有有用的能量消耗一空,世界进入死寂,宇宙不可避免地走向死亡。这实际就是”生数
皆终”的时候,就是极变到来的时候。是不是这个死亡就这样一直地持续下去,如果真是
这样,那史前文明这个概念怎么来?我们这一个文明史怎么产生?所以,这个死亡不会
一直地持续下去,它还会变化,还会爆炸,还会有”万物复始”的时候。这个过程,古印
度的哲学把它叫做”成、住、坏、空”,宇宙就是在这样一个成、住、坏、空中演进。宇
宙形成以后,会有很长一个”住”世的过程,而这个”住”的过程,如果按照熵定律,就是
一个熵值不断增大的过程。增大到一定的程度就会产生坏灭,然后不可避免地进入空亡。
这个变化过程就叫做一劫,劫后又要复生,又有新劫产生,又有新的成、住、坏、空。
从上面这个认识我们可以看到,《周髀算经》的也好,古印度的也好,现代科学的也好,
虽然在周期的长短上,在时间单位的意义上会有出入,但究其实质而言,三个认识都是
相同的。那我们不禁要问,现代科学有这样先进的理论,有那么多现代化的手段可以利
用,它得出这样一个宇宙认识并不奇怪,而古人根本没有这些先进的东西,他们凭什么
也得出了同样的认识?这就再一次提醒我们,古人的那套东西真的不可轻视。我们研究
古代的东西,不可以用一个”朴素”就搪塞过去,应该知道其中必有奥妙的地方。上面这
个成、住、坏、空的周期,古人已经提出来了,就是三万一千九百二十岁,这个就是”
极”。在极的终点就会产生很大的变化,这个时候生数已经终了,一切都完蛋了。既然一
切完蛋了,怎么还会万物复始呢?在这个节骨眼上,古人认识到,要想在一个极变终了
之后还会有另一个极产生,要想使极与极之间能够顺利的转换,就必然有一个比”极”更
高的东西,就像孩子生不出孩子,必是母亲方能生出孩子一样。那么,这个”母亲”,这
个比”极”更高一辈的东西,就称之为”太极”,太极的概念就这样诞生了。有了太极,在
生数终了以后,就可以万物复始,就可以产生新生命,就可以产生新的成、住、坏、空。
所以,太极是一个什么东西呢?太极就是这样一个东西,惟有它,宇宙才能不断地循环
下去,惟有它,生命才能终而复始。所以,太极就是这样一个如环无端的东西。我们看
由北宋周敦颐所传出的太极图,画出的就是一个空空的圆。这样一个圆,它如环无端,
正好体现了太极概念的涵义。只可惜后世的许多人误将那个阴阳鱼的画面当作太极图,
闹成天大的笑话。有阴阳鱼的这个画面,只能称作两仪图,或者阴阳图,当然,如果连
上阴阳图外面这一圈看,叫做太极阴阳图也未尝不可。但,绝不能将阴阳鱼这个画面单
称太极图,这如同指子为母,岂不可笑。《系辞》曰:”生生之谓易。”又曰:”易有太极,
是生两仪,两仪生四象,四象生八卦,八卦定吉凶,吉凶生大业。”易是什么呢?易就是
产生生命的那个东西,那个道理。这个东西,这个道理又是什么呢?就是太极!前几十
年,由于人工胰岛素合成成功,于是在科学界产生了一种思潮,认为生命也可以合成。
既然蛋白质可以合成,而人又是由蛋白质构成的,那为什么生命不可以合成呢?生命究
竟能不能合成?这个问题梁漱溟前辈在他的《人心与人生》中发表过专门的见解:”自然
生命靡非始于分化孳息,而人工之造物恒必从构合入手,此世所共见。今曰从构合入手
取得生命,吾窃疑其貌似在此。”生命来自单细胞的分裂,就是当今最时髦的无性繁殖,
克隆术,也没有违背这个过程。只有分化才能孳息,合成怎么孳息呢?所以,生命不可
能由合成产生。只有太极生两仪,两仪生四象,四象生八卦,这个过程不可能倒过来。
因此,生命可以合成,在现代找不到根据,在古代也找不到根据。而从这一点我们可以
看到,传统与现代并不相违,越是深层的问题越是这样。所以,传统钻得越深,往往对
现代的理解就越深刻。当然,反过来也是这样,对现代的问题钻研得越深,有可能对传
统的看法就越深刻。所以,传统与现代需要对话,需要高层次的交流。只有这样,东西
方文化才有可能真正沟通,才有可能相互获益。而这个对话必须平等,你要高高在上,
独称老大,那这个交流就没有办法实现。从”生生之谓易”,从易这门学问对生命的界定,
我们应该有这样一个感受,传统的学问绝不容轻视。它不但涉及一般的问题,而且触及
科学最深层的问题。生命来自分裂,不来自合成。太极生两仪是分裂过程,两仪生四象
也是个分裂过程。在两仪阶段,阴阳初判,这个时候尚未形成生命,等到四象产生了,
有了生长收藏,植物类的东西就有可能产生。四象的时候就是二阴二阳,太阳少阳,太
阴少阴,或者称少阳老阳,少阴老阴。在这个基础上继续分化,变成三阴三阳,生命就
开始形成了。所以,我们要研究生命,特别是研究人的生命,就要特别注意这个三阴三
阳。

2.三阴三阳

《易》这个系统在讨论两仪四象以后,就跳到八卦这个层面,当然,八卦也有三阴
三阳,但是,阐述的角度显然与医有很大的差别。所以,医系统的三阴三阳应该说是很
独特的。我们看《素问》,在《素问》的前几篇里,只讲二阴二阳,特别是《四气调神大
论》,它只提少阳少阴,太阳太阴,直到第六篇《阴阳离合论》才明确提出三阴三阳。就
是在二阴二阳的基础上增加一个厥阴,一个阳明。阴阳这个概念在传统文化的各个领域
都能找到,可以说各行各业都在用它,但是,像厥阴、阳明这样一对概念,则几乎只限
于医家之用。可见这两个概念对中医的关系很大。什么叫阳明?什么叫厥阴呢?《素问》
里面有专门的定义:两阳相合为阳明,两阴交尽为厥阴。而其他的二阴二阳,《素问》里
没有专门的定义。这就说明了厥阴阳明的引入,对于中医理论的构建具有非常特殊的意
义。中医有一个最基本的观念,或者说最基本的特点,这个观念我们前面已经提到过,
就是整体观念,天人合一。这样一个观念,实际上我们在传统文化的各个领域都能见到,
儒家的学问,道家的学问,都是秉承这样一个基本的东西。可以说,这个观念是整个传
统文化大厦的基石。前面我们讨论伤寒的时候,引述了许多《四气调神大论》的观点,
实际上都是说的这个观念。前章已经说过,春夏为什么要养阳?秋冬为什么要养阴?春
为什么要养生?夏为什么要养长?为的是与天地同步。天地生你也生,天地怎么变化,
你也怎么变化,这就是天人相应,这就是整体观念,这就是道!得道多助,失道寡助;
顺天者昌,逆天者亡,从原始自然的意义讲,就是说的这个问题。那么,我们要跟上天
地的变化,首先必须知道天地怎样变化。天地变化的最明显的单位,或者说最明显的层
次就是年。每一年天地都要作一个很大的变化,比如今年庚辰年,变到明年就是辛巳年。
庚辰年是金运太过,太阳寒水司天,太阴湿土在泉,而辛巳年就变成了水运不及,厥阴
风木司天,少阳相火在泉。一个金运、一个水运,一个太过,一个不及,这个变化太大
了。在年这样一个大变化的框架里,还有一个更基本、更细小的变化单位,这就是气。
气这个概念我们在第一章里已经讨论过,它本来是岐伯保密的东西,但是,在黄帝的追
问下,不得不说出来。一年由二十四个气组成,在年这个框架里,气就是最基本的变化
单位,天地便是按照这样一个单位在不断地变化。由小雪到大雪,由小寒到大寒。人要
与天地相应,就必须得跟上这个变化。天地交换到另一个气的时候,你也要跟上来,还
停在原来的这个气上,这就叫做”不及”。如果天地还没有跨越到另外一个气上,你先走
了,这叫”太过”。太过与不及都没有与天地保持一致,没有与天地相应。那么,在气这
个层次上,人体靠什么来与天地自然保持一致呢?就靠肺。《素问·灵兰秘典论》、《素问·六
节藏象论》讲”肺者,治节出焉”,”肺者,气之本”。实际上就是揭示肺的这个功能。有
关这个问题,我们在第一章已专门地分析过,肺在运气里,在《阴阳大论》里,它属于
阳明。阳明燥金,主肺与大肠。所以,阳明这个概念的引入,对于在气这个层次上建立
天人合一的专门机制是非常重要的。阳明为着沟通气这个层次的天人关系,那么,厥阴
呢?厥阴为风木,主肝胆。《素问·六节藏象论》云:”肝者,罢极之本,魂之居也。”
罢极是什么意思呢?按照前人的很多说法,包括现代《中基》教材的说法,都认为这个
罢极是当”疲极”讲,疲劳到了极限,这个说法我们认为不符合逻辑。为什么呢?因为《六
节藏象论》这一篇都是探讨藏府的正常功能,一个生之本,一个封藏之本,一个气之本,
一个仓廪之本,这四个本都是谈的生命过程中最重要的生理问题,怎么到了”罢极之本”
突然讨论起疲劳的问题呢?这显然有悖逻辑。那么,这个罢极究竟谈的什么?首先我们
还是看”极”,”极”是什么?前面说了,七首为一极,就是三万一千九百二十岁。到了极
点这个时候,要发生”生数皆终,万物复始”的变化。可是谁能看到这个变化呢?谁能够
活到三万一千九百二十岁呢?彭祖也不过八百岁。所以,要真实地看到这个极的变化是
不可能的。但是,这个没关系,这并不妨碍我们认识它。因为我们可以利用《内经》的
另一个思想武器来认识这个问题,这就是象。在《灵枢》经里,专门有一篇”顺气一日分
为四时篇”,四时,就是春夏秋冬,它本是年周期里的四个时间单位,可是在《灵枢》的
这一篇中,却把它放到了一天里面,认为一天里面也有春夏秋冬,为什么呢?这个就叫
做”同象原理”。从象的角度看,春夏秋冬是怎么一回事呢?春夏秋冬就是生、长、收、
藏,就是阳生阴长,阳杀阴藏。当然,在年这个周期里面,有生长收藏,但是,在日这
个周期里有没有生长收藏呢?同样也有生长收藏。所以,岐伯曰:”朝则为春,日中为夏,
日入为秋,夜半为冬。”虽然,年周期与日周期在时间长度上这个差别很大,但是,从象
上而言,也就是从阴阳变化的角度而言,却没有什么差别。为什么”朝为春,日中为夏,
日入为秋,夜半为冬”呢?因为朝则阳生,日中则阳长,日入则阳收,夜半则阳藏也。周
期长度不同,但是,阴阳变化的这个象相同,这就是我们说的同象原理。以春生为例,
在年周期里面,这个春生的长度是三个月,而在日周期里,春生的长度只有三个时辰,
这就是它们的差别。同象原理建立以后,问题就好办了。我们知道在极这个周期里,存
在一个”生数皆终,万物复始”的象变,那么,年的周期呢?我们看一看冬三月与春三月,
冬三月,此谓闭藏,特别在北方,我们看到的是千里冰封,万里雪飘,万物凋零,生数
皆终。而一旦度过了严冬,春天到来,则又是一派万物复始的发陈景象。这个闭藏的生
数皆终与这个发陈的万物复始,不就是一个极变吗?所以,在年这个周期上,同样存在
一个极的象变。年与年之间交替,实际上也是极与极之间的交替,这与一日之中亦见四
时是一个道理。我们之所以能从这一年跨越到另一年,必须是作为这一年的这个”极”终
结,罢了,另外一个”极”才能开始。所以,”罢极”的意义就在这里,它是促使年与年、
岁与岁之间交替变换,也可以说是极与极之间交替变换的一个关键因素。如庚辰年转到
辛巳年,马上就由金运太过转到了水运不及,这个跨越太大了。作为人体,我们怎么样
保证在这个大跨度上与天地的变化保持一致,这就要靠厥阴,这就要靠肝,这就要靠这
个”罢极之本”。在岁与岁这个层次上与天地沟通,这个要靠”罢极之本”,要靠厥阴;在
气与气这个层次上与天地沟通则要靠”气之本”,要靠阳明。就像我们现在的收音机,收
音机收到节目的一个前提,就是要使接收的频率与发射的频率相一致,这就需要频率调
节器。通常调节器有两个,一个是粗调,一个是微调。厥阴是粗调,阳明是微调。有了
粗,有了微,这就在多层次、全方位上与天地建立了相应关系。有这样一些专门的机制,
有这样一些专门的部门来负责,人与四时相应就有了保证。可见中医理论的建立,不是
一个随随便便的过程,她很严密,有理论,有实证,不是想当然。

2.伤寒总说

以上我们讲到了两个关系,一个主导,一个体用。阴阳的这些东西弄清以后,就可
以解答上述的那三个问题。

(1)寒为冬气 首先,我们来看寒,寒是冬日的正气,这一点我们在《中基》里面
已经学过。春温、夏热、秋凉、冬寒,怎么会产生寒呢?这一点我们前面已经提到过,
阳的本性是属热的,春夏的阳气处于释放状态,热的东西散发出来了,所以,天气变得
温热。但是,春天释放的程度要比夏天小,因此,春天的温度要比夏天低。到了秋冬,
阳气由释放转入到收藏,热的东西收藏起来了,关闭起来了,天气也就变得渐渐地寒冷。
但是从程度而言,秋天的收藏不及冬日,因此,冬日的气温更为寒冷。这是寒的一个根
本意义。从这个意义我们可以看到,寒实际上是反映阳气的收藏状态,是阳气收藏的外
在表现。所以,寒不但是冬之气,其实也是藏之气。现在我们暂且放下时间,来看一看
空间方位的情况。在我们国家,大家都很清楚,西北的气温要较东南低得多,我们每年
冬天看天气预报,北方有些地区都零下十几度了,南方还在零上二十多度。这个反差太
大了,要是海南的人到北方出差,上飞机前穿衬衣,下飞机就要穿皮袄了。为什么会出
现这样大的差别呢?看一看《内经》就清楚了。《素问·阴阳应象大论》说:”西北方阴
也,东南方阳也。”阳就是用,就是释放,阴就是体,就是收藏。从地域方位的角度而言,
整个西北方以收藏为主,整个东南方以释放为主,所以,就产生了这个气温上的悬殊。
这就提示我们一个问题,学中医不但要注意时间,也要注意空间方位。时空在中医里是
同一的,是统一的,这个观念必须牢牢记住。前面我们提出过,阴阳的问题要真正弄清,
不能光停留在书本的那几点上,要有切身的感受。什么事情都要养成用阴阳来思维,比
如我们生活在南宁的人,时间都快到春节了,身上却还穿着衬衣,这是为什么呢?如果
我们不从阴阳这个角度去思考,去弄清它,那作为一个学中医的人,你就麻木了,就凭
这个麻木,你要学好中医,我看没多少可能。

(2)何以养藏 知道了寒的属性、寒的意义,也就知道了冬日的寒,并不是一件坏
事。我们根据这个寒的表象,这个寒的程度,就可以推断这个阳气的收藏情况,就可以
看到这个”体”的情况。冬日的天气应该寒冷,也就是冬日的阳气应该封藏,这个体应该
涵养。因此,《素问》专门提到了一个养藏的问题。冬三月养藏,秋三月养收,实际上就
是秋冬养阴的互辞,这是很明确的。《素问·四气调神大论》就是讨论这方面问题的专论。
这里我们只看相关的冬三月。论云:”冬三月,此谓闭藏,水冰地坼,无扰乎阳,早卧晚
起,必待日光,使志若伏若匿,若有私意,若已有得,去寒就温,无泄皮肤,使气亟夺,
此冬气之应,养藏之道也。逆之则伤肾,春为痿厥,奉生者少。”《素问》的这一篇讲”
四气调神”,四气,就是指的春、夏、秋、冬之气,就是指的生、长、收(杀)、藏之气。
调神呢?这个讲的是人的因素。人怎么在春三月适应这个生气;怎么在夏三月适应这个
长气;怎么在秋三月适应这个收(杀)气;怎么在冬三月适应这个藏气。这就提出了要
养生、养长、养收、养藏。现在的人只讲一个养生,养长、养收、养藏都不管了,这是
很片面的。上面这段经文主要讲养藏。冬三月怎么养藏,怎么适应这个闭藏的状态呢?
关键的一点就是”无扰乎阳”。冬三月属阴,《素问》又明确指出”秋冬养阴”,而这里却点
出”无扰乎阳”,可见春夏秋冬的这个生长收藏确实是围绕着阳的这样一个主导。无扰乎
阳,就是指的冬三月这个过程已经在闭藏了,什么在闭藏呢?阳气在闭藏。既然已经闭
藏了,就不要再打扰它,这就叫”无扰乎阳”。就像我们住宾馆,睡觉的时候要启动一个”
请勿打扰”的按钮。睡着了,再被打扰醒,会是什么滋味呢?相信大家都会有体验。那么,
怎么实现这个”无扰乎阳”呢?上述的经文谈了四个方面。其一,慎起居。冬三月的起居
应该是”早卧晚起,必待日光”。我是反对睡懒觉的人,而且一贯也没有睡懒觉的习惯。
但是,冬三月却可以例外,要早一些睡,晚一些起,太阳出来再起床也没有关系,这是
《内经》的教证。所以,我一直在思考一个问题,中医学院的作息表,不应该搞什么夏
时制,而应该搞四时制,就根据这个《四气调神大论》来制订作息的时间,这样才与中
医相应,这样才叫四气调神。我相信冬天搞”早卧晚起”,搞”必待日光”,大家都会很欢
迎,冬天有几个不想晚起?说不定就从这里你喜欢上了《内经》,喜欢上了中医。冬天为
什么要早卧晚起呢?这个就是为了适应养藏。睡觉这个过程的本身,就是一种很好的藏
的状态,那么,现在冬三月要强调养藏,这个睡眠的时间就当然要适当的延长。我们看
冬三月,白天的时间短,夜晚的时间长,再看看上面说过的晷影,冬天长到一丈多,而
夏天只有一尺多。晷影也好,晚上也好,都是反映一个藏的状态,人要跟这个藏相应,
那就必须早卧晚起。我们嘴上常说天人相应,怎么个相应呢?冬日养藏就是相应,冬三
月”早卧晚起,必待日光”就是相应。要讲相应,时间就很重要,天地在这个时候收藏。
你也要在这个时候收藏,天地在这个时候释放,你也要在这个时候释放。落实到具体的
问题上,睡觉就是收藏,工作劳动就是释放。现在许多人习惯晚上工作,白天睡觉,这
就不相应了,就阴阳颠倒了,这个对身体肯定不利。年轻的时候也许没关系,到老了你
就会有感受。学中医的人应该避免这个颠倒,避免这个不相应。其二,调情志。冬三月
的情志应该是”使志若伏若匿,若有私意,若已有得,”这里的志有两层意思:一是讲心
志,就是心的志向,《康熙》云:心之所之谓志;二是讲我们平常说的情绪,《左传》里
面将喜怒哀乐好恶称作六志。所以,总起来我们把它称为情志。这个时候的情志应该”
若伏若匿”,伏也好,匿也好,都指的是藏。所以,这个时候的情志应该收藏一些,不要
那么开放,不要那么显山露水。平常我们都劝人要开朗一些,但,这个时候则应该趋于
内向。”若有私意”有什么话,有什么打算不要告诉别人,藏在心里就是了。”若已有得”,
这个东西好像已经得到了,不用再到外面去寻求,可以悄然安住。总之,这个心志,这
个情绪,应该伏匿,不应该张扬,这样才有利于养藏。其三,适寒温。冬三月要”去寒就
温”,这一点很重要,以上我们讨论的许多问题都要落实到这一点上。为什么要去寒就温
呢?我们本来说过寒为冬气,寒为藏气,养藏不是应该更寒一些吗?这里为什么要去寒
就温?其实这个并不矛盾。大家都清楚,夏天我们不仅穿衬衣,而且穿短袖,女的还要
穿什么一步裙,反正能暴露的都暴露无遗。这样的穿着不但为着凉爽,也是一个相应。
因为天地在这个时候也在充分的显露,你看这时的白天特别长,大地能长出来的东西也
都长出来了,与这个相应的穿着就是养长。可是冬天就不同了,特别是在北方,人们都
棉裹裘衣,不但手套帽子,还要围围巾,封闭得严严实实,这个衣着不就是一个”藏”吗?
不就是一个”去寒就温”吗?将整个身体封藏起来了,闭藏起来了,这个也是相应,与冬
藏相应,这就是养藏。但是,现在风气不同了,冬天女的还穿裙子,这个时候还要露,
中医不赞成这个做法。所以,我的朋友里要是冬天穿裙子,我会劝她们别穿。现在年轻
你可以顶过去,年纪稍大,关节痛了,骨质增生了,那就悔之晚矣。当然,去寒就温还
包括了其他保温防寒的方法。其四,节动静。冬三月应该”无泄皮肤,使气亟夺”,泄皮
肤也就是皮肤的开泄。大家知道,什么时候皮肤会开泄呢?当然是激烈活动的时候。皮
肤开泄了,自然汗出,汗出多了,就会耗气伤阳使气亟夺。冬三月是阳气闭藏的时候,
这个时候皮肤也应该相应的闭藏,不要做过多的开泄。这就提示冬天的运动,冬天的活
动应该避免像其他的时候一样,应该有它的特殊性。特别是喜欢运动锻炼的人应该注意
这个问题,冬天的锻炼应该避免过多的开泄皮肤,应该多做静功,这样才能与冬相应,
这样才有利于养藏。(3)伤寒即伤藏上述这四个方面都是与冬相应,都是养藏之道。它
们都围绕一个原则:无扰乎阳。那么伤寒呢?伤寒为什么这么重要?它核心的问题就是
破坏了这个原则。冬主藏,寒就与这个”藏”相伴,所以,冬日的寒非常重要。如果冬日
不寒了,这说明什么呢?这说明阳气还在释放,没有收藏。因此,冬季应寒反暖,农民
就知道不是好事情,第二年的收成就不会好。要是用古人的话说,就会”米贵长安”。我
老家湖南有句乡话:雷打冬,九个牛栏十个空。雷应该在什么时候开始响呢?应该在春
季。立春以后的第三个气叫”惊蛰”,应时的春雷就应该在这个时候打响。春雷一声震天
响,就将这些蛰藏的万物从沉睡中惊醒过来。春雷的打响意味着阳气真正地全面启动,
全面的释放出来。而雷在冬天打响,这又意味着什么呢?这意味着冬雷的响动将整个的
闭藏打破了。闭藏打破了,阳气非时的释放,使阳气不能蓄积,阳气的这个体得不到应
时的涵养。体不足,用怎么发挥?所以到了来年,真正应该阳气发挥作用的时候,它却
发挥不了作用。万物得不到这个阳气的作用,整个秩序就打乱了,不但天灾,而且地祸,
不但植物受影响,动物也受影响,怎么不会”九个牛栏十个空”呢?民间还流传另外一句
话,叫做”瑞雪兆丰年”。瑞雪怎么预兆丰年呢?现在的说法是下雪以后,病虫害冻死了,
所以,可以给来年带来好的收成。当然,这也是一个方面,但是,更重要的一面是冬日
的瑞雪反映了阳气处在很好的蓄藏状态。阳气蓄藏得好,体就能够得到很好的充养,体
充则用足,来年的释放就会好。万物得到这个充分的能量供给,怎么不会”五谷丰登”呢?
另外,这个瑞雪也反映了阴阳的秩序很好,秩序没有破坏,自然的灾害就会减少,所以,
瑞雪兆丰年。上述这个过程我们还可以从经典的角度来教证,《素问》有句名言:”善养
生者,必奉于藏。”或者说:”奉阴者寿。”大家看到这个”奉阴者寿”,也许就觉得她与前
面讲的阳用有矛盾。阳是反映和主宰寿命的,怎么不说”奉阳者寿”,反而是”奉阴者寿”
呢?现在大家只知道养生,只知道生命在于运动。可是生怎么来?生是从藏中来!水生
木这个道理难道大家不清楚吗?大家看一看自然界,特别是动物界,那些喜静的动物往
往寿命长。像龟、蛇、仙鹤,这些动物寿命都比较长。而相反,那些喜动的东西反而寿
命不长。道家讲致虚极,守静笃;儒家讲燕坐,讲知止;佛家讲禅定。这些都是强调静,
强调藏。所以,大家不要只知道运动,应该动静结合。以上这些道理无碍了,我们就可
以回到前面的关键问题上来。冬日气寒,这个寒是天地阳气在蓄藏,人要与天地相应,
所以,这个时候人的阳气也要藏。冬日的气候本来寒冷,这个时候阳气本来应该更多地
释放来为机体取暖,怎么反而在这个时候要收藏,这个矛盾怎么解决?这就要靠我们主
动地去做好”去寒就温”的工作。这个时候应该穿得很严实,甚至要把取暖的设备打开。
我们依靠这个人工制造的环境,就能够让阳气安然地休养生息。阳气蓄养的这个过程做
好了,那以后就能正常地发挥作用。如果”去寒就温”的工作没有做好,机体”伤寒”了,
那会是一个什么后果呢?大家可以想一想,这个时候,阳气是不会坐视不管的,它会从”
沉睡”中”醒”来,它会马上转入释放。阳气被扰动了,这样一个”养藏”的格局就被彻底打
破,”体”的涵养程序遭到破坏,那”用”的方方面面就会受到影响。大家看一看,从这样
一个角度去思考,伤寒重不重要?太重要了!伤寒实际上就是伤藏,它把整个”养藏”给
破坏了。阳气的”体”受到伤害,这个基础不牢固了,用怎么发挥?阳用不能发挥,不能
作寿命的保障,不能卫外而为固,那不但中风、伤寒、湿温、热病、温病要发生,百病
都会发生。所以,伤寒不但可以有五,还可以有十、有百、有千、有万。一个伤寒,就
将上述的两个关系,一个主导,一个体用都破坏了,从这样一个层面去思考,我们就知
道伤寒的意义究竟有多大?对于本节开始提出的三个问题,《内经》为什么将热病归伤
寒?《难经》为什么把伤寒分五?张仲景为什么以伤寒作书名?就迎刃而解了。而通过
这样一个主题的探讨,又将一系列相关的问题连带出来。这是经典的开端,也是学习经
典的一个方法。

(2)主导问题 通过上述讨论,我们看到了这样一种阴随阳生而长,阴随阳杀而藏
的关系,这就要求我们明确两个更具体的主导问题。第一个主导,是阴阳之间协同为主
导,而非对立制约为主导。这也是前面所讲的”夫唱妇随”的关系。阴阳在现实生活中一
个更为具体的例子就是男女,就是夫妇,就是一个家庭关系。大家设想一下,如果一个
家庭中,夫妇两个以对立为主,一个面南,一个面北,水火不相容,那这个日子怎么过,
连基本的日子都没法过,更不要谈事业了。所以,家庭的关系,夫妇的关系,阴阳的关
系应该以协同为主导。第二个主导是阴阳之间阳为主导,这个主导实际上已经包含在第
一个主导里。这个主导说明在阴阳之间,阳的变化起主导的作用、决定的作用。作为阴
它是随着阳的变化而变化。有关这层主导关系,我们可以在自然、社会的方方面面感受
到。前面《素问》所说的”阳生阴长,阳杀阴藏”,实际上就是我们常说的生、长、收、
藏。生、长、收、藏虽然用于表述一年里万物的变化情况,即春生、夏长、秋收、冬藏,
但更实质的东西,更内涵的东西,则是阳的变化。是阳的春生、夏长、秋收、冬藏才导
致了这个万物的生、长、收、藏。有关这一点,董仲舒在他的《春秋繁露》里说得很清
楚:”物随阳而出入,数随阳而终始。阳者岁之主也,天下之昆虫,随阳而出入。天
下之草木随阳而生落。天下之三王随阳而改正。”大家考察一下自然,看是不是这么回事
呢?确实就是这么回事。草木也好,昆虫也好,植物也好,动物也好,它确实是在随着
春、夏、秋、冬的变化而变化。而春夏秋冬怎么来?春夏秋冬由什么来决定?大家知道
是由太阳的视运动决定的。太阳沿黄道运行一周,就形成了一年的春夏秋冬。因此,春
夏秋冬即反映了时间的变化,而更重要的是反映了阳的状态。什么叫春呢?春实际上就
是阳气处于生的状态所占的时段,依次,夏就是阳气处于长的状态所占的时段;秋就是
阳气处于收的状态所占的时段;冬为阳气处于藏的状态所占的时段。由阳的变化产生了
春夏秋冬,而万物又依着这个春夏秋冬的变化而变化,它们之间就是这么一种关系。从
社会的角度,阳(男)作为主导的地位就更为明确,这一点大家有目共睹,不需多谈。
上面我们谈阴阳用了十二消息卦,看到这些卦象的变化,也许大家还是容易将阴阳分开
来,对立来看。比如从复到乾这个阳局的变化,明明是阳日增,阴日消,我多你少,你
死我活,这个对立好像很鲜明。其实,我们不能这样看。阳日增,说的是这个阳的生发,
释放的增加,阴日少,不是说随着阳的增加,有另外一个独立的东西(阴),它在慢慢的
减少。如果我们这样来理解阴阳,那就会出根本上的问题。阴日少,我们确实看到这个
阴爻从复卦以后,在慢慢减少,直到乾卦减为零,那,我们是否可以说在乾所主的这个
时候,是纯阳无阴呢?一点阴都没有,那不成了孤阳!《内经》说:孤阳不生,孤阴不长。
可是我们看到夏三月的景象是万物蕃秀,真正的一派繁荣。可见我们不能这样来理解阴
阳。上述这个阴日少,说的是随着阳气生发、释放的增加,阳的收藏自然就日益地缩减,
前面我们不是申明过,阳的收藏状态为阴吗?释放增加了,收藏自然地就减少,不可能
又释放,又收藏,就像我们的拳头,打出去再收回来,收回来才能再打出去,不可能在
同一个时候,又收回来,又打出去。这就是阴阳的消长关系。所以,虽然是在谈消长,
其实说的还是一个问题,即阳气的变化问题。十二消息卦的另一个层面,也就是阴局这
个层面,也非常容易发生误解。大家看从姤卦以后,阴爻日增,阳爻日减,很多人就认
为这是阴日盛,阳日衰,是一个阴盛阳衰的过程。我们从卦上看,从表面看,好像是这
么回事。但,究竟的思维一下,就知道这个看法有问题。为什么说这个看法有问题呢?
大家可以思考,从姤以后,也就是从夏至以后,一阴始生,阳气逐渐由释放转入收、转
入藏。那么,这个收藏的目的是什么呢?就像我们的拳头打出去,要收回来,收回来的
目的是为了重新打出去。同样,阳气要收藏,收藏的目的是为了能够重新释放。如果收
藏以后,阳气反而衰减了,那它怎么能够再释放?实际上释放就会有消耗,就会有衰减,
而收藏的目的正是为了补偿这个消耗、这个衰减。因此,从量上来说,这个秋冬的过程,
这个阳气收藏的过程,也就是我们前面认为的这个”阴盛阳衰”的过程,阳气的量不但没
有衰减,反而得到了补偿,得到了增加。只有这样,才有可能经过收藏以后再发动新一
轮的生发、释放。联系我们人体,白天工作的过程,其实就是阳气释放的过程,而晚上
的休息,则是阳气的收藏过程。休息的目的是什么呢?是为了白天更好的工作,是为了
获得更旺盛的精力,如果通过休息,阳气反而衰减了,那么这个精力怎么旺盛?那还有
谁愿意睡觉、愿意休息?所以,我们只要一思考,上面这个问题就不难解决。阴阳的问
题是一而二,二而一。分开来好像有两个,一个男、一个女,好像是两个确凿的、独立
的东西。但,合起来的实质却是一。所以,阴阳的问题如果我们只能分开来看,而不能
合二为一,那就很难看到点子上。就比如寒热这个问题,寒热如同水火,很难把它们扯
到一块。这应该是两个截然不同的东西,无论如何都不能把它合二为一。可实际上并不
是这么回事,我们看到的这个截然不同,只是显现上的不同,如果进一步从深层去考虑,
发现它还是一个阳气的问题。前面我们说过,阳气好比能量,好比热能。春夏的天气为
什么温热?就是因为这个阳气的释放造成的,属热的东西释放出来了,那天气当然就变
热了。到了秋冬,秋天的天气为什么凉?冬天的天气为什么寒冷?热的东西不释放了,
收藏起来了,天气当然就变得寒冷。也就是说,寒热是伴随阳的生长收藏的一个表象,
阳气释放了,天气就变热,阳气收藏了,天就变冷,并不是在热之外又有一个独立的属
寒的东西。上述这个问题,一个谈实质,一个讲显现,对这个过程我们应该多思维之,
善思维之。要是这个过程我们思考得清清楚楚,明明白白,那阴阳的问题可以说基本地
解决了。《素问》强调:”阴阳者,数之可十,推之可百;数之可千,推之可万,万之大
不可胜数。然其要一也。””知其要者,一言而终,不知其要,流散无穷。”这个”数之可
十,推之可百,数之可千,推之可万”其实就是讲显现,是从现象上讲。而这个不可胜数
的显现,就其实质而言却只是一个。知道了这个实质,就可以一言而终,就可以”能知一,
万事毕”,而不知道这个实质,则必会流散无穷。上述这个阴阳变化,上述这个主导关系,
我们还可以从最原始的天文测算过程去体悟。大家知道《周髀算经》这本书吧,这部书
记述了最原始的测量太阳运行轨迹,也就是一年二十四节气的方法。就是在日中正午的
时候,在太阳下立一个八尺的圭表,圭表的投影叫晷影,测量这个晷影的长度,就能够
知道太阳运行到了什么地方,就能够确定出二十四节气。《周髀算经》告诉我们,晷影最
长的长度是一丈三尺五寸,最短的长度是一尺六寸。大家可以思考,最长的这个晷影应
该对应哪一天?最短的这个晷影应该对应哪一天?最长晷影的这一天应该是冬至这一
天,相反的,最短晷影的这一天就是夏至这一天。晷影也就是太阳的阴影,盛夏的时节
我们外出,大家总是喜欢走在树阴下面,或者总是希望来一片青云,为什么呢?因为树
阴把太阳遮住了,青云把太阳光收藏起来了。所以,我们马上就会感受到清凉。因此,
我们可以把上述的这个晷影当作是阳的收藏状态的一个尺度。为什么冬至的晷影最长
呢?因为这个时候阳的收藏最厉害。冬至一过,我们看到这个晷影就日渐缩短,这反映
了阳的收藏在减弱,随着这个收藏的减弱,阳气自然日益显露,日益生发、释放。所以,
冬至以后,白天也一日一日增长,黑夜一日日缩短,这些都是收藏与显露,收藏与释放
的变换。上述这个日益短缩的晷影到了夏至这一天,缩至了一尺六寸,一尺六寸与一丈
三尺五寸相比,零头都不到。这个时候的阳气充分显露出来了,几乎没有什么遮拦,这
就使得阳气的释放达到了最大的程度。然而重阳必阴,所以,夏至一过,这个晷影就一
天天地变长。与之相应,白天也一天天地缩短,黑夜一天天地延长。阳气在充分地释放
以后,又渐渐转入到收藏。由上面这个晷影的伸缩,我们可以看到,一年四季的变化,
二十四节气的变化,其实就是阳气收藏与释放之间的变化。我们抓住了这个主导,阴阳
的方方面面就会自然地连带出来。

(3)体用关系 阴阳除了上面的这些关系外还可以从体用的角度来谈,体用是传统
文化里一个重要的概念。体是谈基础,用是谈作用,谈应用。没有体,这个用不可能发
生,而没有用的体,那这个体也就从根本上失去了意义。上面这个体用的关系怎么说明
阴阳呢?具体地说,阴阳之间,哪一个属体?哪一个属用?很显然,如果我们把阴阳看
作一个整体,那么,反映用的主要是阳,反映体的主要是阴。在《中基》里,当谈到肝
的功能时,有一个体阴用阳的概念,实际上,不但肝如此,整个阴阳都是如此。我们从
一年来看,春夏为阳,秋冬为阴。这个春夏的过程主要就体现了阳的作用,我们看春夏
的阳光,看春夏的温热,看春夏的繁荣,这一切都反映了阳气在积极发挥作用。所以,
春夏为阳,这个阳是讲用,这个问题不难理解。这与前面讲的释放状态相应。那么,秋
冬呢?秋冬这样一个寒冷的、凋零的景象,显然与阳的作用不符。为什么呢?因为阳用
收藏起来了,你看不见了,所以,你见到的是另外一番景象。这就关系到体的问题。体
是基础,体是本钱。而秋冬的阴,秋冬的收藏,正是为了培植这个基础,蓄积这个本钱。
基础巩固了,本钱增加了,上述这个用才能更好的发挥。因此,从这个角度来看,体与
用,阴与阳一点不相违。两者相辅相成,互根互用。缺一不可。阳的用这一面,我们很
容易感受到,但是,我们也不能因为前面对阳的强调而忽视了这个体的意义。应该知道,
它与强调阳用并不矛盾。所以,光强调男权不行,还要谈女权。现在不是有一句流行的
语言,”每个成功男人的背后,都有一个成功的女人”吗?这句话讲得很实在,很多情况
确实是这样。只是现在很多男人成功之后,就把原来助他的女人抛弃了,这个不但不道
德,而且很愚蠢,将来注定他要遭挫折。阳讲用,这个用可以反映在很多方面。首先一
个就是阳生阴长,这个化气的阳,能够促成万物的生长。春夏的景象为什么发陈?为什
么蕃秀?就是因为这个因素。第二个用,阳为寿命之根本,《素问·生气通天论》讲:”
阳气者,若天与日,失其所则折寿而不彰。”因此,阳用很重要的一个方面就反映在它与
寿命的关系,人的寿夭就要落实在这个阳气上面。长寿的人阳气没有不充足,相反,若
阳失其所,则有折寿短命之虞。第三,”阳者,卫外而为固”,这也是阳用非常重要的一
个方面。我们这个身体牢不牢固,能不能抵御外邪的侵袭,就要看这个阳的卫外作用。
这个作用与健康的关系很大。我们说人身最大的问题除了事业以外,就是一个健康,一
个长寿,而阳用就反映在这个上面。阴讲体,这个体的意义表现在什么地方呢?比如一
个家庭,尤其是过去的家庭,妇女只会生儿育女,操持家务,怎么来体现女人的作用呢?
就看你这个男的有没有出息。男的搞得好,说明你家的内助不错。为什么叫内助?帮助
的意思,助阳的意思。也就是说,阴的意义主要体现在助阳方面,怎么帮助阳去发挥应
有的作用,这个就是阴体的意义。阴为阳体,阳为阴用。”阳在外,阴之使也,阴在内阳
之守也”,两者就是这么一种关系。阴为体,它的一个很突出的方面就是它的藏精作用。
《素问·生气通天论》云:”阴者,藏精而起亟也;阳者,卫外而为固也。”什么叫”精”?
实际上,精既不是阴,也不是阳。现在很多人在概念上搞混淆了,把上面这个精作阴来
看,所以,习惯就称阴精。如果精就是阴,那这个藏精怎么讲,它还怎么藏精?这从逻
辑上讲不通。从严格的意义上说,”精”实际上指的是阳气的蓄积状态,能量的蓄积状态
就叫”精”。某样东西暴发的能量越大,说明它阳气的蓄积状态越好。当然,在《内经》
里,在《中基》里,精还有许多其他的解释,我这里是从最基本的义理上去分析。精是
阳气的聚集态,而不是释放态。而阴的藏精就体现在帮助这个聚集的过程。阳气能不能
聚集?能不能由释放状态转入蓄积状态?就靠这个阴的作用。那么,具体地说,这个精
藏于何处呢?《素问·六节藏象论》说:”肾者主蛰,封藏之本,精之处也。”蛰是藏伏
的意思,肾是主藏的,所以,又称作封藏之本。封藏什么呢?封藏阳气,封藏精。这个
精,这个聚集态的阳气就被封藏在肾的领地里。所以说”精之处也”。肾在一年里属冬,
冬主藏;肾在五藏属阴,属阴中之阴。这就与上面这个阴体,上面这个藏精相应了。所
以,上面的这个体,上面这个阳气的蓄养过程,在很大程度上要落实在这个肾上。精能
否封藏好?阳气能否得到充分的蓄藏,休养生息?就要看这个肾的功能。只有蓄养好了,
释放才好,精力才会旺盛。所以,人的精力如何,很重要的方面就是看肾。阴讲体的这
一面清楚了,体的目的是为了帮助用,这样人们就不会再把阴阳的关系对立起来。应该
从统一中去看对立,而不应该像过去那样,由对立看对立。阴阳的体用关系,我们还可
以从生活的许多方面去感受。比如说休息,过去我们对休息的理解也许比较笼统,以为
坐下来就是休息,睡觉就是休息。其实,细分起来,它仍然是谈的两个方面。上面这个
笼统的方面实际上包含在”休”字里,休就是指的这个过程。休者休心也,停下手中的活
小歇一下,叫做休,而停止一天的活动,上床睡觉更叫休。所以,休字从人从木,人躺
在木床上是谓休。那么,休的目的是为了什么呢?这一点相信大家都很清楚。晚上睡觉
是为了第二天有充沛的精力,午休的目的也如此。有午休习惯的人,突然哪一天不午休,
那整个下午都会昏昏沉沉,打不起精神来。因此,休的这个作用就落实在”息”上。什么
叫”息”呢?现在大家在银行里存钱,为的什么呢?为的就是这个”息”。早十年我们在银
行存钱,年息是9%、8%,也就是一万块钱一年下来,就变成了一万零九百元,增加了整
整九百元。正是为了这年息9%,大家都愿意把钱存在银行里。因此,这个”息”就是增加
的意思,通过存钱使利益增加了,所以叫利息。休息呢?很显然,就是通过这个休的过
程,使我们在工作中消耗掉的精神体力得到增加,重新恢复精力充沛的状态。所以,休
息也包含着体用两个方面,也包含着阴阳两个方面。春夏为阳,秋冬为阴,实际上是讲
春夏为用,秋冬为体。用的发挥怎么样,在很大程度上要看这个体好不好。所以,春夏
的用如何,就要落实在秋冬,尤其是冬这个体上。《素问·四气调神大论》云:”所以圣
人春夏养阳,秋冬养阴,以从其根。”过去许多人对这个养阴养阳不理解,以为春夏养阳
岂不是火上加油,秋冬养阴岂不是雪上加霜,《中医杂志》还专门就这个问题组织公开讨
论。其实,我们从体用的角度看,这有什么疑问呢?春夏养阳就是促进用的发挥,秋冬
养阴就是把体涵养得更好。这是从体用的角度来谈阴阳,大家尚可以引而伸之,推而广
之。

一、伤寒论说什么?

从这一章开始,我们将进入《伤寒杂病论》一些具体问题的讨论,在讨论这些问题
前,应该首先弄清楚这部书是一部什么样的书。我想这个问题,我们可以通过论题,通
过书名来解决。

1.伤寒的涵义

伤寒,是我们讨论的这部书的核心,有关它的涵义我们应该很清楚。伤寒这个概念,
在《素问·热论》里有很明确的定义:”今夫热病者,皆伤寒之类也。”这个定义说明了
伤寒的一个非常显著的特征,那就是发热的特征。凡是属于发热性的疾病,或者说凡是
具有发热特征的疾病都属于伤寒的范畴。《内经》对伤寒的这个定义,是从最基本的点上
去定义的,但是,扩展开来却显得很泛化,不容易把握。为此,到了《难经》的时候,
又给它作了一个更具体的定义。《难经·五十八难》云:”伤寒有五,有中风、有伤寒、
有湿温、有热病、有温病。”《难经》的这个定义说明了,这个具有发热特征的伤寒常见
于五类疾病里,哪五类疾病呢?就是中风、伤寒、湿温、热病、温病。稍稍具有临床经
验的人就能感受到,《难经》给伤寒的这个定义确实很具体,临床所见的发热性疾病,大
多也就见于这些疾病里面。所以,要研究伤寒,就应该着眼于上述这五类疾病。另外一
个需要注意的问题,就是《难经》中谈到两个伤寒,第一个伤寒当然是总义的伤寒,也
就是《素问·热论》讲的伤寒,现在的教材又叫它广义伤寒;后一个伤寒是分义的伤寒,
又叫狭义伤寒。而我们这个论题上,书名上的伤寒,当然是指第一个意义上的伤寒,这
一点不容混淆。这个问题弄清了,我们就知道张仲景并不偏重于谈寒,他也谈湿温、热
病、温病。

2.杂病的涵义

伤寒是《伤寒论》或者《伤寒杂病论》这部书的经,但,还有一个纬,这就是杂病。
杂病与伤寒相比,它具有什么意义呢?这里先讲一个”文化大革命”的故事。”文化大革命
“期间,王洪文当上了党的副主席和军委副主席,但是,大家都知道他一个保卫干事,能
有什么特别的才干?有一次当时的副总理邓小平就问王洪文一个问题,说中国到底有多
少厕所?让王洪文告诉他。王副主席一听这个问题,当时就愣住了,这个问题我怎么回
答?我又没有作过具体调查,毛主席不是说没有调查就没有发言权嘛。看到这个尴尬的
局面,总理便在一边解围说,这个问题不用作调查,中国就只有两个厕所,一个男厕所,
一个女厕所。这虽然是个玩笑,但是,哲理却很深。联系到伤寒与杂病的概念,如果我
们从发热的角度去认识天下所有的疾病,那么,天下的疾病也无外乎两个,一个就是具
有发热特征的疾病,一个就是不具备这个特征的疾病。天下的所有疾病中,要么是发热
的,要么是不发热的。大家想一想,是不是这么回事?现在,既然发热的疾病让伤寒占
去了,那么,不发热的这一类疾病就非杂病莫属了。所以,一个伤寒,一个杂病,已然
将天下的疾病占尽了,这就是伤寒与杂病的真实涵义。弄清了上面这个涵义,可以解除
我们许多的顾虑。过去我们常会担心,光搞一门伤寒会不会太局限了?担心搞伤寒的只
会治外感,不会治内伤;只会治伤寒,不会治温病;或者只会治内科,而不会治其他各
科的病。现在我们知道了《伤寒杂病论》是一部什么样的书,知道了它的研究范围。这
些问题清楚了,怎么还会有上面的担心?所以,读古书,对书名的理解是很重要的。

3.论的涵义

书名的最后一个字是”论”,大家也别小看了这个字。论在古代是一个很重要的概念,
是一个与经相对应的概念。所以,要搞清楚论,必须首先搞清经。”经”是什么?经就是
经典。中医有中医的经典,道家有道家的经典,佛家有佛家的经典。这个经典意味着什
么呢?它往往代表某一门学问里最权威的东西。经典产生的时代,往往就是这门学问最
成熟的年代。这与现代科学的发展模式是不同的。经典的这样一个特性决定了我们要研
习这门学问,就得依靠它,这一点我们前面已经讨论过。而经典的另外一个重要特征就
是它的作者。经典的作者是很讲究的,像佛家这门学问,只有释迦牟尼所讲述的那些著
作能够称经,其他后世的这些著述统统不能称经。儒家的学问也是如此,只有孔子的著
述,或孔子删定的诗、书、礼、易能够称经,而后世的那些同样也不能称经。经典作者
的这样一个特殊性,使我们发现,他们都是这门学问的开山祖师,只有开山祖师的东西
才能称经。开山祖师亦称圣人,像儒家这门学问,只有孔子能称圣人。所以,孔子又被
称为”大成至圣先师”,而孔子以后的人统统不够圣人的条件,要称的话,最多勉强称作
亚圣、或后圣,亚于圣人、后于圣人。那么,上述的这些圣人,上述的这些经典的作者
灭度以后,后人便要对这些经典进行诠释,进行发挥,这些对经典进行诠释和发挥的著
述就称之为论。所以说论是与经相对的概念,没有经就没有论。我们从手头的这部书叫
论这个名字,就知道它是诠释和发挥经典的著述。上述这个关系清楚后,我们就会发现,
在中医界有一个很奇怪的现象,那就是把造论的作者当成了医圣,反而作经的黄帝、岐
伯没有称圣。这个现象当然有它的原因,张仲景对中医的贡献太大了,他于危难之中拯
救了中医,中医之所以能够延续到今天,张仲景是功不可没的。正是张仲景的这个功绩,
他被越称为医圣,他的论亦成了经。但是,作为张仲景自己,他是很谦虚的,他并没有
把他的著作叫《伤寒杂病经》,这一点他要比后世的皇甫谧、张介宾高明。有关经论的上
述涵义,我们还可以用另外一个关系来说明,那就是”体”与”用”。经为道之体,论为道
之用。经以言体,论以明用。没有体不行,如果我们没有强健的身体,那一切的理想都
会落空。所以,体是基础,没有它不行。同样,用也很重要,有体而无用,那这个体的
意义怎么体现出来?我们光有强健的身体,却不去发挥作用,那么这个身体有什么意义
呢?还不是臭皮囊一个!因此,体与用、经与论就是这么一种关系。这样我们就知道了,
要学好中医,经必须读,论也必须读,而《伤寒杂病论》呢?它既具有经的一面,又具
有论的一面,它既言体,又明用。就是这么一部著作,大家看应不应该读?应不应该把
它作为依靠处?

二、认识阴阳探求至理

上面的论题搞清以后,这就开门见山了。接下来的是要提出三个问题:第一,《素问》
里讲:”今夫热病者,皆伤寒之类也。”明明热病就是热病,怎么要把它归到伤寒呢?寒
与热是风马牛不相及的事,这是为什么?第二个问题,它与第一个问题也有联系,伤寒
就是伤寒,就是一个病嘛,《难经》为什么说”伤寒有五,有中风、有伤寒、有湿温、有
热病、有温病。”一个伤寒怎么会包括这么多病,这是一个问题;第三呢?张仲景为什么
以伤寒为经?后世的王叔和为什么径直用”伤寒”来作书名?上面这三个问题,是我们在
读《伤寒论》前必须搞清的问题,这三个问题弄不清,《伤寒论》你没法子读通。那么,
上述的这三个问题,我们如何才能搞清呢?这里可以借用清末四川名医郑钦安的一个窍
诀:”学者苟能于阴阳上探求至理,便可入仲景之门也。”因此,学者若欲在仲景这门学
问里真正的深入进去,那就必须把阴阳的问题放在首位。

1.认识阴阳

中医里最重要的东西是什么?中医里最核心的东西是什么?方方面面都要围绕它,
离开它就不行的这个东西是什么?这就是阴阳!《素问·阴阳应象大论》的开首即说:”
阴阳者,天地之道也,万物之纲纪,变化之父母,生杀之本始,神明之府也,治病必求
于本。”《素问》的这段话对阴阳作了高度的浓缩和概括。我们做任何学问,尤其是中医
这门学问,离不开天地,而阴阳是天地之道;阴阳是万物的纲纪,一个万物,一个纲纪,
大家可以掂量一下这个分量,有什么东西还能逃过这个阴阳;它是变化的父母,我们探
讨事物,无非是探讨它的变化,时间的变化,空间的变化,而是什么导致这个变化呢?
是阴阳;我们接触社会,接触自然,社会的东西也好,自然的东西也好,不论你是动物
还是植物,是有机物还是无机物,是宇宙还是银河,它的整个过程无非就是一个生生杀
杀的过程,那么,这个生杀是怎么产生的呢?它的本始还是阴阳;另外,就是神明之府,
神明就是讲精神讲思维,所以,这一条与人类自身的关系特别大,那么,神明怎么来,
还是与阴阳有关;最后,就要谈到治病求本的问题,现在人都知道说:西医治标,中医
治本。当我们问一句中医怎么治本?或者中医通过什么来治本呢?这就回答不上了。其
实,这个本还是阴阳,还是要在阴阳里面寻求。阴阳就是这样一个关系到方方面面的,
最本始的东西。不知大家对阴阳有一个什么样的认识?是否达到了《内经》的高度?我
在教授本科生和研究生时都喜欢提这个问题,而同学们给我的回答也就是《中基》教材
的那几条,什么对立制约,互根互用,消长平衡,相互转化等等。而再往下问,答不出
了。学阴阳,光懂这些还不够。怎么个对立,怎么个互根互用,这些你都要有真实的感
受。对于任何事物的变化,你都能落实到阴阳上面,甚至一举手、一投足你都能分辨出
阴阳来,都能感受出阴阳来,只有这样,阴阳才能为你所用,你也才能用阴阳解决真正
的实际问题。

(1)阴阳的关系 阴阳谈的是阴与阳两者之间的事,既然是两者,就有一个相互的
关系问题,这也是阴阳这门学问里最重要的一个问题。上述这个关系,《素问·阴阳应象
大论》里有很精辟的论述,就是”阳生阴长,阳杀阴藏”。这句话基本上将阴阳的主要方
面包含进去了,因此,只要弄通了它,阴阳的学问也就可以基本解决。”阳生阴长,阳杀
阴藏”主要是讲的一年里的阴阳变化以及万物的生长情况。阳生阴长主要讲上半年,也就
是春夏的变化。在这个过程中,阳渐渐生,阴渐渐长,两者的关系非常协调。联系到具
体的自然,春日以后,白日渐长,气温渐高,我们随处可以感受到阳气的不断增长。那
么阴呢?阳化气,阴成形,这些成形的,属阴的万物也随着这个阳的增长而不断地繁茂,
真正的一派欣欣向荣。这个过程真正是阳在生,阴在长,夫唱妇随。与我们以往所说的
对立的、消长的关系好像不同,并不是阳产生了,万物反而消灭,完全不是这么一个情
况。如果用现代一些的语言来形容这个过程,那么,阳气就好比能量,我们可以设想在
天地之间有这样一个能量库,而在春夏这两季,能量是处在一个释放的过程,随着能量
的释放,万物得到这个能量的供给,便逐渐的生长,繁茂起来。否则,万物凭什么会生
长繁茂呢?就是因为这个阳气的释放,这个能量的释放造成的。这是阳生阴长。那么,
阳杀阴藏呢?这是讲秋冬的变化。大家不要把这个”阳杀”看成真正的杀灭,”阳杀”与”
阳生”是一个相对的概念。既然春夏的阳生指的是阳的释放,能量的释放。那这个释放是
不是会无休止的进行下去呢?应该不会。这好比我们拳击,拳头伸展打出去了,如果拳
头还老是停留在这个状态,那就没办法进行第二击。所以,必须先把拳头收回来,才能
打下面的一击。阳气也是这样,老是生发,老是释放行不行?不行!这样就不能持续。
所以,生发、释放到一定程度后,它就逐渐地转入到收藏,这个阳气的收藏相对于释放
而言,就是”阳杀”。阳杀了,能量收藏起来了,天地万物得不到这个能量的供给,万物
的生长就趋于停止,而且渐渐地凋零、枯萎,这就是我们看到的秋冬景象。所谓”秋风吹
渭水,落叶满长安”就是讲的这个肃杀的状态,就是讲的这个收藏的状态。上述的这个过
程是周而复始、如环无端的。所以,收藏到一定的程度后,又要开始新一轮的生发、释
放。这便是《素问》所讲的”重阳必阴,重阴必阳”。阳指的是生发、释放的这个过程,
阴指的是收藏的过程。春夏为阳,秋冬为阴指的也是这个过程。用《素问》的”重阳必阴,
重阴必阳”来阐述上面的这个转换,是非常形象的。为了更好的理解这个过程,我们可以
结合一些《周易》方面的知识。《周易》是一本专门讲阴阳变化的书,而且这个阴阳的变
化它用一个二维的图象表示出来,这就使阴阳的变化更为直观、更为清晰。特别是描述
一年的阴阳变化,它有专门的”十二消息卦”,即:复(聓)、临(耹)、泰(耺)、大壮(耼)、
聎(耾)、乾(聀)、姤(聁)、遯(聄)、否(聅)、观(聇)、剥(聈)、坤(聉),如果
用一句诗来记忆十二消息卦,就是”复临泰壮聎乾姤,遯否观剥坤二六。”其中复卦对应
的是老历十一月的变化,依次类推,临为十二月,泰为正月,大壮为二月,聎为三月,
乾为四月,姤为五月,遯为六月,否为七月,观为八月,剥为九月,坤为十月。上述的
十二消息卦,在易系统里又叫别卦,它是由两个经卦重叠而成,经卦也就是我们常说的
八卦系统,别卦也就是常说的六十四卦系统。从十二消息卦里,我们可以看到,除了乾
坤两卦以外,其他的十个卦都是阴阳爻混杂在一起,既有阴,也有阳。而乾坤两卦不同,
它是纯阴纯阳。乾卦由两个纯阳的经卦(乾)重叠而成,所以,又称重阳卦。坤卦由两
个纯阴的经卦(坤)重叠而成,所以,又称重阴卦。从复卦开始我们可以看到,阳爻在
逐渐增多,标志着阳气的生发、释放在不断地增强,一直到乾卦,变成六爻皆阳,变成
重阳,阳的生发、释放也到了最大的程度。再往下去怎么样呢?重阳必阴。所以到了下
一卦,到了姤卦的时候,上述这样一种阳的格局就起了根本的变化,阳不再增长了,而
阴却悄然而起。姤卦所对应的月份是五月,而姤卦对应的这样一种重阳必阴的转换则发
生在五月的夏至节上。”至”不是到来的意思,”至”的意思是极限。夏为阳,到夏至这个
点上,阳的增长已经到了极限,而物极必反,所以就有这个”夏至-阴生”的变化,就有这
个阳极生阴,重阳必阴的变化。姤卦以后,我们看到了另外一个截然不同的格局,阴不
断在增长,而阳不断在萎缩,直到坤卦,变成六爻皆阴,变成重阴。而重阴必阳,所以,
到了下一卦,到了复卦,又重新转入阳的格局。于是我们又看到了一个阳爻不断增长,
阳气的释放渐渐增强的过程。这里为什么要起复卦这个名呢?复就有重复、来复的意思,
到了这个点上,又开始新一轮”阳生阴长,阳杀阴藏”的变化,所以这一卦取名为复。在
上述这个变化过程中,我们还应留意另一个问题,这就是重阴必阳的变化,一阳生的变
化并不发生于立春,而是发生在隆冬。同样,重阳必阴的变化,姤所涵的一阴生的变化,
也没有发生在立秋,而是在盛夏。这又反映了阴阳的另一个显著的特征,那就是阳生于
阴,阴生于阳;阴中有阳,阳中有阴。从上面这个过程我们可以看到,讨论阴阳,讨论
中医,如果结合《周易》来谈,会显得更方便、更直观,更有助于我们了解她的确切内
涵。所以,历代都有人强调医易的关系,尤其孙思邈指出:”不知易不足以为大医。”这
一点我们应该引起重视。

5.认识经典与现代

下面我们从另一个角度来讨论经典,可以分三方面谈:

(1)保守性问题 一提起经典,一提起传统,大家都免不了会想到一个问题,就是
文化的保守性问题。以为现代文化必然都是开放性的,而经典的、传统的文化,必然带
有保守性。中国为什么落后?中国为什么没有产生近现代科学?甚至中国的科学家为什
么没有拿到诺贝尔奖?这些似乎都与我们的文化有关,都是我们文化中固有的保守因素
造成的。这样一来,传统的东西当然就成了障碍。但,事实究竟是不是这么回事呢?如
果我们对传统的文化持这样一种见解,那就是太不了解我们的文化了。1998 年度,又有
一位香港的华裔科学家摘取了诺贝尔化学奖的桂冠,在一次座谈会上,杨振宁博士专门
就此谈到了大陆的科学家为什么至今仍未有一位问鼎诺贝尔奖。他认为一个很重要的因
素,就是受儒家文化保守性的影响。在这里,我想单就儒家文化的保守性问题提出来与
杨振宁贝尔奖的博士商榷。认为儒家文化有保守性,我想杨教授的这个观点是不是有代
表性的。现在要是抽问10 个人,起码会有9 个人这样的回答。

但是,儒家文化究竟有没有保守性呢?有保守性,你要拿出证据;没有保
守性,你也要拿出证据。这个证据从哪里找呢?当然要从孔子那里找,当然要从正宗的
儒教文化里找。《论语》是儒家文化的重要经典,我们翻开《论语》,哪一点体现了儒家
文化的保守性呢?这一点我们似乎看不到。而相反的,我们看到了它的另一面,它的开
放性。《论语》的第一篇是”学而”,也就是谈论学习方面的问题,一门文化它有没有保守
性,它是不是固步自封,很重要的就是看这个学习的方面。在”学而”篇里,孔子开篇即
言:”学而时习之,不亦说(悦)乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君
子乎?”孔子开篇的这段教诲,实际上道出了治学的三大窍诀。第一窍诀是”学而时习之,
不亦说(悦)乎?”大家不要小看了这个窍诀。它不仅仅是学习了知识,要经常安排复习
的问题,大家都经历过复习,大家回想一下,学习了,复习了,是不是就产生了快乐呢?
是不是就有喜悦呢?当然,时习之还不仅是指复习的问题,更多的是指实践的问题,用
的儒家的学问问题。大部分经验告诉我们,学习这个过程是枯燥的,要不然,怎么会说:
“学海无涯苦作舟”呢?所以,在学问海里没学问。有几个人能坚持下去。
为什么呢?因为没有见到”悦”。没有见到”悦”,那学习就是件苦差事,吃力不讨好,哪
个愿意去做?前些年为什么那么多人下海经商,原因就在这里。海里面有”悦”,书里面
没有”悦”。有几个人能见到书中的玉女,有几个人能见到书中的金屋呢??所以,学问能
不能真正地活到老学到老,关键的就要看他有不有这个”不亦说乎”。这个”不亦说乎”在
学问上叫”学乐”,要有学乐融融,在佛道里叫”法喜”,要法喜充满。初学的修行僧,为
什么叫苦行僧呢?因为这个过程非常苦,几乎没有乐趣可言,全靠一个信念在维持。所
以,这个阶段戒律很重要,要靠这个戒律来约束,否则坚持不下去。而一旦迈过了这个
阶段,学以致用了,在用中有了乐趣,有了感受,真正产生了法喜,到了这个境界,那
完全就不同了。你不用再担心你的信心会退失,不再需要用什么东西来强迫你、约束你
修持,你会自然而然地去行持菩萨道。修行变成了你的生命,修行变成了你的生活。这
又叫无勤而作。所以,学问能不能做下去?修行能不能搞下去?这个”学乐”、这个”法喜
“是非常关键的因素。这第一个窍诀就是讲的你要设法获得这个东西,这样你的学问就有
了基本的保障。学习为什么一定要讲兴趣呢?兴趣就与这一窍诀有关。第二窍诀是”有朋
自远方来,不亦乐乎?”在”学而”篇里讲”朋”,显然这个朋不是讲的一般的酒肉朋友,或
义气朋友。这个朋友是与学习有关的朋友,是有志于学问的这么一帮人。古人讲:同门
为朋,同志为友。但,这个同门我们不应该狭隘地去看,同一个师门才叫朋,这个同门
是广义的,同一个学门都叫朋,也就是凡有志于学问的都是朋。朋从远方来,这个远方
有可能指省外、有可能指国外,有可能来自秦国,有可能来自赵国,当然也可能是楚国、
燕国,甚至是偏邦。这些来自不同国度的学人自然带来不同的文化,不同的学问。与他
们在一起交流,吸取新鲜血液,难道不是一件值得庆幸的事吗?按照今天的地理观念,
这个远方为什么不可以指西方,为什么不可以指美国呢?所以,孔子的这第二个窍诀明
明是在讲学习就要善交流,就要有开放。保守和自封会有什么后果呢?孔子告诫说:”
独学而无友,则孤陋而寡闻。”这是第二窍诀。第三窍诀是”人不知而不愠,不亦君子乎”。
这个窍诀也很重要,它讲的是做学问要能耐寂寞。这个窍诀对于做传统的学问,特别是
像中医这样的学问尤其重要。学中医要是不能耐寂寞,三年二年就想出名,就坐不住了,
那我劝你尽早改行,改个什么金融或电子,也许会更适合你。学中医要能够沉潜下来,
十年、二十年人不知你都不愠,这样才有可能学好中医。做学问一要讲兴趣,要有学乐,
学习要想坚持下去就必须有这个东西;二要开放,要交流,不能固步自封,孤陋寡闻;
三是学问要做得深,要真正成为学问家,就必须能耐寂寞。大家想一想,这三条能够少
吗?一条都不能少!从孔子给出的这三大窍诀中,我们可以感受到,儒家文化哪有一点
保守性呢?根本没有!以上我们是讲道理,讲理论依据,下面我们可以摆事实。大家知
道中国文化主要有三大块,就是儒、释、道。其中儒、道是土生土长的本土文化,而释
家则是完完全全的外来文化。三者之中,儒家始终是主导文化。讲三家文化,大家就应
该留意一个问题,释家文化是怎么传入我国的?这个异域文化的传入说明了什么?儒教
祖师孔子出生于公元前551 年,佛教创始人释迦牟尼的出生年代亦大致相近,约在公元
前565 年。佛教最早传入中国的时间,约在公元前2 年,即西汉哀帝元寿元年,距孔子
不过400 余年的时间。这正是儒家文化非常鼎盛的时期,儒家文化是主流文化,皇帝老
子就以这家文化来治理天下。可以说,在这个时期,儒家文化是说话算数的。大家不妨
思考一个极简单的事实,如果儒家文化是一门保守性很强的文化,如果儒家文化固步自
封,那么,在这个时候,佛教这个异域文化有可能传入中国吗?简直一点可能也没有!
就凭这个事实,已经足以说明儒家文化是一门开放性、吸纳性很强的文化。哪有一点保
守可言?说儒家文化保守,很显然,这个儒家文化已然不是孔子所创立的这个文化,而
是被后世的这些徒子徒孙们歪曲了的这个文化,这哪能算是儒家的文化呢?所以,要了
解儒家,就一定要到孔子那里去了解,这才算正宗。同样,要学正宗的中医,也一定要
从经典着手,这就避免了以讹传讹。这是我们强调学习经典的另外一层意义。

(2)古典音乐与流行音乐 谈到经典的特殊,以及它与现代的差别,我们可以作一
个很形象的比较,就是古典音乐与流行音乐的关系。大家可以感受一下,古典音乐与流
行曲在现代是一个什么情况?我们可以设置一个问卷,在年轻人当中,甚至扩大到整个
人群中去调查,看喜欢流行音乐的有多少?喜欢古典音乐的有多少?我感觉这个问卷不
问即知,喜欢流行音乐的占绝大多数,喜欢古典音乐的寥寥无几。大家可以看一看港台
歌星,大陆歌星的演唱会,歌星往台上一站,眼睛一闭,台下人山人海,群情亢奋,有
时简直到了疯狂的地步。而演奏古典音乐呢?情况就大不相同了,演奏厅里静悄悄的,
人也少得多,最多在一曲终了,有些掌声,这个反差太大了。现代的人为什么喜欢流行
歌曲?为什么不喜欢古典音乐?这是非常值得思考的问题,这反映出了现代人的内心世
界。透过这个现象我们可以发现许多问题。流行歌曲在过去叫做下里巴人,它是一种很
浅白的音乐。比如唱爱情的歌,它似乎把什么都唱出来了,爱得死去活来,爱得发疯,
不管你在什么时候,什么心态下,你一听都会知道它是首爱情歌曲。可是古典的音乐呢?
情况就不同了,比如我们听贝多芬的《月光奏鸣曲》,你不静下心来,你不认真的去感受,
你根本就不知道这首乐曲的主题是什么。音乐和歌曲都是为了抒发内心,表达志意。流
行歌曲较古典音乐在表达上虽然更加直截了当,但是,正如古人所说:书不尽言,言不
尽意。对于很深沉的内心世界,对于复杂的感情,这种很浅白的旋律是没有办法表达的。
可是大家为什么还要这样偏爱它呢?从这样一个喜好,我们可以感受到,现代人的浮躁
心理,现代人的急功近利。他们只喜好吹糠见米的东西,做什么都要立马见功,而不愿
意静下心来感受什么,体悟什么,这种情况令人忧心。在中医界,为什么要取消经典?
为什么对经典的重视程度日益下降?中医界的这个情况正好可以用上面这个例子来说
明。经典就好比古典音乐,而现在的这些书籍,包括各种教材,就好比流行歌曲。经典
的东西不像现代的教材这样白,拿起来什么就明了,它需要你去感受,需要你去悟。这
个过程与听受古典音乐十分相近。要真正感悟出”味”来,并不那么容易,而一旦你感悟
出这个”味”了,你才真正知道它的意义,你才知道音乐的真正生命力在古典音乐那里。
同样,中医的真正生命力亦存在经典里面。诸位应该都喝过茶,喝过饮料,
茶与饮料有什么区别呢?饮料很方便,打开来就能喝,而且立马可以尝到它的
滋味。可是茶就不那么方便了,它讲究沏泡,特别是功夫茶,这个过程很讲究,而且味
要慢慢品,这个比饮料要麻烦得多。所以,很多人没这个耐心,宁可去喝饮料。但是,
饮过以后的回味,饮过以后的感受,饮料是没法跟茶比的。相信大家都有过这样的经验。
读经典与读后世的书就有点像品茶与喝饮料,大家可以认真琢磨,看是不是这么回事。
所以,我们不能用喝饮料的眼光去看茶,同样也不能用流行歌曲的标准去衡量古典音乐,
如果我们把茶当成饮料来喝,这个味你是品不出来的。

(3)《中基》能不能取代《内经》 经典为什么要改成选修?甚至很多人干脆主张
取消经典。很重要的一个原因是,他们认为现在不是有《中基》教材吗?《中基》不就
是从《内经》里来的?而且较《内经》更清楚、更明白。所以,《中基》为什么不可以取
代《内经》呢?应该完全可以。《中基》取材于《内经》,这是不争的事实。但是,《中基》
能否真正涵盖《内经》?进而取代之呢?我们想举两个例子来说明。

第一个是病机,病机这个概念是中医一个很关键性的概念,它出自《素问·至真
要大论》。综观《内经》全篇,就是这一章讨论这个问题。这样一个问题放在”至真要”
里来讨论,已足见它的重要性。与之相对应,在《中基》里,病机亦立了专门的章节,
而且在章节下罗列了许多内容。可是你看完这整个章节后,你就会感到这是在挂羊头卖
狗肉。为什么呢?因为真正的《内经》中的病机,它只字不提。用《内经》的病机做名,
可实际上《内经》中那么丰富的病机内容却不提,这个差别大家可以自己去感受,此其
一也。另外,就是《中基》对病机这个概念的解释。这里我们引用它的原文:”病机,即
疾病发生、发展与变化的机理。”病机能不能作机理讲?这个差距有多大?我们可以从文
字上去考究。病,这里当然可以作疾病讲,当然与疾病的发生、发展、变化有关,但是,
“机”作什么讲呢?机是不是机理?我们翻《说文》、翻《康熙》,都看不到这样的解释。
机的原义我们可以从说文那里看到:”主发谓之机。”箭在弦上要发出去,必须拨动这个
机。其他任何事情都是这样,都有一个机,只有触动这个机,事情才会发生,不触动这
个机,其他的条件再多,也没办法引发事件。机就是这么一个东西,它是事情发生的最
关键因素。它是点,不是面。可是触动这个点,就能带动面。所以,病机就是疾病发生、
发展、变化的最关键因素,这个关键与机理显然不是一码事。这就让我们看出了《中基》
与《内经》的不同,《中基》有些时候很难说明《内经》。这是第一个例子。我们靠什么
第二个是”肺主气,肺主治节”。我们首先来看”肺主气”,在《中基》里,这个气指的是
一身之气和呼吸之气。肺所主的这个气究竟是不是指的一身之气和呼吸之气呢?从《内
经》里我们知道,肺主气实际上说的是”肺者,气之本”,这段经文出自《素问·六节藏
象论》里。《六节藏象论》在讲说肺的这一重要功能前,首先探讨了气的概念。让我们来
看一段黄帝与岐伯的对话,黄帝问曰:”愿闻何谓气?请夫子发蒙解惑焉。岐伯曰:此上
帝所秘,先师传之也。帝曰:请遂闻之。岐伯曰:五日谓之候,三候谓之气,六气谓之
时,四时谓之岁,而各从其主治焉。”上面这段对话是很关键的对话,但也不失幽默。黄
帝说我很想知道气这个概念是说的什么,请夫子给我发蒙解惑,好让我清楚它。可这一
问触到了岐伯的难处,这个问题本来不应该轻易说出来,这是”上帝所秘”的东西,是先
师单传下来的,可是碰到黄帝老子问起来,又不能不回答。没办法,只好如实言之。什
么是气呢?五日为一候,三候为一气,也就是十五天,这个十五天的周期就叫做气。大
家算一算一年有多少个”气”呢?一年有二十四个气。原来这个气指的就是节气。这不很
简单吗?现在读小学都能背二十四气歌,翻翻日历我们也知道,2 月4 号立春,再过十
五天就是雨水,再过十五天就是惊蛰,似乎没什么稀奇。可是大家想一想,在当时这可
是一个要命的问题,你如果知道了它,老天的奥秘你就知道了,天地变化的节律你就知
道了。所以,这不是一个小问题。中医一个很重要的特色就是整体观念,天人合一。天
人怎么合一呢?说白了就是天地在变化,人也要跟着变化,这个变化的节律要能够同步。
从上面这个气的概念中,我们知道了天地变化的基本节律就是气,也就是十五天一个变
化,十五天一个变化。在这个节律上,人也要有一个类似的同步变化,这个变化跟上了,
天人就合一了。那么,在人体内,具体是哪个部门负责这个基本节律层次上的天人同步
变化呢?就是肺。所以,肺者,气之本,说的是这么一件事。这个气与呼吸之气,与一
身之气又有什么关联呢?显然没有什么大的关联。。再一个就是”肺主治节”,《中基》里把
这个”治节”说成􀁥”治节”不宜是”治理和调节”,这个差距似乎就更大了。什么是治节呢?
这个概念出于《素问·灵兰秘典论》,它与后面的气之本是相呼
应的。我们前面讲的这个三候为一气,实际还是一个笼统的称呼,细分起来,一个月的
两个气,一个叫节气,一个叫中气。所以,统称为二十四节气。这样一来,我们就知道
了节与气实际上是非常相近的概念。治节当然是治的这个”节”,怎么会扯到治理和调节
的问题?即便它是调节,调节什么呢?有关上面的”肺主气”、”肺主治节”,我们还可以
从其他一些方面来思考。肺处胸中,其外包以肋骨,大家数一数,肋骨有多少根呢?左
十二,右十二,一共是二十四根,正好是二十四节气这个数,这是巧合还是必然呢?是
一年先有二十四节气变化,还是先有二十四根肋骨呢?大家可以思考这个问题。另外,
节与关节也有关联,我们先看一看人的四肢大关节一共有多少?一共有十二个,每一个
关节由两个关节面组成,合起来还是二十四个面,这里一个面与节气相应,一个面与中
气相应。四肢应四时,每一肢有六个关节面,正好应”六气为一时”。关节与节气相关,
与天气变化有关,这是平常老百姓都知道的。我们可以问一问周围上年纪的人,特别是
一些关节有毛病的人,她们对天气变化的敏感程度往往超过气象仪器。气象预报说有雨,
她可以说没雨,结果真的就没雨。她为什么敢这样断言呢?因为她的关节有反应,这个
反应与天气的变化是十分相符的。所以,我们完全可以把关节看做是人体对天气变化的
一个感应器。而这个感应器是由肺来掌管的。弄清了肺与节气的这层关系,肺的意义也
起了根本的变化。天人相应,实际上在很大程度上就落实在这个”肺主气”、”肺主治节”
上面。但是,我们看一看《中基》,却根本没有谈到这方面的问题,如果现在就急着用《中
基》来取代《内经》,大家想一想会是一个什么结局?

6.如何学好经典

(1)直觉与工具的重要   学习经典必须有方法,而基本的一个方法就是要懂得”咬文
嚼字”的借重工具。经典至少产生在东汉以前,由于特殊历史条件的限制,它必须用
很精练的语言文字来表述它那深广的内涵,这是经典的一个特色。我
们现在学习经典,你凭什么去了解经典深广的内涵呢?别无他法,惟有从文字开始。了
解文字就要借重工具。所以,学习中医经典要有像样的工具书,光是《新华字典》还不
够。古人云:文以载道。我们要明白道,当然就要首先知晓文。所以,《康熙字典》始终
是案头翻动最多的一部书。翻弄多了,对文字你就会有感受,你就会觉得中国的文字的
确有很多优越的地方,你就会对它生起感情。中国文字是以象形文字为基础的,很注重
形义之间的关系。所以,看到一个文字,除了查阅工具外,你还要分析它的结构,形部
的结构需要分析,声部的结构也要分析,两者都与义有关联。以”味”字为例,味是由口
去感觉的,所以,它用一个口作形部部首。声部呢?由未组成。义除与形部有关外,
声部似乎有更特殊的关联。。未是十二地支之一,它位于文说
“已是西南方,西南这块地方在五行中属土,属长夏;后天卦中属被广泛确认坤;五藏属
脾。弄清了未的上述涵义,我们就知道”味”字为的观点。这什么要用它来作声部。学过
《中基》我们懂得,脾开窍于口,脾和口方能知五味。也就是说
味觉是由脾来掌管的,而脾属土,土在西南,强调汉字右文(多为声未所属的这个方位
正好是由脾来主理的。所以,用一个未)的语义已然将与脾相关的这样一些生理全
包括进去了。这是其一;其二呢?味在古代涵义很广,在《内经》里称五味,
实际上,凡属食物一类的东西都归于味,当然也包括药物。大家可以考虑,大地生长的
食物,特别是粮食一类,主要成熟于什么时候呢?在长夏。味成熟于长夏,这个成熟显
然又与未有关联。另外,未处西南,在我们国家,西南这个地方由四川所居。四川还有
一个特别的称呼,就是”天府之国”,为什么叫做”天府之国”呢?因为这个地方的物产特
别丰富,味特别丰富。而我们反过来思考,为什么这个地方的物产丰富,味属丰富呢?
因为它属未,属西南,属土,土生万物。所以,从文字的造字,从文字的结构,我们可
以感受到,它里面的涵义太深太深了。像这样一个味字,它的形、声、义结构已然将许
多很深沉的理论包含进去了。一个文字包融这样深广的内涵,这在其他文字是难以做到
的。因此,要想深入经藏,文字就是一块敲门砖,一把钥匙。要解决文字,当然就得
依靠工具,依靠对文字结构的一种慧的直觉。

(2)曾国藩的读经窍诀 对于经典,熟读强识是非常重要的。古人说:读书百遍,
其义自现。这个口诀尤其适用于经典的学习。学后世的书,我们不用读
百遍,有时一遍就行了,而对经典,非读百遍不行,尤其是像《伤寒论》这样的典籍。
有些人读经一二次就想过关。一二次没有感悟,就以为经典没什么,丢在一旁了。这哪
是读经典呢?这是把茶当饮料喝了。你把巴赫的曲子当成了”冬天里的一把火”,你怎么
会感受出味道呢?有关读经,我以为曾国藩的经验很值得借鉴,他在道光二十三年给其
诸弟的一封信中有下面这样一段记述:”穷经必专一经,不可泛骛。读经以研寻义理为本,
考据名物为末。读经有一耐字诀:一句不通,不看下句;今日不通,明日再读;今年不
精,明年再读,此所谓耐也。”曾国藩的这个”耐”字诀,可谓深得读经三昧。当然,对于
曾氏的这个诀我们也可以灵活地看,不一定这句不通,就不读下句。但是,今日不通,
明日再读;今年不精,明年再读,这是一定要做的。总之,读经不是三年、二年的事,
更不是三月、二月、一个学期的事,读经是一辈子的事。经要放在案头,更要常置心头。
经典是一辈子的必修课,你要想真正学好中医,学好经典,就必须做这样的打算。

(3)基本条件 学好经典需要注意的另外一个问题,就是要具备一个基本条件,或
者说一个基本的素质,这就是信受奉行。现在很多人学经典是带着一种批评的眼光来学,
觉得经典这也不科学,那也不科学,你比经典都高明了,那你还学什么经典呢?你以一
种抵触的情绪,认为经典过时了,那你怎么学得进经典?所以,学经典这个态度很重要,
你必须完全地相信它,接受它,然后再思考怎么按照经典的思想去奉行。只有这样,经
典才学得进,只有这样,你才会有收获。经典经过了那么长时间的考验,那么多人依靠
经典成了名医,你有什么担心呢?所以,对于经典完全地可以信受奉行。这里为什么要
提出这个条件和素质呢?因为它太重要了。不具备这个条件,经典的学习整个就成了障
碍。记得在读《本草纲目》的时候,谈到白术这一条时,李时珍引了张锐《鸡峰备急方》
的一则案例:”察见牙齿日长,渐至难食,名曰髓溢病。用白术煎汤,漱服即愈。”大家
看到这个案例,你的第一感觉是什么呢?我想很多人会不相信。牙齿长到一定程度就定
型了,怎么会越长越长,以致进食都困难呢?这太离谱了。即便有这个髓溢病,牙齿那
么坚硬的东西,怎么用白术漱漱口就能缩回去呢?简直太不科学了。但,我不这么想,
我首先是相信它,然后,再来思考它的道理。首先,这个病名很有意思。牙齿为骨之余,
由肾所主。肾主骨生髓,骨与髓乃是异名同类的东西。牙齿日长,就好像是髓满了在往
外溢一样,所以,叫做髓溢病。现在要考虑的是这个牙齿为什么会日渐长长?髓为什么
会往外溢?这一定是约束骨、髓的这个系统出了问题。骨、髓由肾所主,肾为水藏,故
骨髓亦属水类,明白了这层关系,就知道对骨、髓的约束功能是由土系统来完成的,这
亦是前面所讲的土克水。现在土系统出了问题,土虚了,当然就会发生水溢,当然就会
发生髓溢。髓溢了,牙齿自然会日渐变长。这个道理明白了,用白术来补土制水,控制
髓溢,就是十分简单的事了。这是我对髓溢病及其治疗的思考过程。1991 年接治一位跟
骨骨刺的患者,患者的双跟都有骨刺,疼痛厉害,以致足跟不敢落地,要踮起脚来走路,
所以,生活感到很困难。我按常规的思路,用了补肾的方法,也用了活血、除痛、蠲痹
的其他方法,但,都没有获得明显的疗效。正在我感到进退两难的时候,突然想到了上
面的这个案例。骨刺病也叫骨质增生,是由于骨钙流失到骨面,形成骨
性赘生物所致。骨钙流失形成骨性赘生物,这与髓溢有什么差别呢?应该没有差别。于
是我如法炮制,用白术煎汤,让患者浸泡足跟,每日二三次,每次20 分钟。出乎意料,
不数日,痛即大减,足跟能够落地,坚持近月,病即痊愈。上面这个例子给我的感受很
深,什么感受呢?就是对这个”信受奉行”的感受。对这件事我首先是相信了,相信了才
有可能去进行上面的思考。如果对这件事根本不相信,那怎么会有以后的思考?没有这
些思考,就不会想到要用白术来治疗跟骨骨刺。所以,相信是第一,只有这一步做好了,
才有可能为今后的研究带来机会。如果首先就不信受,那一切就被你拒绝了,一切的机
会就没有了。大家想一想是不是这么回事。因此,这一节里讲的这个条件,也是学习中
医必须具备的一个条件。

以上这一章,我们从宏观的方面,理性的方面,和从某些感受上谈了中医学习和研
究的一些基本问题,只有从思想上把这些问题真正解决了,学习中医才没有障碍,学习
经典才没有障碍。

4.学习经典的意义

(1)不是守旧  上面我们从文化层面的角度来谈经典,目的就是想说明,经典的年代
虽然久远,但,它不一定就过时了,就落后了。所以,大家不要轻易地否定它,遗弃它。
不过话又说回来,我们现在强调二千年前的经典,大家还是会担心,这是否在守旧?因
此,对于新、旧这样一个概念,大家还是应该从多层面去看待。张仲景在《伤寒杂病论》
的序言中谈到:”上古有神农、黄帝、岐伯、伯高、雷公、少俞、少师、仲文,中世有长
桑、扁鹊,汉有公乘阳庆及仓公。下此以往,未之闻也。”张仲景在这段文字所显示的资
料,提醒我们注意这样一个问题,为什么正值经典产生,或愈是接近经典的年代,名医、
大师愈多?而为什么一旦远离这个时代,名医、大师就”未之闻也”?这个现象值得我们
去思考。所以,我们现在强调经典的重要,并不是为了其他什么,而是明知我们在时间
上离经典愈来愈远了,但是,能否通过有效的学习,使我们在实质上接近它呢?接近它,
其实就接近了这些大师,我们通过学习经典,最后把我们自己造就成了雷公、少俞、少
师,这有什么不好呢?我想这是我们学习经典的最根本的意义。张仲景在序言的下一段
文字中接着谈到:”观今之医,不念思求经旨,以演其所知,各承家技,始终顺旧。”从
这段文字我们可以看到,仲景在1700 年前已经清楚地说明了什么是守旧,什么是创新。
当时的医生中,各人只抱守家传的一点经验,这就叫守旧;而反过来呢?能够”思求经旨,
演其所知”,这就是创新。所以,我们学习经典,学习《内经》、《伤寒》这些著作,完全
是为了”演其所知”。演是什么意思呢?演就是推演、扩大、发展、延续的意思。能够把
我们那点局限的知识发展、拓宽开来,能够发扬光大它,这个东西就是真正地经旨。
现在我们老说中医要创新才有出路,但你凭什么去创新呢?所以,搞
经典完全不是守旧,而是为了创新。这一你学进去了,你就会有体会,这
个过程究竟是不是创新,你会有感觉,临床实践上也会有印证,光是口说还不行。
我经常谈到,做学问要学会”喜新而不厌旧”,这也是孔子的一个思想。孔子所说的,做
学问的一个关键就是:”学而不思则罔,思而不学则殆。”大家好好琢磨这句话以后再来
做学问,不管你做什么学问,西医也好,中医也好,我看就会有着落。学,学什么呢?
学就是学习过去的、现在以前的东西,实际上就是旧有的东西,只是这个旧的程度有不
同而已。光学现有的东西行不行呢?这种为了学习而学习,孔子认为那是罔然。所以,
光是学了很多东西,知识积累了很多,哪怕你成了一部活字典,那还是不行。有知识,
不一定有学问。古人的这个认识是很有道理的。所以,孔子说学了还要思,思是什么呢?
思就是一个组合的过程,通过这个组合,各种材料,各个部件逐渐碰撞、接触,融合成
新的东西。因此,这个过程实际上就是创新的过程。”喜新”这是每个人的习性,但,新
不能凭空来,新是从旧中来,所以,”思而不学则殆”。没有材料,我们怎么搞建筑?学
习经典亦是如此,要想有收获,就得这样去做。不这样做,光学不思,你哪会有收获,
当然是白打工,罔罔然!现在听许多人说《内经》、《伤寒》没什么,不是丢在一边,就
是束之高阁,心里面很是难过。这样宝贵的东西,他们却说没什么,怎么不叫人痛心。
所以,学经典必须要即思即学,即学即思。

(2)万变不离其经 我们说经典的意义再怎么强调也不过分,这是有实义的。这里
我想给大家讲两个我经历的故事。1998 年上半年,因为一个偶然的机会,结识了南宁附
近宾阳县上的一位老中医,老中医名叫廖炳真,我喜欢称呼他廖老。廖老从医几十年,
在某些病的治疗上有独到的经验,但更使我感到佩服的是廖老的医德与人格,所以,我
很喜欢去拜访廖老。而廖老亦视我为忘年交,有什么心得都毫无保留地传授给我。一次,
廖老给我讲蛇伤的治疗,在旧社会,有些江湖郎中治疗蛇伤往往都会留一手,这一手的
方法很巧妙,让你根本没有办法察觉。郎中给你治蛇伤,很快就把蛇毒治住了,让你没
有生命危险,很多症状也消除了,可就是有一点,伤口老不好,隔上一段时间伤口又腐
烂,你又得到郎中那儿买些药,管上两三个月,就这样拖上一年半载,甚至更长的时间。
在江湖上,这叫郎中钓病人,病人养郎中的招数。但是,这个窍门被廖老从父辈那里探
知了。窍门就在忌盐,如果让病人忌盐几天,再吃上几剂解毒、生肌的药,伤口很快就
长好,而且不再腐烂。就这么一点奥妙,可要是你不知道,你会被折腾得够呛。听过廖
老的这席话后,我就在琢磨,这不就是《内经》的东西吗?《素问·金匮真言论》上说:
“北方黑色,入通于肾,开窍于二阴,藏精于肾,故病在溪,其味咸,其类水,其畜豕。
其谷豆。其应四时,上为辰星,是以知病之在骨也。其音羽,其数六,其臭腐。”肾家的
臭是腐,所以,凡属腐烂一类性质的病变都与肾相关。肾病需要忌盐,”多食盐则伤肾”,
这既是《内经》的教证,也是普通老百姓都知道的常识,蛇伤引起的伤口腐烂,忌盐几
天,再吃几剂普通的中药,伤口便从此愈合,这是一个多么神秘而又极其简单的事实。
经典的东西就是这样,没有揭开时,它非常神秘,揭开了,又这么简单,这就是至道不
繁!这些东西,百姓日用而不知。像这些江湖郎中,他绝不知道,他留的这一手,原来
是《内经》的东西。这就是君子之道。还有一件事,就是廖老治骨癌的经验,骨癌在所
有的癌症里,疼痛是最剧烈的。而且这个疼痛往往很难止住,就是用上麻醉剂,效果也
不见得理想。而廖老对这个疼痛有个撒手锏,虽然骨癌最后不一定都能治好,但是,这
个疼痛却能很快地消除,这就在很大程度上解除了病人的痛苦。廖老用的是什么药呢?
就是在一些草药里面加上一味特殊的东西,然后煎汤外洗患处,洗几次以后疼痛就能逐
渐消除。这味特殊的东西很灵验,加上它就很快止痛,不加它完全没得其用者,腐有这
个效果。这样特殊的东西是什么呢?就是棺木的底板上长出的一种东西。
过去人死了,用的是土葬,把尸体放在棺材里,再埋在土里,埋下去以后,这个尸体就
逐渐腐烂,腐烂的这些东西就往下渗,渗到棺木的底板上,连同木质一同腐坏,上面这
个东西就是感受这个腐气而生的。大家可以闭目沉思片刻,在所有的腐气里面,还有比
人的尸体腐臭更厉害的吗?所以,说到腐字,应该到这里就打止了。既然这个东西是感
受这样一个腐气而生的,那么,按照上述《内经》的教言,它与肾的病变就有一种非常
特殊的亲缘关系,所以,用在骨癌上有这样特殊的疗效。后来我问廖老,是谁告诉您用
这个方法的?廖老也说不出所以然,这个方法既没有传承,也没有理论的依据,廖老只
是觉得骨癌是个怪病,而上述这个东西也是个非常的东西,那就以怪治怪吧,可万没想
到有这样好的效果。当我将上面的那段经文翻给廖老看时,廖老这才恍然大悟,原来这
又是《内经》的东西。上述这两个事例,虽然都比较特殊,但,都可以从《内经》里面
找到教证。当然,这个过程是被动的,事情发生了才去找依据,但这个被动的过程让我
们感受到了经典的内涵,经典的潜力。让我们对经典的每一句话都感到不可小视,如果
我们对经典建立了这样的信心,然后变被动为主动,利用经典去主动思考一些东西,很
多问题就会迎刃而解。所以,我坚信,我们从《内经》里面,必定能够找到解决艾滋病
的方法。另外,我再讲一件相关的事情,几年前有两本书曾经引起很大的轰动,一本是
美国人写的《学习的革命》,一本是日本医学家春山茂雄博士写的《脑内革命》。尤其是
后者引发了世界范围内的脑研究热潮。《脑内革命》这部书的一个焦点问题就是探讨如何
提高大脑的效率,唤醒脑细胞的巨大潜能。而这个焦点又集中在如何引发大脑的α波,
如何激活内啡呔的分泌。在增加内啡呔的分泌,使大脑处于更多α波状态这个关键环节
上,春山茂雄博士总结并提出了许多有效的方法,其中包括运动方面,饮食方法和调节
心身方面。在饮食方面,春山茂雄博士的研究显示,在日本所有的常用食品中,惟独有
一种日本人很钟爱的食品,在促进内啡呔分泌方面独占鳌头。这种食品,类似于中国的
豆豉,就是大豆经过发酵以后制成的,这是日本人每天早餐必备的食品。这种食品为什
么对提高大脑功能有这样独特的作用呢?打开经典我们才发现,答案还是在《内经》里
面。上过《中基》大家都很清楚,这个属于神经系统的脑,与肾的关系最密切,有道是:
“肾主骨生髓,髓通于脑。”所以,要想改善和提高脑的功能,从中医的角度来思考,就
要设法从肾入手。这是一个基本的方向和原则。这个方向确定后,那就好办了。还是上
面的《素问·金匮真言论》的那段话,肾的谷为豆,其臭为腐。肾之谷为豆,这个很好
理解,大家只要拿一颗豆瞧一瞧,你就明白了,豆的外形与肾怎么样?简直一模一样,
只是缩小了。所以,豆与肾有一种非常的关系,这是不难理解的。另外,经过发酵的豆,
使上述这个”亲情”关系又密切了许多。为什么呢?因为发酵,实际上就是一个腐质化的
过程。所以,发酵以后的豆,对肾的作用更大了,对肾的作用大,当然对脑的作用就大,
这就从经典的角度印证了春山茂雄的研究。上面这段短短的经文我们已经用它来说明了
三个事情。当然,还可以继续地说下去,从这个过程,我们应该可以感受到一些经典的
魅力。事情不管你再复杂,不管你再怎么变化,似乎都没有逃出经典,这就叫”万变不离
其经”。

(3)读经开智 讲到经典的意义,我还有一个切身的感受,就是经典与智慧很有关
系,它不仅仅是一个知识问题。如果大家以为研习经典仅仅是为了增加一些知识,那经
典的意义当然就不大了。知识多了不一定就有智慧,知识多了,也不一定学问就高,
这个关系大家应该搞清楚。而读经典却确实能够提高智慧和学问。
所以,我经常说,学问是从读经开始的。在这一点上很多人都有共识。现代的脑科学研
究认为,人的左脑是逻辑脑,主管语言文字、逻辑思维,人类所使用的大部分都是左脑。
而右脑是直觉脑,这右脑大部分时间是在闲置,当然,这与科学讲求逻辑是有关联的。
近些年的脑科学研究表明,人们已渐渐地把目光瞄向右脑这块处女地,如上面提到的春
山茂雄的《脑内革命》就较多地阐述了这个问题。实际上,大脑处在较多的α波状态,
就是一种唤醒激活右脑的状态。对于上述这个左右脑,我喜欢用另外一个概念来描述和
定义。左脑,也就是我们常说的逻辑脑定义为现代脑;右脑,也就是我们常说的直觉脑
定义为传统脑。所以,左右脑之间的关系,实际上就是现代与传统的关系。具体地说,
现代脑的涵义是什么呢?所谓现代脑就是这一世的脑,或者称现世脑,自从你生降到这
个世间,与你相关的一切信息就贮存在这个脑里。所以,如果从信息的角度来看这个左
脑,它的信息容量有多大呢?就与这一辈子的经历有关。经历的时间长短,这个要看每
个人的寿命,经历事情的多少,这个要看每个人的阅历。但,总起来说,与它相关的信
息就只是几十年,至多百年。这是左脑的大体情况。那么,传统脑呢?传统脑的信息要
大得多了,可以说人类历史上所经历的一切,都有可能与右脑发生联系。所以,右脑所
贮存的东西,或者说与右脑发生联系的这些信息,这些经验,就不仅仅是这几十年,这
百年。这个信息关联的跨度可能是几百年、几千年、几万年,甚至若干亿年。而且这个
信息,这个经验不是个体的,有可能是整个人类文明的整合(这有点像道金斯所谓的”
觅母”)。如果我们借用一个藏传佛教的概念,这个右脑,也可以叫做伏藏脑。什么叫伏
藏呢?伏就是埋伏潜藏,藏是宝藏,人类无始以来的文明宝藏都潜伏在这个右脑里。如
果从意识的角度,我们也可以说,人类无始以来的意识宝藏都埋伏潜藏在右脑里。我们
这样来对比左右脑,就知道这个差别太大,大到难以形容的程度。只可惜现在大多数人
没有认识到这一点,他们只知道现代脑,而没能认识传统脑,进而想方设法去开发它。
大家可以思考,认识右脑,进而开发右脑,这是一个什么概念。这是真正地站在了巨人
的肩膀上,我们站在这个基础上往前走,与我们仅仅依靠个体的,非常局限的这几十年,
这是一个什么量级的差别?所以,认识、研究左右脑,这个意义太大了,大家不可小视
它,也不要当作天方夜谭,这绝不是天方夜谭!我们从《脑内革命》的研究,已经可以
看到这方面的可喜苗头。而更值得关注的是,俄罗斯生物学家亚历山大·卡缅斯基在近
期得出结论,人的记忆除了我们所知的神经记忆之外,尚有一种遗传记忆和免疫记忆。
其中,遗传记忆又被称为”自然界的储备基金”,这与我们前面所称的”伏藏脑”有极为相
似的地方。学医的人都大体知道大脑的结构,在左右脑之间有一个沟通和联结两侧大脑
的结构,这个结构叫脑胼结合体。体的存在说明左右脑之间的联系是必然的,右脑的信息
完全可以通过适当的方式交换到左脑而为其所用。所以,传统与现代的结合也是必然的,
这里面有生理结构作基础。我这一节的题目叫”读经开智”,阅读经典为什么能开智慧呢?
其实这个意义就体现在上述这个过程。有效地阅读经典、研究经典,可以帮助我们挖掘伏藏,
可以帮助我们打开上述的伏藏脑,从而让人类文明的共同宝藏源源不断的流向个体。
这个过程如果实现了,大家想想,怎么会没有智慧?怎么会没有学问呢?大家如果从这个高度
去认识经典,经典就有意义了,经典就容易学进去了,这是真正的源远流长啊!
现在许多人会对我们上述的观点嗤之以鼻,因为他们一提到传统就喜
欢跟现代对立起来,以为传统的东西都是阻碍现代的,都应该抛弃。其实,这样的认识
是没有真正地认识好传统。在门外谈传统,对它望而生畏,这种做法是不可取的。台中
师大的王财贵教授有一句话说得非常到位:”凡是将传统看成是包袱的人,不是懦弱者,
就是败家子!”希望大家能以懦弱者和败家子为戒。传统怎么可能是包袱呢?它是资本!
通过适当的”投资”,它可以发展和壮大我们的事业。

3.三种文化

前面我们强调了理论认识的重要性,为什么要强调这个问题呢?因为现在与过去不
同,过去许多名医走上学医的道路,并不先需要一个理性过程,他们是直接从感性开始
的。感性这个东西很奇怪,力量很大,一旦感性的动力确定了,其他问题都好解决。古
人大都是从这上面走上学医道路的。像张仲景一样,他是”感往昔之沦丧,伤夭横之莫救,
乃勤求古训,博采众方”,而《针灸甲乙经》的作者皇甫谧以及其他医家都有类似的情况,
都是从这样一种感性中获得动力,从而发奋学医的。但是,现在大家来分析一下自己,
看看我们有没有这个动力?我看大家并没有这个动力,即便有,也是模糊的。大家看看
自己是怎么到中医学院来的。高考分数达不到清华、北大,达不到重点线,甚至入不了
一般高校,于是就上了中医学院。考分不争气,无可奈何,这就上了中医学院。有没有
能上清华、北大的分数而来报中医学院的呢?我看没有!大家就是以这样一种心态来学
中医的,一种良性的感性动力根本就没有,这个中医怎么能学好?现代科学需我师父曾
经多次跟我谈到,中医不是一般人所能学的东西,必须具有北大、清华这样的素质才有
可能学好中医。而宋代的林亿、高保衡亦持如是观点。他们
在《重广补注黄帝内经素问》序中言:”奈何以至精至微之道,传之以至下至浅之人,其
不废绝,为已幸矣。”现在的情况就是这样,高素质的人对中医不屑一顾,低素质的人,
压根儿又学不好中医,所以,其不废绝,为已幸矣!这种情况如果不从根本上改变,中
医怎么继承?怎么发扬光大?高素质的人为什么瞧不起中医?这与环境的关系很大。现
在大家身边所感受的都是现代文化的气息,都习惯了用一种文化视角去看待问题,去思
考问题,所以,从感性的层面讲,很难产生对传统、对中医有利的动力。正因为如此,
我们强调理性,要从理性的层面来分析,通过这个分析,帮助我们寻找传统的感觉,建
立感性的动力。文化实际上是多元的,不局限在一种模式里,只是现在大家业已习惯了
这么一种模式,就用这么一种模式的东西去看待一切,其实,这是局限的、片面的。大
家现在已经习惯了的这种文化实际上就是现代科学文化,或简称科学文化。这种文化有
它鲜明的特点,就是它的时代性很强,时代进步,它也进步,真可以用日新月异这句话
来形容。大家可以感受一下自己身边的一切是不是这样?看看前十年跟这十年有什么差
别?差别太大了。正因为我们很鲜明地感受到了这一切巨大的变化,所以,我们会很自
然地认为一切文化都是如此,长江后浪推前浪,一代新人胜旧人。时代进步了,一切文
化都在进步,新的文化总比旧的文化强,古老的东西落后于今天的文化,这是必然的。
有了这个认识他们怎么会瞧得上中医?怎么会重视经典?我们说文化的多元性,就是说
文化不仅仅局限在上述这样一个模式里。当然现代科学文化在迄今为止的这样一个阶段
里,都让我们感受到它是随着时代的进步而进步的。是不是其他任何文化都有这个特性
呢?比如艺术文化,是不是时代进步了,艺术这门文化也一定进步了呢?我们不用专门
从事艺术研究,只要粗略地回顾一下中外的艺术历史,就可以确定根本不是这么一回事。
以诗词为例,比如说唐诗,以唐诗这样一种格律体裁的诗,在唐朝这几百年里已占尽风
光,是不是到了宋代,这样一种诗又有进步了,又有发展了?当然不是这样。古人知道,
诗写到唐的份上,诗机已然让他们占尽,要想再超过唐诗,几乎不可能了。于是宋人学
聪明了,他们不再在唐诗里绕圈子,而转往另一个方向,宋词也就这样形成了气候。同
样,元曲也是类似的情况。这是诗词方面。那么,音乐呢?绘画呢?情况也差不多。在
维也纳,每年元旦都要举行新年音乐会,音乐会演奏的都是什么曲目呢?几乎都是大小
施特劳斯的作品。演奏这些曲目并不仅仅为了纪念,作品的水平摆在那儿。像贝多芬、
柴可夫斯基,这样的顶级音乐家所代表的音乐水平,是不是过若干年、几十年、几百年
就一定有发展,就一定会有超过这个水平的音乐出现呢?至少搞音乐的人都很清楚,到
现在还没有出现这样的阶段。音乐也好,绘画也好,诗歌也好,在这些领域的文化,确
实不像科学文化,存在线性发展的规律,它们往往是非线性的。一个高峰出现后,若干
年、几百年,或许会出现另一个高峰,但,这个峰的峰值并不一定能超过前一个。一个
是线性,一个是非线性。一个是直线向前发展,一个是曲线徘徊。很显然,这个文化的
层面和模式都很不相同。除了上面两个层面的文化以外,还有一个特殊的文化,就是古
代形成的一些文化,比如佛教文化。佛教文化诞生于公元前四百余年,由印度的悉达多
太子释迦牟尼所创立。与其他文化,特别是与科学文化截然相反,释迦佛没有预言他所
创立的这门学科会不断发展壮大,相反的,他以一种反常规的模式预言了他的学科的三
个不同阶段,那就是正法时期,象法时期,末法时期。此处我们暂且不去从专业的角度
分析,为什么这样一门特殊的学问会走这样一条不同寻常的路子?这个原因我们暂且不
去讨论。我们只要清楚这个现象是确凿的就行了。另外,像道家的文化,儒家的文化,
实际上,它也跟佛教的这个模式差不多,它也是创立以后就处于实质性的鼎盛阶段,然
后逐渐走向衰落,乃至于到现在名存实亡。所以,文化是多元的,并不仅仅局限在一个
模式里面。若都是以发展的眼光看问题,那也不一定符合事实。在上述这些文化层面里,
中医究竟属于哪一个层面的东西,或者三个层面兼而有之,这一点需要我们开动脑筋去
思考。我的意见,中医至少不是局限在科学文化这一个层面的东西。对于中医,有些时
候需要向前看,有些时候需要向后看。科学主义的我常说,中
医究竟属于什么样的文化,我们观察也许就会有答案。你可以观察,在
你那里,中医究竟是一个什么情况?是发展了,还是倒退了?你是高等学府的毕业生,甚
至还是研究生、博士生,如果你的中医很棒,理论和实践都没有问题,对经典的
理解无有障碍,那也许中医在你那里是发展的,是一种线性的模式。如果情况反过来,
你的中医不怎么样,理论不怎么样,临床也解决不了问题,特别对于经典一窍不通,那
中医在你那里就成问题,就倒退了,就是另外一种模式。所以,在这里要特别强调自知
之明。另外一个重要的问题,就是对于经典的认识,对于经典的评价,那是要讲受用的,
对经典没有觉受,那说出来的必定是空话。所以,我奉劝那些欲对经典发表意见的人,
一定要三思而后言。否则你的底线在哪儿,人家一望便知。对于这个问题的认识,孔子
在《系辞》中的话说得很好:”仁者见之谓之仁,智者见之谓之智,百姓日用而不知,故
君子之道鲜矣。”经典的东西确实是仁者见仁,智者见智。当然,还有一句话,在这里不
好说出来,不过,大家可以仔细去琢磨。仁者见之谓之仁;经典的”仁”、”智”成之谓之智。
另外一个支持经典改选修的依据就是搞民意调者见之谓之查统计,弄几百份,甚至上千份
问卷,要大家在上面打钩或者打”×”,结果许多人的确在经典的一栏里打了”×”,这个结果经过统
计处理好像有意义,因为多数的人认为经典的意义不大,可以改为选修。但是,如果按
照孔子的标准,这样的调查有可能没有丝毫意义。为什么呢?因为这是一门见仁见智的
学问,你是仁者你方能见仁,你是智者,你方能见智,如果你什么都不是,你怎么见得
到经中的”仁”、”智”?那你当然会说经典没啥意义,甚至选修都可以不要。前面我们不
是说学习经典要有觉受吗?觉受没有生起你绝对不会说经典的好话。所以,
这个对象问题很重要,不是你随理解请参看39 页的有关便拿一个人来问话,都可以反映
真实。申说。举个例子,像中国古代的四大文学名著,”三国”、”西游”、”水浒”、”红楼
“,前三部我都读过不只一次,可是”红楼”呢?我很想读它,也看过不少名人的赞许,特
别毛泽东就非常推崇这部名著。可是我每次读它,读到几回,最多十几回就读不下去了,
也不知道什么原因,所以,至今我连这部名著也没能通读一遍,只知道个”赤条条,来去
无牵挂”,设想如果红学的东西问到我,那会是什么结果呢?我前面曾经跟大家介绍过我
们学院的已故名老中医林沛湘教授,在林老那里,现代的内、外、妇、儿这些书可以不
读,但是《内经》却不可以不读。林老不读内、外、妇、儿,他就凭一部《内经》。可是
内、外、妇、儿的病,他都治得很漂亮。如果问卷问到林老那里,大家可以想一想他会
是怎么回答。所以,像经典这样一些见仁见智的学问,我们在征询它的意义时,一定要
注意对象,不是你认为经典没什么就没什么,你认为经典没什么,恰恰证明了你在经典
中没有得到什么。人家下海发了财,成了百万富翁,偏偏你下海不但没赚到钱,反而亏
本,那你当然说下海不好。经典的意义实际上也是这么回事。

三、寻找有效的方法—依靠经典

思想的问题解决了,信心就很自然地会生起来,加上有了师传的条件,那么,剩下
来的,我觉得就是如何去寻找更有效的方法。我有一个认识,中医这门学问,要想真正
搞上去,要想真正抓住她的价值,除了纯粹医学的技术成分外,还应关切和体悟她的科
学层面,哲学层面,以及艺术层面。而要真正地做好这一点,不借重经典是不行的。我
们提出要依靠经典来学好中医,这个方法好像不合符时宜,因为现在大多数中医院校已
将经典改为选修。从必修沦为选修,经典的这个地位大大地下降了。它给人们的信息就
是对于中医的学习来说,经典已经不是必须的了。

为什么会发生经典的这个变动呢?首先一个理由就是中医已经发展了二千年,时代
在进步,一切都在进步,我们为什么一定要死抱住这些经典呢?其次,后世的这些东西,
像现在的《中基》、《方剂》、《诊断》及临床各科不都是从经典里总结出来并赋予了现代
的意义,有这些就足够了,为什么我们还要抱着经典不放?再次就是我们有关部门的调
查统计。这个调查统计显示出很多人都认为经典的学习没有太多的意义,学也可,不学
也没有太大的损失。基于这样一些原因,经典的命运便有了上面这样一个改变。而我的
体会则与上述这个认识截然相反,经典的东西不但不能削弱,而且还应该进一步加强,
为什么呢?下面就来讲述这个依靠经典的理由。

1.历史的经验

经典对于中医的学习和把握究竟重不重要?究竟应不应该必修?这一点如果我们从
历史的角度来看待它,就会很清楚。翻开历史,我们看一看从张仲景开始直到清代,在
这长长一千多年的历史中,凡是在中医这个领域有所成就的医家,我们研究一下他的经
历,就会发现,大多数医家都是从经典中走出来的,大多数医家都是依靠经典而获得了
公认的成就。中医这样一个特殊的历史现象,不得不使我们去思考,经典为什么会具有
如此大的魅力?尽管东汉以后,中医的著述汗牛充栋,尽管这浩如烟海的著述无一不自
称是来自于经典,但是,从一定意义上说,它们无法替代经典,无法超越经典,甚至有
时会成为我们认识经典内涵的障碍。所以,到了清代,陈修园和徐大椿这两位大医家,
竟然呼吁要烧掉后世的这些书。当然,陈、徐的这个观点过于偏激,但却不妨碍我们从
另一个角度认识中医经典的意义。从上面这个历史事实中,我们可以感受到:自古医家
出经典。古人的经历如是,那么,近人、今人呢?只要我们翻阅周凤梧等编著的《名老
中医之路》就会有相同的感受。就以大家最熟悉的蒲辅周老中医为例,蒲老初出茅庐时,
求诊病人颇多,然有效者,亦有不效者。为此,蒲老毅然停诊,闭蒲老的三年门读书三
年。将中医的经典熟读、精思、反复揣摩。三年􀁥闭关。后,复出江湖,遂能于临证得
心应手。以致成为新中国成立后首屈一指的大医家。对这段特殊的经历,蒲老深有感慨
地说:”当时有很多人不了解我的心情,认为我闭户停诊是’高其身价’,实际是不懂得经
典的价值。”无独有偶,著名中医学家秦伯未先生亦强调,要做好一个中医临床医生,每
年应拿出三个月的时间来温习经典。蒲老、秦老的经验与诫训,值得我们重视。已故名
老中医林沛湘教授是我非常景仰的一位老师,林老不但理论上有心得,而且临床的疗效
卓著。临床上除内科疾病外,还善治妇科、儿科,甚至五官科的疾病。但,林老从未读
过内、外、妇、儿、五官这些临床各科的书籍,他就凭一本《内经》治病。在一次讲座
中,林老深有感慨地说:经典的东西,只要有一句话你悟透了,那你
一辈子都吃者的切身受用。不完。”林老的这个意思很清楚,《内经》的东西,一个问题,
一句话你搞明白了,你一辈子都受用无穷。这是经验之谈、这是肺腑之言啊!大家想一
想,这是不是经典独具的魅力呢?一句话悟清了,都吃一辈子,那么,两句话,三句话,
甚至整部《内经》你都搞清了,那会受用多少辈子呢?从林老的这个切身感受,我们看
到经典的这个后延性实在太大太大,它确实是一个早熟的文化,它确实是历久弥新的东
西。

2.扫清认识经典的障碍

要说服大家把这个逐渐被放弃的东西,把这个已经改为选修的东西,重新重视起来,
是不容易的。因为大家已经习惯了用现代科学的思路来思考问题,总认为是长江后浪推
前浪,一代新人胜旧人。我们怎么会认可经典能够超越时空,超越时代,超越后世呢?
这简直是难以置信的,但,又是在传统的许多领域中存在的事实。我们要消除上述这个
认识过程的障碍,仍然还得从理论的构建谈起。前面我们讨论过,中医经典不是光凭一
个理性思考构建的,还有一个内证过程,是两者完美结合的产物。正是这样一个完美的
结合,构成了梁漱溟先生所称之为的—人类未来文化的早熟品。而且这个未来,这个早
熟的跨度异常之大,以至于我们现在还无法完全地理解这个理论,比如说形而上的这个
领域,现代科学的涉及就相当少,很多东西我们无法说明,于是都归之为迷信和伪科学。
实际上,并不是这么回事,只是它已经超出了形而下这个器世界的层面,它的认识半径
不完全局限在形而下这个器世界。所以,你完全地用器世界的眼光来看待它,就难以完
全地发现它。而造成这样一个差异的原因,就在于它的这个实验不是常规的外证实验,
它是内证实验。前面我向大家表述过,内证实验的问题不好谈,但是,􀁥这里是对内要
真心探讨中医,这个问题不得不谈。这个实验不是靠买证实验的进多少设备、多少先进
仪器构建起来的,不是一个有形的实验一步申说,室摆在那儿,让你看得见摸得着。它
完全是通过艰辛训练可以与第而构建起来的,是超越有形的东西。这就关系到一个潜能
的问题。前些天翻阅《发现母亲》这部书,作者叫王东华,这的内容相互部书收集的资
料很丰富。其中一个章节专门谈到人的潜能问题,书中以植物为例,相同的种子,由于
培养的条件不同,培养的过程不同,得出来的结果会相差很多。比如一棵西红柿,我们
在农村呆过的人应该有经验,一棵西红柿能结出多少个果呢?在没看到这则资料以前,
根据我以往的农村经验,我在想,一棵西红柿苗顶多可以结几十、上百个,如果再培育
得好一些,充其量不过几百个吧,可一看到经过日本育种专家所培育的一棵西红柿,竟
然长出一万三千多个果,不禁为之咂舌。当时这棵经特殊培养的西红柿在日本展出,引
起了极大的轰动,创造了一项新的吉尼斯纪录。大家可以思考这个现象,这是什么呢?
这就是潜力!同样一粒种子,由于栽培的方法不同,结果有这样大的差别。从植物种子
所包含的巨大潜力,我们可以联想到,人的潜力有多大?大脑的潜力有多大?这个大是
难以计量的。所以,从理性上我们完全可以推断这个内证实验的存在,经过特殊的”培育
“过程,这个内证的条件是完全可以获得的。有了这个条件,就可以自在地进行建立经典
所需的各种内证实验。内证实验加上理性思考,这个经典就建立起来了。但是,经典的
理论形成以后,后世的人往往就只学习这个理论,而不去亲身感受这个内证实验过程,
久而久之,由于没有有意识地培养这个内证能力,内证的条件逐步丧失,人们甚至不相
信有内证实验的存在。但,在早期,像张仲景的那个时代是不会怀疑这样一个内证实验
的。所以,张仲景在《伤寒论》的序言中以”余宿尚方术,请事斯语”来结尾。张仲景这
里的方术,有很大一部分就是指的内证,这一点是有史可查的。我们可以查阅《汉书》、
《后汉书》的方术列传,就可以知道,方术在很大的程度上是谈内证的术。时代越往后
走,人们对这个内证术,这个内证实验过程就越来越模糊,宋明为什么会有理学产生呢?
很显然,到了这个时候,对内证的认识已经很不清楚了,所以,只能在理上,在思辨上
绕圈子。理学的产生究竟是不是由于内证的失传,这可以从宋明人对”格物致知”的理解
来作出判断。”格物致知”在这里不准备作申说,但有几个基本的原则应该弄清楚。首先”
知”不是通过学习或深入分析而得到的一般性知识。这个知是觉的意思,也就是前面讲的
心明的意态。就是要靠这个心明,这个觉,才能进入内证的状态,才思。
能进行内证实验。那么,这个心明怎么来?通过格物来,格物不是像宋明人说的穷究物
理,格物是要远离物欲(颜习斋”格物”是远尝释格物之”格”同”手格猛兽”之”格”意),这
是一种精神境界,只有获得了这个境界,才有可能进入内证的状态。这个知
“就是致境界。孔子说的”君子食无求饱,居无求安”,智。其实就是讲的
这个境界。《大学》里讲:”知止而后有定,定而后能静,静而后能安,安而后能虑,虑
而后能得。”大家想一想,这个止,这个定,这个静,这个安,如果不”格物”行不行?你
不”食无求饱,居无求安”,成天的物欲横流,想着这个股票要涨了,那个股票要跌了,
你能够止、定、静、安吗?不能的话,怎么能得?怎么致知?在道家那里,老子讲:”
为学日益,为道日损,损之又损,以至于无为。”损什么呢?实际上就是损物、就是格物。
而格物在佛教里,则显然指的是远离一切戏论。所以,格物在儒、释、道里都有所指,
所指的层次虽然有差异,但大体的意义上是相近的,这个与宋明的认识显然是两码事。
要获得内证的能力,格物是一个最基本的条件。这个条件不具备,或者弄错了,内证就
无从谈起。宋明人将格物作细微地分析讲,作穷究讲,仅此一途,已见他们不明内证,
已见他们没有实验了。所以,到现在我们就容易看清楚,为什么中医的有些问题我们不
容易弄明白?为什么我们总是很难正视经典的价值?对中医的很多东西总是抱有怀疑,
为什么呢?因为我们少了内证这只眼睛。这实际上是造成我们认识障碍的一个关键因素。
因此,我们要想对中医,特别是对中医的经典,获得一个比较公正的认识,首先得从思
想上扫清这个障碍。

3.师徒相授

既然传统中医是这样一种学问,它的确有许多有别于现代科学的地方。如果我们照
搬现代科学这样一个教育模式,那势必就会在这个过程中丢失掉许多东西。而丢失掉的
有可能恰恰是传统中医所注重的东西。这就使我们要思考,究竟什么样的教育方式最适
合于中医?

(1)访雨路老师 中医已有二千多年的历史,在学问的传承上有着丰富的经验,有
些经验是值得我们借鉴的,这个经验就是师徒相授。我想这样一种模式比较有利于中医
这样一门特殊学问的传承。这里我先讲个故事,1998 年上半年我到北京开会,到京以后,
就向朋友打听,有没有中医方面的”高手”?当然,我打听”高手”并不是要跟他”过招”,
而是想找个地方讨教。因为自己感觉自己中医的火候还太欠缺,而我的恩师又在1991
年去世了,所以,每到一个地方都很迫切地想找一位高人指点。这个心情有些像金庸武
侠小说中描述的那样。朋友给我介绍了北京中医药大学的雨路老师,雨老是搞温病的,
他是某位著名老中医的开门大弟子。某老是我国老中医里非常了不起的一位,他的父亲、
祖父、曾祖三代皆为朝廷御医,所以,家学渊源很深。雨路老师是个悟性很高的人,而
且勤于表达,随师三年,深得某老家学三昧。但,由于其他各方面的因素,以后的师生
关系处得并不融洽,甚至到了见面都不打招呼的地步。我在拜访雨路老师的时候,他给
我谈到许多学问上的见解,我也请教了不少问题。在临送我出门的时候,雨老师语重心
长地说:”刘老师,中医这个东西要想真正学好来,只有两个字,就是要有’师传’”。这
次造访,给我最深的一个感受就是临别时雨老师送我的这两个字。什么是”师传”呢?师
传是个传统的字眼,就是要有师父的传授。大家想一想,在我们现在这样一个教育规模
里,在我们这样一个教育模式里,有没有”师传”呢?可以说没有师传!这个模式里只存
在工具式的老师,却不存在师父。雨老师与某老的关系有这样不愉快的经历,可是他还
是要送这句话给我,这就说明了师父对他的影响之深。我想雨老师的这句话对中医的学
习、中医的传承,应该是很关键的一个环节。这是我有同感的。

(2)师者,人生之大宝 下面谈谈我的从师经历。现在,我之所以能在这里向大家
谈出一些感受来,能够在中医这门学问里继续不断地钻研下去。从大学毕业到现在已是
廿个春秋了,在这么些春秋里,我能孜孜不倦的学下去,从未回过头、歇过气,不管什
么浪潮,经济浪潮,做官的浪潮,还是西医浪潮,始终都没有打动过我。为什么呢?这
在很大程度上得益于我的师父。我是1983 年毕业后,于1984 年元月8 日拜于我师父门
下的。师父名叫李阳波,现今已经去世十年余。我跟师父整整8 年多的时间,前面的两
年半是跟先师同吃一锅饭、同睡一铺床,有时甚至是通宵达旦地讨论学问。8 年的从师
生活,使我在中医这个领域里开了些窍,也就是师父把我领进门了。常言道:”师父领进
门,修行在个人。”这的确是古今过来人的行话。门确实是需要师父领进的,没有领进门,
你始终是在门外兜圈子,这一点非常重要。有的人为什么努力一辈子还是摸不到”火门”,
有的人为什么在学问之道上坚持不下来,很可能就是因为缺少这样一个关键的环节。现
在回过头来想想跟师父的这个过程,感受是很深的。这个世间的人无不是厌苦求乐的,
你说光是苦没有乐,谁都不想干。所以,光是讲”学海无涯苦作舟”这一句话,已然将很
多人吓在学问门外了。实际上,学问一旦做进去了,一旦进了门,并非全都是苦,至少
是苦乐参半,甚或乐多苦少。所以,《论语》的开首句就是:”学而时习之,不亦说乎。”
而不是:”学而时习之,不亦苦乎。”古来都说”穷学富商”,做学问的必定是穷,做生意
才可能富。但,为什么还会有那么多人搞学问呢?就是因为有这个”不亦说乎”。搞学问
是精神上的富有,搞生意是物质上的富有。能够给人真正带来安乐的,到底是物质还是
精神呢?大家可以思考这个问题。但是,上面这个”不亦说乎”并不是轻易就能得到的,
我想这个正体现了”师传”的意义,师父可以指引你找到这个”说”、这个”乐”。
而在传统文化的其他领域,”师传”的这个意义就为什么要讲更为突出了。这是我在
传统文化,在中医领域里,经历过的究师徒相一个过程,而在这个过程中所得到的上面
这个感受,值得大授?家参考。教育也好,传承也好,它有三方面的意义:一是知识的
传授;一是知识的运用;再一个就是创新。我们说知识,实际上就是指的这一刹那前,
已经知道的这些见识,这些常识。因此,知识实际上是已经过去的东西,我们学习这个
已经过去的、旧的东西,总是会感到厌烦;所以,人总是有喜新厌旧的一面。但是,这
个厌旧的一面是必须克服的,你不学习旧的知识,你怎么可能利用它去开创新知?因此,
搞学问必须做到”喜新而不厌旧”。《论语》中提到做师的一个基本条件,就是”温故而知
新”,”温故而知新,乃可以为师”。”故”是什么,”故”就是旧有的东西,就是知识;”新”
呢?新就是创造。有创造就有新,有新就有乐。所以,你是不是一个称职的老师,就看
你有没有这个东西,你的学问做不做得下去,也要看你有没有这个东西。这个东西是什
么呢?就是学乐!有了学乐,学问之道就会(苟)日新,日日新,你的学问就能深入下
去,就能坚持下去。没有它,学问总是枯燥的,你就会转而去求物质财富,这就转学为
商,下海了,学乐从哪里来呢?从师处来!为师者能够”温故知新”,必能使你也因故
知新,这也是一种克隆。学问传承应该是更值得研究的克隆。

(3)在泸沽湖的意外收获 我的先师是一位了不起的人,他曾使一些非常诋毁中医
的西医人反过来信奉中医。他靠的什么呢?就靠的临床的功夫。但,在我从师以后,先
师的工作重心已经转移,他试图完成爱因斯坦在现代科学领域未完成的任务,企图在传
统文化这个领域建立一个”统一场论”,因此,工作的重心从临床转到了理论的建立。所
以,我从师以后更多得到的是理论上的熏陶,而临床上则感到比较欠缺。先师去世后,
我在理论上仍努力不断在深入,而临床上,总觉得思路打不开,心里没有底,效果不稳
定。有些时候听人说,刘力红真神,那么顽固的病,到他手里,几剂药就好啦,有些时
候却听人议论,刘的理论还可以,临床却不怎么样。对这些情况我内心很清楚,特别对
有些远道而来的病人,人家把全部希望寄托在我身上,可我又未能解决问题时,心里特
别感到困惑和难过。心里明白,我又到了一个坎上了,也许还要有师父的提携才能迈过
去。前面我提到,为什么每到一处就急着打听有没有”高手”呢?其实就是想解决这个问
题。1999 年8 月,我应美国波特兰国立自然疗法学院中医系主任付海呐教授之邀,前往
云川交界之泸沽湖为该系的部分研究生及本科生作《伤寒论》讲座。付海呐是一位汉学
家,为复旦大学的文学博士。学成回美国后,哈佛大学曾聘请他去做教授,可是因为一
个特殊的因缘,他迷恋上了中医,于是他放弃了哈佛大学教授的这个职务。大家应该知
道,在哈佛这样一所大学谋到教授这个职位将意味着什么?可是付博士放弃了这个职位,
而转过来学中医,教授不做,反而来做学生。这个经历对我们这些本来就学中医的人应
该有所触动。我们许多人是被迫学中医,是在痛苦中学中医,而不是有幸能学中医,这
个对比太鲜明了。我在泸沽湖给他们做了十多天的讲座,听讲的这帮人有双博士、有硕
士、有本科生,还有几位根本没接触过中医的诗人、画家。开始几天只安排上午讲,下
午他们自己安排,可三天下来,他们觉得光讲上午不过瘾,要求下午连续讲。十多天讲
座结束了,每个人都依依不舍,都竖起大拇指称我是greatman。这些人的称赞使我又一
次感受到了中国文化的伟大,也使我感到在中西文化的交流上,只要方法恰当,是可以
超越语言文化这个障碍的。在这次讲座中,付博士的感受也非常深。出于感谢,他将他
的学医经历告诉了我,并特别介绍了他的师父曾荣修老中医。曾荣修老中医不是科班出
生,开始是自学中医,以后在文化大革命期间,因为特殊的机缘得以亲近成都名医田八
味。大家听到田八味这个名字一定会感到很刺激,真像有些像金庸武侠小说中的武林高
手。不过,田老师的确是一位医林高手,田老师临证善经方,用药不过八味,故此得名。
田老之临证尤精脉诊,因为应诊者极多,日看三四百,故常无暇问病,而多以脉断之。
有是脉则定是证,而用是方,临床疗效极佳。曾老从师田八味后,也渐渐体悟到脉法的
重要,加之自己的实践琢磨,对《伤寒论》中许多方证的脉象也有了很独到的体会,临
证往往也是有是脉用是方,疗效亦多高出同道。付博士的这番介绍令我兴奋不已,我搞
伤寒虽然多年,在理论上已有一定的感受,但在经方的临床运用上,总觉还不自如。搞
伤寒,却不能用伤寒方,那叫什么搞伤寒?我感到曾老的这些正是我当时最最需要的,
于是我请求付博士,一定要将我引见给他的师父。就这样我们从泸沽湖回到成都之后,
付博士就带我去见了他的老师。见面后我表达了这个拜师的请求,曾老是个直爽的人,
也觉得与我投缘,加上有付海呐的引荐,便欣然接受了我的请求。2000 年11 月,我把
曾老接到广西,跟他抄了一个礼拜方。这一个礼拜的学习对我的帮助太大了,前面所讲
的那个坎,被曾老这一带,就轻轻地迈过来了。使我再一次切身感受到要学好中医,师
父的这个意义太重要了。雨路老师送我的那两个字,真正是他的肺腑之言。经过上面这
个从师过程,现在应用起经方来虽不能说得心应手,但比以往要自如多了,治病的把握
亦与以往不同,从临床的疗效上看,也在稳步上升。前些天为一位同行看病,病的是左
颧部位红肿痒痛,已经用过西药抗菌治疗,但效果欠佳。这么一个病摆在大家面前,你
会怎么思考呢?又是红,又是肿,又是痒,一定是要清热,要解毒,要祛风,要止痒吧,
过去我可能会是这样一个思路。当时我为这位病人号脉,脉浮取可见,但有涩象,不流
利,这是一个什么病呢?这还是一个太阳病,是由于表病汗出不彻,阳气怫郁所致。《伤
寒论》48 条就专门讨论到这个问题,治疗的原则是”更发汗则愈”,于是我开了一个麻黄
桂枝各半汤的原方,一剂药后红肿痛痒消大半,两剂药后平复如初。麻黄汤桂枝汤本来
是治疗感冒的方,你为什么用来治疗我的左颧红肿呢?这位同道感到惊惑不已。的确,
要是在过去,我顶多想到左颧属肝,红肿属热,应该用泻肝的方法。我可能会用龙胆泻
肝汤,而不会想到用这个麻黄桂枝各半汤。我想我今天有这样一个进步,这样一个思路,
与受曾老的指点是分不开的。这一摆又把师传的重要性摆出来了。为什么呢?这确实是
由它这样一门学问的性质所决定的。这样一门特有的学问确实没有现代科学那样的通透
性,特别是在技术的应用上,它不是通过中介来实现的,而必须靠我们这个主体自身去
用功。所以,这样一门学问的教育过程,有些时候确确实实需要言传身教。大家想一想,
这样一种言传身教,没有传统意义上的本质上一对一的师父行不行呢?中医既是形而上
与形而下二合一的学问,它的教育,它的传承就应该围绕这两方面来进行。前面我们已
经谈到过,我们现今所采用的这套教育模式只能适应形而下的部分,那么,形而上的部
分呢?这就要依靠真正意义上的师传,就要依靠师徒授受这样一种古代的模式。所以,
中医的教育应该包括这两种形式。本来研究生招生制度的恢复应是一个可喜的苗头,导
师就有点像是师父。但是,现在看来随着众多名不行了,这个制度已经流于一种形式。
加之具有师传经验􀁥老的谢世,中的导师相继退位,而代之以完全科班出身的。这批人
少有医这种真正师传的法脉,他们很难体会师传,亦不知道何以授徒。现在意义上的的
研究生,不管是硕士这个层次,还是博士这个层次,管导”师”还会有师叫什么呢?叫老
板!为什么叫老板呢?这应该不是偶吗?然,应该事出有因。老板与师父怎么样都想不
到一块来。