C++语言,Opengl 中,为什么glclearcolor颜色不能让屏幕变色。

为什么不能画图,opengl,软件是没问题的_百度知道
为什么不能画图,opengl,软件是没问题的
0.h&gt,int y0;#include&lt,x1; dy=y1-y0; gluOrtho2D(0; dx=x1-x0, 150;%d%d&quot.0; glutInitWindowPosition(50;GL&#47,&x1,&y1);=void Bresenham_Line(int x0; glFlush(),GL_ONE_MINUS_SRC_ALPHA);
if(e& }void Bresenham_Line(int x0; glColor3f(1; Bresenham_Line(x0,x;
glPointSize(50);
e=e+2*dy-2* glMatrixMode(GL_PROJECTION), 1;An Example OpenGL Program&quot.h&gt, argv).0, char ** argv){ printf(&quot,int y1){ int dx#include& glLoadIdentity(); for(i=0, 0;
x++;请输入起点坐标;}void lineSegment(void){ glClear(GL_COLOR_BUFFER_BIT).0,y0,&y0); scanf(&quot.0,e; e=2*dy-glut,y1),200;&#47, 0.0),y1.0,300),y);i++) {
/ scanf(&*
glBegin(GL_POINT),int y1),y0;
glBlendFunc(GL_SRC_ALPHA,x1;;
glFlush():&quot,int x1; }}void main(%d %d\n&);,
glBegin(GL_POINT);请输入终点坐标;),100),i;void init(void){ glClearColor(0, 0; y=y0; glutMainLoop();i&lt.0);
glVertex2i(x; glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB),y);
glEnd(),int y0;
glEnable(GL_BLEND), 0;int x0,GL_NICEST),int x1;
printf(&quot, 0; glutInitWindowSize(400,x,y):&quot,y;
e=e+2*).0; printf(&quot.0);/ glutCreateWindow(& init(),&x0; x=x0;=0)
y++.0;点的大小
glEnable(GL_POINT_SMOOTH);
glVertex2i(x;
*/ glutInit(& glutDisplayFunc(lineSegment);;%d%d&
glHint(GL_POINT_SMOOTH_HINT
我有更好的答案
glLoadIdentity().0.0; gluOrtho2D(0.0; glMatrixMode(GL_PROJECTION), 0, 0.0).0, 1;
glMatrixModel(GL_MODELVIEW).0.0; glLoadIdentity(), 150, 0,200void init(void){ glClearColor(0
加上的那个东西是什么啊
你没有设置你的形变函数glReshapeFunc(); glFlush()应该放在最后,glMatrixModel(GL_MODELVIEW)也没有设置
不懂……,求大神指教
Where is your &glutPostRedisplay&?
哪个是什么东西??
其他类似问题
为您推荐:
opengl的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁6224人阅读
Directx/OpenGL(5)
OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能了。
各种流行的图形操作系统,例如Windows系统和Linux系统,都提供了一些功能,以便能够在OpenGL程序中方便的显示文字。
最常见的方法就是,我们给出一个字符,给出一个显示列表编号,然后操作系统由把绘制这个字符的OpenGL命令装到指定的显示列表中。当需要绘制字符的时候,我们只需要调用这个显示列表即可。
不过,Windows系统和Linux系统,产生这个显示列表的方法是不同的(虽然大同小异)。作为我个人,只在Windows系统中编程,没有使用Linux系统的相关经验,所以本课我们仅针对Windows系统。
OpenGL版的“Hello, World!”
写完了本课,我的感受是:显示文字很简单,显示文字很复杂。看似简单的功能,背后却隐藏了深不可测的玄机。
呵呵,别一开始就被吓住了,让我们先从“Hello, World!”开始。
前面已经说过了,要显示字符,就需要通过操作系统,把绘制字符的动作装到显示列表中,然后我们调用显示列表即可绘制字符。
假如我们要显示的文字全部是ASCII字符,则总共只有0到127这128种可能,因此可以预先把所有的字符分别装到对应的显示列表中,然后在需要时调用这些显示列表。
Windows系统中,可以使用wglUseFontBitmaps函数来批量的产生显示字符用的显示列表。函数有四个参数:
第一个参数是HDC,学过Windows GDI的朋友应该会熟悉这个。如果没有学过,那也没关系,只要知道调用wglGetCurrentDC函数,就可以得到一个HDC了。具体的情况可以看下面的代码。
第二个参数表示第一个要产生的字符,因为我们要产生0到127的字符的显示列表,所以这里填0。
第三个参数表示要产生字符的总个数,因为我们要产生0到127的字符的显示列表,总共有128个字符,所以这里填128。
第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。我们可以先用glGenLists申请128个连续的显示列表编号,然后把第一个显示列表编号填在这里。
还要说明一下,因为wglUseFontBitmaps是Windows系统特有的函数,所以在使用前需要加入头文件:#include &windows.h&。
现在让我们来看具体的代码:
/////////////////////////////////////////////
//main.cpp
#include &windows.h&
#include &GL/glut.h&
#include &stdlib.h&
//声明函数原型
void Drawing();
void DrawPolygon(int , int);
void OnMouse(int, int, int, int);
void OnKeyboard(unsigned char, int, int);
void Initialization();
void OnDisplay();
void OnReshape(int , int );
void drawString(const char* str);
//全局变量
int winWidth(500), winHeight(500);
#define MAX_CHAR 128
int main(int argc, char *argv[])
glutInit(&argc, argv);
//初始化opengl
glutInitDisplayMode(GLUT_RGB |GLUT_DOUBLE);
glutInitWindowPosition(0, 0); //窗口位置
glutInitWindowSize(500, 500); //窗口大小
glutCreateWindow(&Demo&); //创建并显示窗口
Initialization();
glutDisplayFunc(OnDisplay);
//设置回调函数
glutReshapeFunc(OnReshape);
//重绘函数
glutMainLoop();
//opengl主循环
//绘图函数
void Drawing()
//显示回调函数
void OnDisplay()
glClear(GL_COLOR_BUFFER_BIT);
Drawing();
glColor3f(0.0f, 0.0f, 0.0f);
//设置字体颜色
glRasterPos2i(0, winHeight-15);
//起始位置
drawString(&
Hello,OpenGL.&);
//输出的字符串
glutSwapBuffers();
//交换前后缓存区
void Initialization()
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置背景色为白色
//重绘回调函数
void OnReshape(int w, int h)
winWidth =
winHeight =
glViewport(0, 0, w, h);
//设置视区大小
glMatrixMode(GL_PROJECTION); //投影模式
glLoadIdentity();
//载入单位矩阵以初始化当前矩阵
gluOrtho2D(0, w, 0, h); //将当前绘图区域设置为二维正交投影
glMatrixMode(GL_MODELVIEW);
//模型视图模式
glLoadIdentity();
//初始化当前矩阵
void drawString(const char* str) //屏幕显示字体
static int isFirstCall = 1;
if (isFirstCall) {
isFirstCall = 0;
// 申请MAX_CHAR个连续的显示列表编号
lists = glGenLists(MAX_CHAR);
// 把每个字符的绘制命令都装到对应的显示列表中
wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
// 调用每个字符对应的显示列表,绘制每个字符
for (; *str != '\0'; ++str) {
glCallList(lists + *str);
在产生显示列表前,Windows允许选择字体。
我做了一个selectFont函数来实现它,大家可以看看代码。
void selectFont(int size, int charset, const char* face) {
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
DeleteObject(hOldFont);
void OnDisplay()
glClear(GL_COLOR_BUFFER_BIT);
Drawing();
selectFont(48, ANSI_CHARSET, &Comic Sans MS&);
//字体可以在系统文件里寻找
glColor3f(0.0f, 0.0f, 0.0f);
//字体颜色
glRasterPos2i(0, winHeight-45);
//起始位置
drawString(&
Hello,OpenGL.&);
//输出的字符串
glutSwapBuffers();
//交换前后缓存区
最主要的部分就在于那个参数超多的CreateFont函数,学过Windows GDI的朋友应该不会陌生。没有学过GDI的朋友,有兴趣的话可以自己翻翻MSDN文档。这里我并不准备仔细讲这些参数了,下面的内容还多着呢:(
如果需要在自己的程序中选择字体的话,把selectFont函数抄下来,在调用glutCreateWindow之后、在调用wglUseFontBitmaps之前使用selectFont函数即可指定字体。函数的三个参数分别表示了字体大小、字符集(英文字体可以用ANSI_CHARSET,简体中文字体可以用GB2312_CHARSET,繁体中文字体可以用CHINESEBIG5_CHARSET,对于中文的Windows系统,也可以直接用DEFAULT_CHARSET表示默认字符集)、字体名称。
原则上,显示中文和显示英文并无不同,同样是把要显示的字符做成显示列表,然后进行调用。
但是有一个问题,英文字母很少,最多只有几百个,为每个字母创建一个显示列表,没有问题。但是汉字有非常多个,如果每个汉字都产生一个显示列表,这是不切实际的。
我们不能在初始化时就为每个字符建立一个显示列表,那就只有在每次绘制字符时创建它了。当我们需要绘制一个字符时,创建对应的显示列表,等绘制完毕后,再将它销毁。
这里还经常涉及到中文乱码的问题,我对这个问题也不甚了解,但是网上流传的版本中,使用了MultiByteToWideChar这个函数的,基本上都没有出现乱码,所以我也准备用这个函数:)
通常我们在C语言里面使用的字符串,如果中英文混合的话,例如“this is 中文字符.”,则英文字符只占用一个字节,而中文字符则占用两个字节。用MultiByteToWideChar函数,可以转化为所有的字符都占两个字节(同时解决了前面所说的乱码问题:))。
转化的代码如下:
// 计算字符的个数
// 如果是双字节字符的(比如中文字符),两个字节才算一个字符
// 否则一个字节算一个字符
for(i=0; str[i]!='\0'; ++i)
if( IsDBCSLeadByte(str[i]) )
// 将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
wstring[len] = L'\0';
// 用完后记得释放内存
free(wstring);
加上前面所讲到的wglUseFontBitmaps函数,即可显示中文字符了。
void OnDisplay()
glClear(GL_COLOR_BUFFER_BIT);
Drawing();
selectFont(48, ANSI_CHARSET, &Comic Sans MS&);
//字体可以在系统文件里寻找
glColor3f(0.0f, 0.0f, 0.0f);
//字体颜色
glRasterPos2i(0, winHeight-45);
//起始位置
drawString(&
Hello,OpenGL.&);
//输出的字符串
selectFont(48, GB2312_CHARSET, &楷体_GB2312&);
glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2f(0, winHeight-120);
drawCNString(&
当代的中国汉字&);
selectFont(48, DEFAULT_CHARSET, &华文仿宋&);
glColor3f(0.0f, 1.0f, 0.0f);
glRasterPos2f(0, winHeight-180);
drawCNString(&
傳統的中國漢字&);
glutSwapBuffers();
//交换前后缓存区
原文来自:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:282691次
积分:3774
积分:3774
排名:第4726名
原创:110篇
评论:53条
(1)(2)(1)(3)(4)(8)(19)(4)(3)(4)(8)(56)(6)OpenGL为什么无法更换glClearColor??_百度知道
OpenGL为什么无法更换glClearColor??
initMatrix(w;}glViewport(0;gluLookAt(glFlush().0f),glClear中有GL_COLOR_BUFFER_BIT;cstdlib&gt,1;glBegin(GL_TRIANGLES),int),是主文件;}void initMatrix(int w,lookatz.0f;glutInitDisplayMode(DIS_MODE).0f),1,0,0,backa);glutDisplayFunc(render),-1;void initGL(),0,eyey,但是没有用.0f);void initView();void initMatrix(void initGLUT(int*;}void startGLUT(){glutReshapeFunc(resize).0f,lookaty,argv),0。我用的是Linux.0f,upx.0f),#include &glVertex3f(1。有两个文件,第一个是initView();glutMainLoop(),void render();glClearColor(initView(),0;return EXIT_SUCCESS;glutCreateWindow(title).glutInitWindowPosition(glEnable(GL_DEPTH_TEST);glHint(GL_PERSPECTIVE_CORRECTION_HINT,#include &initGLUT(&argc,argv);glutSwapBuffers():#include &quot.1f,wndh).0f,upz).0f),w,int h){if(h==0){h=1;glColor3f(0.0f,背景色依旧是黑色,GL_NICEST),backb.h&gluPerspective(45;GL&#47.0f);}void initGLUT(int *argc.0f;glutInitWindowSize(wndw,wndy);startGLUT();}void initView(){glMatrixMode(GL_MODELVIEW).h&}void render(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT),eyez,GLfloat(w/glEnd(),char**).0f;}void resize(glDepthFunc(GL_LESS);glLoadIdentity().0f,int);void startGLUT();glVertex3f(0;void resize(glVertex3f(-1;info,int h){glMatrixMode(GL_PROJECTION)调用了glClearCglClearDepth(1,0.0f,char **argv){glutInit(argc,char **argv){initGL();h);}void initGL(){glShadeModel(GL_SMOOTH),h),h);glLoadIdentity(),100;int main(int argc,图元都可以正常渲染,-1
是我把GLUT和GL的加载顺序弄错了....我知道原因了.
提问者采纳
恭喜 不过 这个问题不要浪费哈 采纳我吧 嘿嘿
来自团队:
其他类似问题
为您推荐:
opengl的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分49阅读权限10帖子精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
白手起家, 积分 49, 距离下一级还需 151 积分
帖子主题精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
论坛徽章:0
slackware13&&学习opengl中如下代码……
#include &GL/glut.h&
#include &math.h&
const int n= 20;
const GLfloat R=0.5;
const GLfloat Pi=3.1415926;
void display(void)
& & & & glClear(GL_COLOR_BUFFER_BIT);
& & & & glBegin(GL_POLYGON);
& && &&&for(i=0;i&n;i++)
& & & & & & & & glVertex2f(R*cos(2*Pi/n*i),R*sin(2*Pi/n*i));
& & & & glEnd();
& & & & glFlush();
int main(int argc,char *argv[])
& & & & glutInit(&argc,argv);
& & & & glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
& & & & glutInitWindowPosition(100,100);
& & & & glutInitWindowSize(400,400);
& & & & glutCreateWindow(&My Firest OpenGL Application&);
& & & & glutDisplayFunc(&display);
& & & & glutMainLoop();
& & & & return 0;
但是结果如下 好像是截屏一样 我画的图形一闪而逝
另外我在windows的虚拟机 (也是slackware 一样的系统)中写相同的代码 可以成功
求高手解释或者解决方法 显卡ati x1350
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分49阅读权限10帖子精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
白手起家, 积分 49, 距离下一级还需 151 积分
帖子主题精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
论坛徽章:0
09:08 锟较达拷
UID空间积分0 积分49阅读权限10帖子精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
白手起家, 积分 49, 距离下一级还需 151 积分
帖子主题精华可用积分49 信誉积分138 专家积分0 在线时间67 小时注册时间最后登录
论坛徽章:0
原谅吧 用import截的图好像不怎样啊…… 悲剧
UID空间积分0 积分317阅读权限20帖子精华可用积分317 信誉积分182 专家积分10 在线时间553 小时注册时间最后登录
稍有积蓄, 积分 317, 距离下一级还需 183 积分
帖子主题精华可用积分317 信誉积分182 专家积分10 在线时间553 小时注册时间最后登录
论坛徽章:0
试试清空背景颜色glClearColor(0.0, 0.0, 0.0, 0.0);锟斤拷锟狡达拷锟斤拷
UID空间积分0 积分62阅读权限10帖子精华可用积分62 信誉积分100 专家积分0 在线时间10 小时注册时间最后登录
白手起家, 积分 62, 距离下一级还需 138 积分
帖子主题精华可用积分62 信誉积分100 专家积分0 在线时间10 小时注册时间最后登录
论坛徽章:0
唉,初始化中加入 glClearColor( 0.0, 0.0, 0.0, 0.0 );
Display 中加入 glColor( 1.0, 0.0, 0.0 );
加菲猫也是猫
UID空间积分0 积分552阅读权限20帖子精华可用积分552 信誉积分3078 专家积分0 在线时间6460 小时注册时间最后登录
丰衣足食, 积分 552, 距离下一级还需 448 积分
帖子主题精华可用积分552 信誉积分3078 专家积分0 在线时间6460 小时注册时间最后登录
认证徽章论坛徽章:100
求IDE环境搭配,,
上海求职要饭,linux mysql cpp php 方向的都可以,希望能兼顾养老需求
UID空间积分0 积分352阅读权限20帖子精华可用积分352 信誉积分270 专家积分0 在线时间322 小时注册时间最后登录
稍有积蓄, 积分 352, 距离下一级还需 148 积分
帖子主题精华可用积分352 信誉积分270 专家积分0 在线时间322 小时注册时间最后登录
论坛徽章:0
& & 在哪个系统,用哪个IDE。。。。
& &以前在某台旧电脑遇过类似问题(绘图不显示,窗格凌乱),
当时换成双缓冲模式刷新就好了 GLUT_DOUBLE
& &还有一种情况是建议使用glutIdleFunc()定义一个闲置时调用的函数,完善一下循环。
加菲猫也是猫
UID空间积分0 积分552阅读权限20帖子精华可用积分552 信誉积分3078 专家积分0 在线时间6460 小时注册时间最后登录
丰衣足食, 积分 552, 距离下一级还需 448 积分
帖子主题精华可用积分552 信誉积分3078 专家积分0 在线时间6460 小时注册时间最后登录
认证徽章论坛徽章:100
vc express 2010
上海求职要饭,linux mysql cpp php 方向的都可以,希望能兼顾养老需求}

我要回帖

更多关于 glclearcolor无效 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信