在view的ondraw里面这样写
void CMyView::OnDraw(CDC* pDC)
{  wglMakeCurrent(m_pDC->m_hDC,m_hRC);
glClearColor(0.2,0.2,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LESS);//
glEnable(GL_DEPTH_TEST); Draw();
glDrawBuffer (GL_BACK);
SwapBuffers(m_pDC->m_hDC);}void draw(void)
{ glClear(GL_COLOR_BUFFER_BIT);
double a[3],b[3],c[3];
a[0]= 0.00000000000000;
a[1]= 0.00000000000000;
a[2]= 0.90909090909091;
b[0]= -0.45454545454545;
b[1]= -0.45454545454545;
b[2]= 0.00000000000000;
c[0]= 0.45454545454545;
c[1]= -0.45454545454545;
c[2]= 0.00000000000000; glBegin(GL_TRIANGLES);
// glNormal3dv(v);
glVertex3dv(a);
glVertex3dv(b);
glVertex3dv(c);
glEnd();

a[0]= 0.00000000000000;
a[1]= 0.00000000000000;
a[2]= 0.90909090909091;
b[0]= 0.45454545454545;
b[1]= 0.45454545454545;
b[2]= 0.00000000000000;
c[0]= -0.45454545454545;
c[1]= 0.45454545454545;
c[2]= 0.00000000000000; glBegin(GL_TRIANGLES);
// glNormal3dv(v);
glVertex3dv(a);
glVertex3dv(b);
glVertex3dv(c);
glEnd(); a[0]= 0.00000000000000;
a[1]= 0.00000000000000;
a[2]= 0.0;
b[0]= 0.45454545454545;
b[1]= 0.45454545454545;
b[2]= 0.00000000000000;
c[0]= -0.45454545454545;
c[1]= 0.45454545454545;
c[2]= 0.00000000000000; glColor3f(1,0,0);
glBegin(GL_QUADS);
glNormal3f(0,0,1);
glVertex3f(1,1,0);
glVertex3f(-1,1,0);
glVertex3f(-1,-1,0);
glVertex3f(1,-1,0);
glEnd(); glFlush();
}
增加了光照,然后用glRotatef()旋转视图,发现z轴的正方向是垂直屏幕向里,正常的话,OpenGL的z轴是向外的。
而我用VC控制台程序重新做了一个类似的,发现结果是正常的。
不知道是不是z缓冲区的事儿?

解决方案 »

  1.   

    没有设置投影和模型矩阵啊,我奇怪的是,
    vc建的win32 console application程序都没有错
    而用单文档却碰到这么怪异的事情
    我把两个都贴出来这个是console的
    /////////////////////////////////////////
    //sample.cpp#include "stdafx.h"
    #include "windows.h"
    #include <GL/gl.h> // OpenGL核心库
    #include <GL/glu.h>// OpenGL实用库
    #include <GL/glaux.h>// OpenGL辅助库
    //
    void myinit(void);
    void CALLBACK display(void);
    void CALLBACK reshape(GLsizei w,GLsizei h);
    void CALLBACK Left1(void);static GLfloat step=0;
    void light();
    void myinit(void)
    {
    //auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
    auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
    auxInitPosition(0,0,500,500);
    auxInitWindow("sample1");
    light();
    }
    void light()
    {
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    //glShadeModel(GL_FLAT);
    //平面不光滑GLfloat position[]={0,1.0,0,0.0};
    GLfloat light_ambient[]={0.3,0.5,0.3};
    GLfloat light_diffuse[]={1.0,1.0,1.0};
    GLfloat light_specular[]={0.8,0.8,0.0};
    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);//首先定义一个材质,定义方法非常类似前面讲到的光源定义。
    GLfloat mat_ambient[]={0.8,0.8,0.8,1.0};
    //定义 紫色 的漫反射特性
    GLfloat mat_diffuse[]={0.8,0.0,0.8,1.0};
    //定义 亮紫色 的镜面反射特性
    GLfloat mat_specular[]={1.0,0.0,1.0,1.0};
    //定义镜面反射的光亮度
    GLfloat mat_shininess[]={50.0};
    //将以上材质定义应用
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);/*
    //这里我们简化光源,以显示材质的效果。
    //这里我们只指定光源位置,其他默认:白色光源。
    //你也可以加入光源的定义,看看光源和材质的合成的效果
    //正是因为它们能够合成,才能产生比真实生活中多的多的效果,这也正是
    //3D技术吸引人的魅力所在。
    GLfloat light_position[]={1.0,1.0,1.0,0.0};
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
    // GLfloat light_diffuse[]={0.0,0.0,1.0,1.0};
    // glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
    //将光源设置应用
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    *///着色消隐
    //*******其实说白乐,这就是大名鼎鼎的 Z-BUFFER 呀************//
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    }
    void CALLBACK reshape(GLsizei w,GLsizei h)
    {
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h)
    glOrtho(-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,
    2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
    else
    glOrtho(-2.0*(GLfloat)h/(GLfloat)w,
    2.0*(GLfloat)h/(GLfloat)w,-2.0,2.0,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();}
    void draw(void)
    { glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_NORMALIZE);
    glBegin(GL_QUADS);
    glNormal3f(0,0,-1);
    glVertex3f(0,0,0);
    glVertex3f(1,0,0);
    glVertex3f(1,1,0);
    glVertex3f(0,1,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(1,0,0);
    glVertex3f(1,0,0);
    glVertex3f(1,1,0);
    glVertex3f(1,1,1);
    glVertex3f(1,0,1);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,1,0);
    glVertex3f(0,1,1);
    glVertex3f(1,1,1);
    glVertex3f(1,1,0);
    glVertex3f(0,1,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(-1,0,0);
    glVertex3f(0,1,1);
    glVertex3f(0,0,1);
    glVertex3f(0,0,0);
    glVertex3f(0,1,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,-1,0);
    glVertex3f(0,0,0);
    glVertex3f(1,0,0);
    glVertex3f(1,0,1);
    glVertex3f(0,0,1);
    glEnd();
    glBegin(GL_QUADS);
    glNormal3f(0,0,1);
    glVertex3f(0,0,1);
    glVertex3f(1,0,1);
    glVertex3f(1,1,1);
    glVertex3f(0,1,1);
    glEnd();/* auxSolidCube(1);*/
    //auxSolidTorus(.7,.5);
    //glPopMatrix();
    glFlush();
    }
    void CALLBACK display(void)
    {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//glPushMatrix();
    //glTranslatef(-0.5,-0.5,-6.0);glRotatef(step,1,0.5,0); draw();
    //glPopMatrix();
    //glFlush();
    auxSwapBuffers();
    }void CALLBACK Left1(void)
    {
    step=-1;
    };
    void CALLBACK R(void)
    {
    step=1;
    }
    void main(void)
    {
    myinit();
    auxKeyFunc(AUX_RIGHT,R);auxKeyFunc(AUX_LEFT,Left1);
    auxReshapeFunc(reshape);
    auxMainLoop(display);
    //auxIdleFunc(display);
    }
    //end of sample
    ////////////////////////////////////////////////////
      

  2.   

    单文档的如下,很容易看出来,我画的正方体应该在平面z=0的前面,而这个却在z=0的后面// VCOpenGLView.cpp : implementation of the CVCOpenGLView class
    //#include "stdafx.h"
    #include "VCOpenGL.h"#include <GL/gl.h> // OpenGL核心库
    #include <GL/glu.h>// OpenGL实用库
    #include <GL/glaux.h>// OpenGL辅助库#include "VCOpenGLDoc.h"
    #include "VCOpenGLView.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLViewIMPLEMENT_DYNCREATE(CVCOpenGLView, CView)BEGIN_MESSAGE_MAP(CVCOpenGLView, CView)
    //{{AFX_MSG_MAP(CVCOpenGLView)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_COMMAND(ID_rotate, On_rotate)
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLView construction/destruction
    void light();
    CVCOpenGLView::CVCOpenGLView()
    {
    m_hGLContext = NULL;
    m_GLPixelIndex = 0;}CVCOpenGLView::~CVCOpenGLView()
    {
    }BOOL CVCOpenGLView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS); 
    return CView::PreCreateWindow(cs);
    }/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLView drawing//DEL void CVCOpenGLView::OnDraw(CDC* pDC)
    //DEL {
    //DEL  CVCOpenGLDoc* pDoc = GetDocument();
    //DEL  ASSERT_VALID(pDoc);
    //DEL  // TODO: add draw code for native data here
    //DEL }/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLView printingBOOL CVCOpenGLView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // default preparation
    return DoPreparePrinting(pInfo);
    }void CVCOpenGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add extra initialization before printing
    }void CVCOpenGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add cleanup after printing
    }/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLView diagnostics#ifdef _DEBUG
    void CVCOpenGLView::AssertValid() const
    {
    CView::AssertValid();
    }void CVCOpenGLView::Dump(CDumpContext& dc) const
    {
    CView::Dump(dc);
    }CVCOpenGLDoc* CVCOpenGLView::GetDocument() // non-debug version is inline
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVCOpenGLDoc)));
    return (CVCOpenGLDoc*)m_pDocument;
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CVCOpenGLView message handlersBOOL CVCOpenGLView::SetFormat(HDC hDC)
    {
    PIXELFORMATDESCRIPTOR pixelDesc;   pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);    pixelDesc.nVersion = 1;    pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |    PFD_DRAW_TO_BITMAP|PFD_SUPPORT_OPENGL|    PFD_SUPPORT_GDI|    PFD_STEREO_DONTCARE;    pixelDesc.iPixelType = PFD_TYPE_RGBA;    pixelDesc.cColorBits = 32;    pixelDesc.cRedBits = 8;    pixelDesc.cRedShift = 16;    pixelDesc.cGreenBits = 8;    pixelDesc.cGreenShift = 8;    pixelDesc.cBlueBits = 8;    pixelDesc.cBlueShift = 0;    pixelDesc.cAlphaBits = 0;    pixelDesc.cAlphaShift = 0;    pixelDesc.cAccumBits = 64;    pixelDesc.cAccumRedBits = 16;    pixelDesc.cAccumGreenBits = 16;    pixelDesc.cAccumBlueBits = 16;    pixelDesc.cAccumAlphaBits = 0;    pixelDesc.cDepthBits = 32;    pixelDesc.cStencilBits = 8;    pixelDesc.cAuxBuffers = 0;    pixelDesc.iLayerType = PFD_MAIN_PLANE;    pixelDesc.bReserved = 0;    pixelDesc.dwLayerMask = 0;    pixelDesc.dwVisibleMask = 0;    pixelDesc.dwDamageMask = 0;       m_GLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc);    if (m_GLPixelIndex==0) // Let's choose a default index.    { m_GLPixelIndex = 1;    if (DescribePixelFormat(hDC, m_GLPixelIndex,    sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)    { return FALSE;    }    }    if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)    { return FALSE;    }    return TRUE; }int CVCOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {if (CView::OnCreate(lpCreateStruct) == -1)    return -1;    HWND hWnd = GetSafeHwnd();    HDC hDC = ::GetDC(hWnd);    if (SetFormat(hDC)==FALSE)    return 0;    if (CreateViewGLContext(hDC)==FALSE)    return 0; 
       light();

    return 0;
    }void CVCOpenGLView::OnSize(UINT nType, int cx, int cy) 
    {
    CView::OnSize(nType, cx, cy); 
    glViewport(0, 0, cx, cy); 
    }
    BOOL CVCOpenGLView::CreateViewGLContext(HDC hDC)


    m_hGLContext = wglCreateContext(hDC);//用当前DC产生绘制环境(RC)      if (m_hGLContext == NULL)      { return FALSE;      }      if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)      { return FALSE;      }      return TRUE;     } void light()
    {
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    //glShadeModel(GL_FLAT);
    //平面不光滑GLfloat position[]={1,1.0,0,0.0};
    GLfloat light_ambient[]={0.3,0.5,0.3};
    GLfloat light_diffuse[]={1.0,1.0,1.0};
    GLfloat light_specular[]={0.8,0.8,0.0};
    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
    glLightfv(GL_LIGHT0,GL_POSITION,position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);//首先定义一个材质,定义方法非常类似前面讲到的光源定义。
    GLfloat mat_ambient[]={0.8,0.8,0.8,1.0};
    //定义 紫色 的漫反射特性
    GLfloat mat_diffuse[]={0.8,0.0,0.8,1.0};
    //定义 亮紫色 的镜面反射特性
    GLfloat mat_specular[]={1.0,0.0,1.0,1.0};
    //定义镜面反射的光亮度
    GLfloat mat_shininess[]={50.0};
    //将以上材质定义应用
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
    //着色消隐
    //*******其实说白乐,这就是大名鼎鼎的 Z-BUFFER 呀************//
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    }void CVCOpenGLView::OnDraw(CDC* pDC) 


    CVCOpenGLDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    wglMakeCurrent(pDC->m_hDC,m_hGLContext);
    glClearColor(0.2,0.2,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glRotatef(10,1,.5,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_NORMALIZE);
    glBegin(GL_QUADS);
    glNormal3f(0,0,-.5);
    glVertex3f(0,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,.5,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(.5,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,.5,0);
    glVertex3f(.5,.5,.5);
    glVertex3f(.5,0,.5);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,.5,0);
    glVertex3f(0,.5,.5);
    glVertex3f(.5,.5,.5);
    glVertex3f(.5,.5,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(-.5,0,0);
    glVertex3f(0,.5,.5);
    glVertex3f(0,0,.5);
    glVertex3f(0,0,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,-.5,0);
    glVertex3f(0,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,0,.5);
    glVertex3f(0,0,.5);
    glEnd();
    glBegin(GL_QUADS);
    glNormal3f(0,0,.5);
    glVertex3f(0,0,.5);
    glVertex3f(.5,0,.5);
    glVertex3f(.5,.5,.5);
    glVertex3f(0,.5,.5);
    glEnd();
    glFlush(); glDrawBuffer (GL_BACK);
    SwapBuffers(pDC->m_hDC);
    }void CVCOpenGLView::On_rotate() 
    {
    CRect client;
    GetClientRect(&client);//获得客户区范围
    InvalidateRect(client,FALSE);
    }
      

  3.   

    void CVCOpenGLView::OnDraw(CDC* pDC) 


    CVCOpenGLDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    wglMakeCurrent(pDC->m_hDC,m_hGLContext);
    glClearColor(0.2,0.2,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glRotatef(10,1,.5,0);   //这一行参数不对。
    glClear(GL_COLOR_BUFFER_BIT);//这行去掉
    glEnable(GL_NORMALIZE);
    glBegin(GL_QUADS);
    glNormal3f(0,0,-.5);
    glVertex3f(0,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,.5,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(.5,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,.5,0);
    glVertex3f(.5,.5,.5);
    glVertex3f(.5,0,.5);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,.5,0);
    glVertex3f(0,.5,.5);
    glVertex3f(.5,.5,.5);
    glVertex3f(.5,.5,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(-.5,0,0);
    glVertex3f(0,.5,.5);
    glVertex3f(0,0,.5);
    glVertex3f(0,0,0);
    glVertex3f(0,.5,0);
    glEnd(); glBegin(GL_QUADS);
    glNormal3f(0,-.5,0);
    glVertex3f(0,0,0);
    glVertex3f(.5,0,0);
    glVertex3f(.5,0,.5);
    glVertex3f(0,0,.5);
    glEnd();
    glBegin(GL_QUADS);
    glNormal3f(0,0,.5);
    glVertex3f(0,0,.5);
    glVertex3f(.5,0,.5);
    glVertex3f(.5,.5,.5);
    glVertex3f(0,.5,.5);
    glEnd();
    glFlush(); glDrawBuffer (GL_BACK);//放的位置不对,先注释掉试试。
    SwapBuffers(pDC->m_hDC);
    }
      

  4.   

    glRotatef(10,1,.5,0);   //这一行参数不对。
    为什么?另外两句我注释掉了,但是还是那样!