在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缓冲区的事儿?
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缓冲区的事儿?
解决方案 »
- 如何在VC中通过inf文件安装驱动程序
- 提问OnCancel()、OnClose()
- 如何把.ocx文件转换成cab文件
- MFC DLL扩展DLL中调用ADO m_pCon.CreateInstance(__uuidof(Connection));错误?
- UpdateRegistryAll报错
- 如何在Windows95下使用微软的MSXml?
- VC中是不是不支持read,write啊?
- VC菜鸟:如何响应自定义菜单的消息?
- 求助:怎么可以获取打印机的状态
- 写了近一个月的Shell程序,想好好学学COM了,请有经验的人说说怎样开头?
- 用哪些COM+管理接口,可以生成一个新的COM+应用程序(比如服务器应用程序),取名随便ABC吧,内详
- 用哪些COM+管理接口,可以生成一个新的COM+应用程序(比如服务器应用程序),取名随便ABC吧,内详!
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
////////////////////////////////////////////////////
//#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);
}
{
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);
}
为什么?另外两句我注释掉了,但是还是那样!