社区
游戏开发
帖子详情
OPENGL画图的问题
jiangshx
2004-04-15 02:17:09
先画了一个背景,然后随着鼠标移动,在鼠标当前位置画坐标线(一条横线,一条纵线),我每次都得重画背景,再画线,浪费很多时间,用什么方法不用画背景,而直接画线,是用模板缓存(GL_STENCIL_BUFFER_BIT)吗,我不会用,哪位老大提点一下小弟。
...全文
226
13
打赏
收藏
OPENGL画图的问题
先画了一个背景,然后随着鼠标移动,在鼠标当前位置画坐标线(一条横线,一条纵线),我每次都得重画背景,再画线,浪费很多时间,用什么方法不用画背景,而直接画线,是用模板缓存(GL_STENCIL_BUFFER_BIT)吗,我不会用,哪位老大提点一下小弟。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jiangshx
2004-04-22
打赏
举报
回复
谢谢!
wwwdfq1977
2004-04-20
打赏
举报
回复
顺便说一句:d3d中都是强制采用顶点缓冲,这也是d3d比opengl快的原因之一
wwwdfq1977
2004-04-20
打赏
举报
回复
写错了
'可以向顶点传送很大的数据"应改为"可以向显卡传送很大的数据"
wwwdfq1977
2004-04-20
打赏
举报
回复
好复杂!!,我看的眼睛都花了,没看明白你画了什么,不过,我可以向你如下建议:
1.尽可能避免每一帧都计算,好像你的背景不要每一帧都计算吧,把背景计算好后,存入到一个数组中去,伪代码如下:
if(isComputerBackGround)//只是在需要刷新背景时才计算
{
computeBackGround();//计算好背景,存入数组
isComputerBackGround=false;
}
DrawBackGround();//将数组中的东西画出
2.最好一次尽可能传递尽可能多的数据给显卡,尽可能少的传递数据
例如:glVertex2d传递的是双精度型,它的数据传输量比glvertex2f和glVertexw2i多出一倍
glVertex2xv的效率比glVertex2x高,而使用顶点数组函数glVertexPointer函数一次可以向顶点传送很大的数据,效率远远高出上面的函数,他还可以传递unsigned short型数据,这样数据传送量还可以减少了一倍,关于顶点数组的使用可以看opengl超级宝典或者其他书籍,也可到网上寻找
如果可能,还可采用顶点缓冲(vertex buffer object)将顶点数据缓存在显卡,但是旧的显卡可能不支持,具体使用方法去看www.gameres.com上面的一篇文章
所以你可以先算好顶点数据,存入到一个unsigned short型数组,并用glVertexPointer发送之,而不是采用如下代码
glBegin(GL_LINES);
if(i==0)continue;
if(i%2==0)glVertex2d(42,i);
else glVertex2d(46,i);
glVertex2d(50,i);
glEnd();
这种方法效率极低(不仅每次发送的数据少,而且总的数据发送量还多)
3诸如glEnable(GL_SCISSOR_TEST),glPushAttrib(GL_CURRENT_BIT); 之类能不要就不要(我不知道你要裁剪什么)
jiangshx
2004-04-19
打赏
举报
回复
我也是刚学,所以不知道是不是分不同的表面,还请明白人救命!!
jiangshx
2004-04-19
打赏
举报
回复
我用BCB5.0做的 ,小弟初学,请各位指正
long i,j,x1,y1,x2,y2;
int *listindex;
//分三个区画坐标系,曲线区,横坐标区,纵坐标区
glEnable(GL_SCISSOR_TEST); //*********************曲线区
glScissor(50,25,Pan_Map->ClientRect.Right,(Pan_Map->ClientRect.Bottom-25)*20/22+1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_SCISSOR_TEST);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0,540,0,220); //横坐标0~540,纵坐标0~220
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(50,25,Pan_Map->ClientRect.Right-50,Pan_Map->ClientRect.Bottom-25);
glPushMatrix();
glPushAttrib(GL_CURRENT_BIT);
glColor4ub(0,75,0,128);
glBegin(GL_LINES);
for(i=0;i<201;i+=10){ //20条横线
glVertex2d(0,i);
glVertex2d(540,i);
}
for(i=0;i<541;i+=10){ //54条纵线
glVertex2d(i,0);
glVertex2d(i,200);
}
glEnd();
glEnable (GL_BLEND); //使透明
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA );
glShadeModel(GL_FLAT);
if(fCurve){ //开始画曲线
listindex=new int[curvenum/3];
if(listSelect!=-1){ //最后画选中的曲线
listindex[curvenum/3-1]=listSelect;
for(i=0,j=0;j<curvenum/3;j++){
if(j==listSelect)continue;
listindex[i]=j;i++;
}
}
else{
for(i=0;i<curvenum/3;i++){
listindex[i]=i;
}
}
int icp,icm,icu;
icp=FUNC(currpeak[pType],currs[pType][2]); //峰值
icm=FUNC(currmin[pType],currs[pType][1]); //最小值
icu=FUNC(currunit[pType],currs[pType][0]); //单元值
for(j=0;j<curvenum/3;j++){
if(listindex[j]==listSelect)glLineWidth(2); //选中的曲线宽度为2
if(list[listindex[j]][8]==0){glLineWidth(1);continue;}
SetLineColor(list[listindex[j]][1]); //设置曲线的颜色
glBegin(GL_LINE_STRIP);
for(i=0;i<540;i++){ //540条竖线
if((map_view[listindex[j]][i][0]-(-1))!=0){ //如果有数据画该线
if((map_view[listindex[j]][i][0]-(-100000))==0){
glEnd();
glColor4ub(255,255,255,128);
glBegin(GL_LINE_STRIP);
glVertex2d(i,-1);
glVertex2d(i,200);
break;
}
else{
if((map_view[listindex[j]][i][0]>icp)||(map_view[listindex[j]][i][1]>icp)
||(map_view[listindex[j]][i][2]>icp)||(map_view[listindex[j]][i][3]>icp)){
glColor4ub(255,255,255,128);
glVertex2d(i+1,201);
}
else{
SetLineColor(list[listindex[j]][1]);
glVertex2d(i+1,(map_view[listindex[j]][i][0]-icm)*200/(icu*20));
}
if(map_view[listindex[j]][i][1]!=-1){
glVertex2d(i+1,(map_view[listindex[j]][i][1]-icm)*200/(icu*20));
glVertex2d(i+1,(map_view[listindex[j]][i][2]-icm)*200/(icu*20));
glVertex2d(i+1,(map_view[listindex[j]][i][3]-icm)*200/(icu*20));
}
}
}
}
glEnd();
glLineWidth(1); //默认线宽
}
delete [] listindex;
}
glDisable(GL_BLEND); //取消透明
if(tbarCur->Down&&fMouseOn){ //当前鼠标位置画坐标线 横线和纵线
glColor4ub(0,255,255,128);
glLineStipple(1,0xaaaa); //画虚线
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
x1=(mousepos.x-50)*540/(Pan_Map->ClientRect.Right-50)+1; //算出当前鼠标位置
y1=(Pan_Map->ClientRect.Bottom-mousepos.y-25)*200/((Pan_Map->ClientRect.Bottom-25)*20/22);
glVertex2d(0,y1);
glVertex2d(540,y1);
glVertex2d(x1,0);
glVertex2d(x1,220);
glEnd();
glDisable(GL_LINE_STIPPLE);
}
if(tbarArea->Down){ //画选中区域方框
if(fMouseLeftDown){
glColor4ub(255,0,255,128);
glLineStipple(1,0xaaaa); //画虚线
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINE_LOOP);
x1=(poStart.x-50)*540/(Pan_Map->ClientRect.Right-50)+1; //两个顶点位置
y1=(Pan_Map->ClientRect.Bottom-poStart.y-25)*200/((Pan_Map->ClientRect.Bottom-25)*20/22);
x2=(poEnd.x-50)*540/(Pan_Map->ClientRect.Right-50)+1;
y2=(Pan_Map->ClientRect.Bottom-poEnd.y-25)*200/((Pan_Map->ClientRect.Bottom-25)*20/22);
glVertex2d(x1,y1);
glVertex2d(x1,y2);
glVertex2d(x2,y2);
glVertex2d(x2,y1);
glEnd();
glDisable(GL_LINE_STIPPLE);
}
}
glPopAttrib();
glPopMatrix();
glEnable(GL_SCISSOR_TEST); //*********************横轴区
glScissor(0,0,Pan_Map->ClientRect.Right,25);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_SCISSOR_TEST);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0,54,25,0); //横坐标0~54,纵坐标25~0
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(50,0,Pan_Map->ClientRect.Right-50,25);
glPushMatrix();
glPushAttrib(GL_CURRENT_BIT);
glLoadIdentity();
glColor4ub(0,255,0,128);
glBegin(GL_LINES);
for(i=0;i<54;i++){
if(i==0)continue;
glVertex2d(i,0);
if(i%5==0){
if(i%10==0)glVertex2d(i,8);
else glVertex2d(i,6);
}
else glVertex2d(i,3);
}
glVertex2d(0,0.1);
glVertex2d(540,0.1);
glEnd();
glEnable(GL_SCISSOR_TEST); //*********************纵轴区
glScissor(0,25,50,Pan_Map->ClientRect.Bottom-25);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_SCISSOR_TEST);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0,50,0,22); //横坐标0~50,纵坐标0~22
glMatrixMode(GL_MODELVIEW);
glViewport(0,25,50,Pan_Map->ClientRect.Bottom-25);
glPushMatrix();
glPushAttrib(GL_CURRENT_BIT);
glLoadIdentity();
for(i=0;i<21;i++){
glColor4ub(0,255,0,128);
glBegin(GL_LINES);
if(i==0)continue;
if(i%2==0)glVertex2d(42,i);
else glVertex2d(46,i);
glVertex2d(50,i);
glEnd();
}
glBegin(GL_LINES);
glVertex2d(49.9,0);
glVertex2d(49.9,220);
glEnd();
glPopAttrib();
glPopMatrix();
SwapBuffers(hDC);
wwwdfq1977
2004-04-19
打赏
举报
回复
肯定是每次都要画背景的,即使画背景也应该不会很慢,关键看你怎么画的,你不妨把你画的代码贴出来,否则没有人知道你出了什么问题
模板缓冲的作用是禁止写颜色缓冲,用于制造一些特殊的效果,对你的这个问题应该没用
jiangshx
2004-04-17
打赏
举报
回复
顶
wlpwind
2004-04-17
打赏
举报
回复
不熟,难道opengl不分不同的表面么?
如果分得话很容易,背景和鼠标线分别单独做一个面就可以了
heavenchang
2004-04-17
打赏
举报
回复
不好意思,我也不知道
但我以前用别我东西加了十几张图
也是动态贴图片
我也碰到了运行很慢的情况
后来我在程序一开始就加载了这些图片,这样就快多了
唉
看样子,也帮不了你什么了
heavenchang
2004-04-17
打赏
举报
回复
我想你应先载入buffer,然后再做什么
不然一定耗资源
heavenchang
2004-04-17
打赏
举报
回复
择了要清除的缓存及其清除值后,就可以调用glClear()来完成清除的操作了。这个清除函数为:
void glClaear(Glbitfield mask);
清除指定的缓存。参数mask可以是下面这些位逻辑的或,
GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT
GL_STENCIL_BUFFER_BIT
GL_ACCUM_BUFFER_BIT
这些位逻辑确定所要清除的缓存。注意:GL_COLOR_BUFFER_BIT清除RGBA方式颜色缓存还是清除颜色表方式颜色缓存,要依赖当前系统设置的颜色方式。当清除颜色缓存后,所有启动写操作的颜色缓存都被清除
jiangshx
2004-04-16
打赏
举报
回复
救命的问题,请高手不吝赐教
[RK3128-LINUX] 关于
OpenGL
ES2 实现
画图
相关
问题
有关
OpenGL
ES2 实现
画图
或者刷图的Demo程序
基于MFC的
OpenGL
绘图
一、简介 GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而
OpenGL
则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,
OpenGL
使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,在此线程中其后所有的
OpenGL
命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC
opengl
纹理贴图是黑白的原因
贴图是彩色的,可是贴图后显示的却是黑白的。。。。。 开始不知道什么原因,后来才知道。 贴图图片是我用
画图
板剪切保存为bmp格式创建的 因为剪切的时候是随意裁减的,所以图片宽高的像素值是任意的 而
OPengl
中纹理图像貌似要求宽高像素值是2的倍数。 作此修改后,贴图就没
问题
了。
关于
画图
.
CCRenderTexture 自己的理解 CCRenderTexture类似一张空白的“画布“,用户通过自定义笔刷(CCSprite*),在touch事件中把笔刷的移动痕迹“记录”起来,从而“画”出各种艺术效果。记录方法很简单,首先CCRenderTexture调用自己的begin()函数,开启“记录”功能,然后调用笔刷->visit()把自己”画“在这张画布上,最后CCRenderTe
游戏开发
8,324
社区成员
23,685
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章