怎样改变OpenGL绘图的背景颜色?使用glClearColor有有关问题
怎样改变OpenGL绘图的背景颜色?使用glClearColor有问题
我用OpenGL绘制了一个三位坐标系和一条曲线的图形,
三个坐标轴的颜色分别是R、G、B,曲线的颜色是yellow的,
背景是黑色的,
现在想把背景改为白色,使用了glClearColor(1.0,1.0,1.0,0.0);
但修改后只有一个白色背景,其他的坐标系和曲线都没有了,
不知道是怎么回事?
请指教!谢谢!
代码如下:
void CTrochoidView::IniOpenGL()
{
m_pDC = new CClientDC(this);
PIXELFORMATDESCRIPTOR pfd;
int n;
//定义一个绘制上下文的句柄
HGLRC hrc;
//初始化过程中主要就是初始化了一个客户区的设备环境指针
ASSERT(m_pDC != NULL);
//建立应用所需的像素格式,并与当前设备上下文相关连
if (!bSetPixelFormat())
return;
//得到指定设备环境的象素模式索引
n = ::GetPixelFormat(m_pDC->GetSafeHdc());
//根据上面得到的索引值来声明一个象素模式
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
//创建一个上下文设备环境
hrc = wglCreateContext(m_pDC->GetSafeHdc());
//将刚生成的设备上下文指针设为当前环境
wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);
//置黑背景
glClearColor(0.0,0.0,0.0,0.0);
//glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
// 设置混色函数取得半透明效果
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
//平滑线条
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
//初始化反走样为 RGBA 模式,同时包括 alpha 混合、提示的设置
// glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glEnable (GL_BLEND);
// 真正精细的透视修正
// glHint (GL_POLYGON_SMOOTH_HINT|GL_LINE_SMOOTH_HINT, GL_NICEST);
//充许深度测试
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
void CTrochoidView::OnDraw(CDC* pDC)
{
CTrochoidDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
GetClientRect(&m_rectClient);
//glClearColor(1.0,1.0,1.0,0.0);
//清除颜色缓冲和深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//用单位矩阵替换当前矩阵
glLoadIdentity();
glTranslatef(m_fMoveX,m_fMoveY,m_fMoveZ);
//旋转角度
glRotatef(m_xRotation, 1.0, 0.0, 0.0);
glRotatef(m_yRotation, 0.0, 1.0, 0.0);
GetDataFromXMLFile(g_app_path); //从XML文件获取数据,参数为XML文件名
glScalef(m_fZoomX, m_fZoomY,m_fZoomZ);
this->DrawCoordinateSystem();
DrawTrochoidLine();
//强制绘图完成
glFinish();
//交换缓冲区数据
SwapBuffers(wglGetCurrentDC());
}
------解决方案--------------------
关闭融合呢?不过,融合默认是glblend(GL_ONE,GL_ZERO),应该是源目标颜色啊就是线的颜色。不明白为什么会出现楼主的效果。
------解决方案--------------------
// TODO: 在此处为本机数据添加绘制代码
GetClientRect(&m_rectClient);
//glClearColor(1.0,1.0,1.0,0.0);
//清除颜色缓冲和深度缓冲
glClear(GL_COLOR_BUFFER_BIT ¦ GL_DEPTH_BUFFER_BIT);
//用单位矩阵替换当前矩阵
glLoadIdentity();
//此处你再设置一下颜色吧,我的理解是此时系统会用你的背景色清除了整个屏幕,它继续画还是使用背景色,所以你看不到画出来的东西
//比如加一句
glClearColor(1.0,1.0,.0,0.0);
//后面继续你的代码
我用OpenGL绘制了一个三位坐标系和一条曲线的图形,
三个坐标轴的颜色分别是R、G、B,曲线的颜色是yellow的,
背景是黑色的,
现在想把背景改为白色,使用了glClearColor(1.0,1.0,1.0,0.0);
但修改后只有一个白色背景,其他的坐标系和曲线都没有了,
不知道是怎么回事?
请指教!谢谢!
代码如下:
void CTrochoidView::IniOpenGL()
{
m_pDC = new CClientDC(this);
PIXELFORMATDESCRIPTOR pfd;
int n;
//定义一个绘制上下文的句柄
HGLRC hrc;
//初始化过程中主要就是初始化了一个客户区的设备环境指针
ASSERT(m_pDC != NULL);
//建立应用所需的像素格式,并与当前设备上下文相关连
if (!bSetPixelFormat())
return;
//得到指定设备环境的象素模式索引
n = ::GetPixelFormat(m_pDC->GetSafeHdc());
//根据上面得到的索引值来声明一个象素模式
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
//创建一个上下文设备环境
hrc = wglCreateContext(m_pDC->GetSafeHdc());
//将刚生成的设备上下文指针设为当前环境
wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);
//置黑背景
glClearColor(0.0,0.0,0.0,0.0);
//glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
// 设置混色函数取得半透明效果
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
//平滑线条
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
//初始化反走样为 RGBA 模式,同时包括 alpha 混合、提示的设置
// glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glEnable (GL_BLEND);
// 真正精细的透视修正
// glHint (GL_POLYGON_SMOOTH_HINT|GL_LINE_SMOOTH_HINT, GL_NICEST);
//充许深度测试
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
void CTrochoidView::OnDraw(CDC* pDC)
{
CTrochoidDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
GetClientRect(&m_rectClient);
//glClearColor(1.0,1.0,1.0,0.0);
//清除颜色缓冲和深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//用单位矩阵替换当前矩阵
glLoadIdentity();
glTranslatef(m_fMoveX,m_fMoveY,m_fMoveZ);
//旋转角度
glRotatef(m_xRotation, 1.0, 0.0, 0.0);
glRotatef(m_yRotation, 0.0, 1.0, 0.0);
GetDataFromXMLFile(g_app_path); //从XML文件获取数据,参数为XML文件名
glScalef(m_fZoomX, m_fZoomY,m_fZoomZ);
this->DrawCoordinateSystem();
DrawTrochoidLine();
//强制绘图完成
glFinish();
//交换缓冲区数据
SwapBuffers(wglGetCurrentDC());
}
------解决方案--------------------
关闭融合呢?不过,融合默认是glblend(GL_ONE,GL_ZERO),应该是源目标颜色啊就是线的颜色。不明白为什么会出现楼主的效果。
------解决方案--------------------
// TODO: 在此处为本机数据添加绘制代码
GetClientRect(&m_rectClient);
//glClearColor(1.0,1.0,1.0,0.0);
//清除颜色缓冲和深度缓冲
glClear(GL_COLOR_BUFFER_BIT ¦ GL_DEPTH_BUFFER_BIT);
//用单位矩阵替换当前矩阵
glLoadIdentity();
//此处你再设置一下颜色吧,我的理解是此时系统会用你的背景色清除了整个屏幕,它继续画还是使用背景色,所以你看不到画出来的东西
//比如加一句
glClearColor(1.0,1.0,.0,0.0);
//后面继续你的代码