游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3006|回复: 6

关于模板缓冲的问题,若能赐教,感激不尽。

[复制链接]

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2006-4-21 11:13:00 | 显示全部楼层 |阅读模式
下面是书上(《OpenGL超级宝典》86面)关于模板缓冲的例子代码(我已上传了此程序的完整代码):
void RenderScene(void)
{
1    GLdouble dRadius = 0.1; // Initial radius of spiral
2    GLdouble dAngle;        // Looping variable
       
    // Clear blue window
3    glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
       
    // Use 0 for clear stencil, enable stencil test
4        glClearStencil(0.0f);
5        glEnable(GL_STENCIL_TEST);
       
    // Clear color and stencil buffer
6    glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
       
    // All drawing commands fail the stencil test, and are not
    // drawn, but increment the value in the stencil buffer.
7        glStencilFunc(GL_NEVER, 0x0, 0x0);
8        glStencilOp(GL_INCR, GL_INCR, GL_INCR);
       
    // Spiral pattern will create stencil pattern
    // Draw the spiral pattern with white lines. We
    // make the lines  white to demonstrate that the
    // stencil function prevents them from being drawn
9    glColor3f(0.3f, 1.0f, 0.5f);
10    glBegin(GL_LINE_STRIP);
11        for(dAngle = 0; dAngle < 400.0; dAngle += 0.1)
12        {
13                glVertex2d(dRadius * cos(dAngle), dRadius * sin(dAngle));
14                dRadius *= 1.002;
15        }
16   glEnd();
       
    // Now, allow drawing, except where the stencil pattern is 0x1
    // and do not make any further changes to the stencil buffer
17        glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
18        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
       
    // Now draw red bouncing square
    // (x and y) are modified by a timer function
19    glColor3f(1.0f, 0.0f, 1.0f);
20    glRectf(x, y, x + rsize, y - rsize);
   
    // All done, do the buffer swap
21  glutSwapBuffers();
}

提问开始,我实在是无法从这里明白模板缓冲是如何运作的:
4        glClearStencil(0.0f);//使用0清除模板有啥意义?
5        glEnable(GL_STENCIL_TEST);

7        glStencilFunc(GL_NEVER, 0x0, 0x0);//将模板缓冲中的值与参考值0x0进行比较,在前面已将模板缓冲清0了,即参考值与模板缓冲的值是相等的,但比较函数又设成GL_NEVER,将颜色缓冲区中的值全部丢弃?不明白!我的脑子真是不好使啊。
8        glStencilOp(GL_INCR, GL_INCR, GL_INCR); //这个也不是很明白,测试失败则增加模板缓冲区中的值?是什么意思?



17        glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
18        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
在这段程序中这是第二次调用这两个函数了。还是有点不明白,请大家指点一下,我好烦哪,拜托!求你们了。

        

sf_2006421111234.rar

86.67 KB, 下载次数:

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2006-4-22 10:39:00 | 显示全部楼层

Re:关于模板缓冲的问题,若能赐教,感激不尽。

自己顶一下

12

主题

162

帖子

175

积分

注册会员

Rank: 2

积分
175
发表于 2006-4-23 12:22:00 | 显示全部楼层

Re:关于模板缓冲的问题,若能赐教,感激不尽

我学过了模板缓存不过是d3d里的,但是看了你的代码发现opengl和d3d的理论都一样只是函数不一样罢了。但是本人才疏学浅,如果哪里有误导还请其他高手指出。

模板缓存的结构:
首先你要知道,模板缓存和深度缓存一样,都只是显存中的一块内存。您应该已经理解了深度缓存吧?也就是对应于每一个象素有一个24位(8位用于模板缓存)或者32位大小的数据表示他在屏幕中的深度,再根据深度判断某个你要渲染的象素是否被覆盖,即是否可见。

模板缓存也是如此,深度值和模板值可以共同存储在一个双字(DWORD)里,其中24位为深度值,8位为模板值。由此你应该有一个印象,模板缓存和深度缓存大致结构是一样的,只是作用不同罢了。

模板缓存的用处:
现在有了上面的知识铺垫,我们来讲解到底模板缓存是用来干什么的。模板缓存是在渲染时用来区域渲染的你要的图形(即有选择的渲染一部分),模板缓存可以用来渲染影子或者镜子里的反射。而一面墙不可能都是镜子,当你的物体移动超过这个镜子可以反射的区域以后,镜子就不会显示了,而如果没有模板缓存的帮助,你无法控制,墙上也会出现你渲染的镜子反射(即墙也变成了镜子)。

模板缓存怎么工作的呢?这个通过Opengl或者D3D的函数我们来理解。因为要回答楼主的问题,我就用opengl来讲解吧。但是我学的是D3D,对于opengl函数没有多理解,我看到上面的程序也满疑惑的,等我查查一些opengl的资料再回复您好吗?我不想自己不懂装懂,影响别人。嘿嘿,对不起。

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2006-4-24 10:55:00 | 显示全部楼层

Re:关于模板缓冲的问题,若能赐教,感激不尽。

非常感谢,期待阁下的回复...

15

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2006-4-24 11:55:00 | 显示全部楼层

Re: 关于模板缓冲的问题,若能赐教,感激不尽。

我看模板缓冲也是刚看,不好意思给不了什么帮助。只能说说我的看法,对于不对请大家和我一起讨论。
我发现每显示一个图形前面都要加这样的语句。
glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
当然,具体的参数是不同的。
模板缓存和颜色缓存一样,都是内存的一个单元,因此在开始使用的时候都要先清除一下,再打开这项功能。因为一开始默认的是关闭的。

15

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2006-4-24 11:58:00 | 显示全部楼层

Re:关于模板缓冲的问题,若能赐教,感激不尽。

请问你的opengl超级宝典里的例子是自己打的还是下载的,我根据书上的网址下不了例子。如过你有可否给我发一份!谢谢!

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2006-4-27 12:47:00 | 显示全部楼层

Re:关于模板缓冲的问题,若能赐教,感激不尽。

你发邮件给我,我给你发过去.
gao_xudong2004@163.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 08:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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