游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4309|回复: 9

为什么叫swapbuffers而不叫present

[复制链接]

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2006-12-22 16:01:00 | 显示全部楼层 |阅读模式
opengl里面为什么叫swapbuffer?
可是没有交换什么东西啊。应该是copybuffer吧。

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2006-12-22 16:14:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

比如我

draw A
SwapBuffer
draw B
SwapBuffer

while(1)
SwapBuffer
如果只是交换了BACK和FRONT.那么我就能看来一个FRONT,一个BACK.然后分别是A和B.
但是实际上面不是这样。感觉是把BACK的COPY到FRONT的结果一样。
不明白为什么叫swapbuffer。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-12-24 16:17:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

这个问题,我也很疑惑。
到底总共有几个渲染内存区?

A:有三个:1个是窗口,第二个是BUFFER1,第三个是BUFFER2
B:有两个:1个是窗口,第二个是BUFFER

如果答案是A,那为什么需要两个BUFFER呢?一个也可以防止闪烁啊。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-12-25 17:49:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

一个不能防止,当你在生成 buffer 的时候系统要等待生成完成之后才能绘制,这个时间会造成闪烁。另外 swap 就是交换两个 buffer 指针,至于 copy 到 显示设备,这并不是 cpu 来完成的,而是图形的硬件设备完成。对于 cpu 来说,甚至 gpu 内部来说,仅仅是交换指针而已,所以称之为 swap。建议看一下图形学方面的知识。

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2006-12-25 22:12:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

There's no copy operation proceeded during SwapBuffer but usually just SWAP the buffer by hardware automatically

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2006-12-26 09:57:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

如果真的只是交换指针。BACK变FRONT,FRONT变BACK。


        glDisable(GL_DEPTH_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFinish();
        glClearColor(0.0f, 0.0f, 0.0f, 0.0);                                               
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       
        glColor3f(1,1,1 );//在当前的BACK BUFFER里面画个白色矩形
        glBegin(GL_QUADS);                                                       
        glVertex2f(0,0);               
        glVertex2f(0,1);               
        glVertex2f(1,1);               
        glVertex2f(1,0);                                                                       
        glEnd();
        SwapBuffers(wglGetCurrentDC());//交换BACK和FRONT.按照道路现在的BACK不知道是什么颜色的
        Sleep(100);
        glClearColor(1.0f, 0.0f, 0.0f, 0.0);//clear了                                               
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(0.0,0.9,0.0);//画个绿色的矩形
        glBegin(GL_QUADS);                                                       
        glVertex2f(0,0);               
        glVertex2f(0,-1);               
        glVertex2f(-1,-1);               
        glVertex2f(-1,0);                                                                       
        glEnd();
        SwapBuffers(wglGetCurrentDC());//再交换。那么现在的BACK里面应该是有个白色的矩形。但是没有绿色的,FRONT里面应该就是屏幕上看到的
        Sleep(100);
        while(1)
        {
                glColor3f(0,0,1.0 );//画个蓝色的矩形
                glBegin(GL_QUADS);                                                       
                glVertex2f(0,0);               
                glVertex2f(-1,0);               
                glVertex2f(-1,1);               
                glVertex2f(0,1);                                                                       
                glEnd();
                SwapBuffers(wglGetCurrentDC());//现在应该看到的是2个矩形交替出现
                Sleep(2000);
        }

但是实际上面的结果不是这样的。感觉就根本没有交换。第一个SWAP,看到的是白色黑底,2个是绿色红底。最终结果是蓝色+绿色,红底

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2006-12-26 10:06:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

//初始化
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFinish();


        //
        glClearColor(0.0f, 0.0f, 0.0f, 0.0);        //黑色底                                       
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       
        glColor3f(1,1,1 );//白色
        glBegin(GL_QUADS);        //右上角                                               
        glVertex2f(0,0);               
        glVertex2f(0,1);               
        glVertex2f(1,1);               
        glVertex2f(1,0);                                                                       
        glEnd();
        SwapBuffers(wglGetCurrentDC());//交换
        Sleep(100);


        glClearColor(1.0f, 0.0f, 0.0f, 0.0);        //红色底
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(0.0,0.9,0.0);//绿色
        glBegin(GL_QUADS);//左下角                                                       
        glVertex2f(0,0);               
        glVertex2f(0,-1);               
        glVertex2f(-1,-1);               
        glVertex2f(-1,0);                                                                       
        glEnd();
        SwapBuffers(wglGetCurrentDC());//交换
        Sleep(100);


        while(1)
        {
                glColor3f(0,0,1.0 );//蓝色
                glBegin(GL_QUADS);        //左上角                                               
                glVertex2f(0,0);               
                glVertex2f(-1,0);               
                glVertex2f(-1,1);               
                glVertex2f(0,1);                                                                       
                glEnd();
                SwapBuffers(wglGetCurrentDC());
                Sleep(100);
        }

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-12-26 11:38:00 | 显示全部楼层

Re: Re:为什么叫swapbuffers而不叫present

congy: Re:为什么叫swapbuffers而不叫present
至于 copy 到 显示设备,这并不是 cpu 来完成的,而是图形的硬件设备完成。

那么就是说,如果CPU能控制的话,
用 1个 BUFFER 也可以实现 无闪烁喽?

只有 BUFFER 刷新, 窗口内存仍然是先前的画面
BUFFER -> 窗口内存
只有 BUFFER 刷新, 窗口内存仍然是先前的画面
BUFFER -> 窗口内存

这样可以吗?

13

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2006-12-26 20:25:00 | 显示全部楼层

Re: Re:为什么叫swapbuffers而不叫present

♂樱♀: Re:为什么叫swapbuffers而不叫present

There's no copy operation proceeded during SwapBuffer but usually just SWAP the buffer by hardware a...

设置象素时,可以设置copy或是exchang,但是我发现只有copy有效哈。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-12-27 12:01:00 | 显示全部楼层

Re:为什么叫swapbuffers而不叫present

到底 DOUBLEBUFFER 是几个内存区?

2个还是3个? (注意:窗口也算1个的)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 04:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表