小编The*_*mer的帖子

如何在opengl中实现z-fail算法?

我代码作为NeHe导师Lesson27告诉我,但它是一个z-pass算法.当我在阴影中时,阴影消失.有人告诉我,我可以使用z-fail算法来解决这个问题.所以我花了两天时间来研究z-fail算法.最后,我无法弄明白.我的程序永远不会像我想的那样运行.

作为wiki列出的z-fail算法:

深度失败在2000年左右,有几个人发现Heidmann的方法可以通过反转深度来适用于所有摄像机位置.而不是计算对象表面前面的阴影表面,它后面的表面可以很容易地计算,具有相同的最终结果.这解决了眼睛处于阴影中的问题,因为眼睛和物体之间的阴影体积不计算,但是引入了阴影体积的后端必须加盖的条件,或者阴影将最终丢失在体积指向的位置向后无穷大.

  1. 禁用对深度和颜色缓冲区的写入.

  2. 使用正面剔除.

  3. 将模板操作设置为在深度失败时递增(仅计算对象后面的阴影).

  4. 渲染阴影卷.

  5. 使用背面剔除.

  6. 将模板操作设置为在深度失败时递减.

  7. 渲染阴影卷.

我认为的主要问题是深度测试.在步骤3和6,模板操作基于深度失败.虽然它可以显示阴影,但它可能在它之前的对象上阴影(即:深度缓冲值小于它的对象).所有阴影效果看起来很乱.

但是在z-pass算法中,模板操作基于深度通过,这意味着它不仅可以显示阴影,而且仅在其后面的对象上阴影,符合眼睛系统.

所以如何解决这个问题使我的深度失败算法显示出正确对象的阴影.

这是我的z-fail算法代码(某处可能在哪里,请帮我看看,阴影效果很糟糕)

VECTOR vec;        
void shadowvolume(SECTOR &sec,float *lp)
{
    unsigned int    p1, p2;
    VECTOR          v1, v2;
    int i, j, k, jj;
    for (i=0; i<sec.numplanes;i++)
    {
        if (sec.planes[i].visible)
        {
            for (j=0;j<3;j++)
            {
                k = sec.planes[i].neigh[j];
                if ((!k) || (!sec.planes[k-1].visible))//????k??????????????????????
                {
                    // here we have an edge, we must draw a polygon
                    p1 = sec.planes[i].p[j]-1;//?????
                    jj = (j+1)%3;           
                    p2 = sec.planes[i].p[jj]-1;//?????

                    //calculate the length of the vector
                    v1.x = (sec.points[p1].vec.x …
Run Code Online (Sandbox Code Playgroud)

opengl shadow stencil-buffer

6
推荐指数
1
解决办法
1495
查看次数

应用程序委托在xcode项目中做了什么?

好吧,所以当我创建一个新的可可项目时,总会有2个文件为我创建.这是.h.m NAME AppDelegate文件.我已经阅读了很多关于可可的书和来自苹果的纪录片,它告诉我创建新文件而不是使用它.那两个文件有什么意义呢?删除它们是否安全?

xcode objective-c

5
推荐指数
1
解决办法
1万
查看次数

如何使用NSPointArray?

所以我想appendBezierPathWithPoints:count:在NSBezierPath中使用该方法 .但该方法要求我使用NSPointArray.这部纪录片并没有真正谈论它,我所能得到的只是它是一系列NSPoints,我不知道该怎么做.我认为它使用了c数组机制,但我不确定.

谢谢.

cocoa objective-c nsbezierpath

5
推荐指数
1
解决办法
2915
查看次数

setAcceptsTouchEvents仅在触控板上的手势后才能正常工作

我正在尝试用来setAcceptsTouchEvents:YES识别触控板上的自定义触摸事件.只需触摸触控板即可touchesBeganWithEvent.但是,如果我在触控板上做手势,如捏或滚动touchesBeganWithEvent开始正常工作.经过其中一个手势,即使我只是触摸触控板的touchesBeganWithEvent工作.但我需要使用touchesBeganWithEvent简单的触摸,而无需先做手势.它的方式似乎我必须做一个手势来初始化setAcceptsTouchEvents:YES.我究竟做错了什么?

PS:setAcceptsTouchEvents:YES进入initWithFrame,我可以看到它在应用程序启动时执行.

macos cocoa trackpad objective-c

5
推荐指数
1
解决办法
721
查看次数

setNeedsDisplay:NO是否有任何用处?

在Cocoa中,当我们想要重绘视图时,我们会向视图发送一条setNeedsDisplay:消息,告诉视图使用参数YES重绘自身.我想知道是否有任何情况你想发送一个视图setNeedsDisplay:NO,比如多线程环境,如果发送一个视图a setNeedsDisplay:YES,然后立即再次设置它setNeedsDisplay:NO会使视图重绘自己.如果没有理由打电话setNeedsDisplay:NO,那么为什么要创建这样一个乏味的方法,他们可以在那里实现类似的东西[view redrawView]

cocoa objective-c nsview setneedsdisplay

5
推荐指数
1
解决办法
435
查看次数

cocoa WebView中innerhtml和outerhtml的区别

我在我的应用程序中使用cocoa webview进行富文本编辑.只是与webkit中可用的innerHtml和outerHtml方法混淆.

任何人都可以解释有什么区别

[(DOMHTMLElement *)[[[webView mainFrame] DOMDocument] documentElement] outerHTML];
Run Code Online (Sandbox Code Playgroud)

[(DOMHTMLElement *)[[[webView mainFrame] DOMDocument] documentElement] outerText];
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c webview

5
推荐指数
2
解决办法
2万
查看次数

alloc,retain和copy之间有什么区别

这似乎是一个简单的问题,但我并不知道何时应该使用alloc,retain或copy.

iphone memory-management objective-c

4
推荐指数
1
解决办法
5157
查看次数

核心数据教程

mac/cocoa(不是iphone)有没有好的核心数据教程?

cocoa core-data objective-c

4
推荐指数
1
解决办法
1万
查看次数

你如何获得NSTextStorage/NSString中的单词数量?

所以我的问题基本上是如何获得NSTextStorage/NSString中的单词数量?我不想要字符长度而是字长.谢谢.

cocoa objective-c

3
推荐指数
1
解决办法
2368
查看次数

无法使用变量设置变量长度

我现在要做的是创建一个长度由变量定义的数组.但是,当我将变量放入数组长度时,它给了我一个"可变长度数组的非POD元素类型'glm :: vec2'"错误.但是,如果我用实际数字替换变量,则错误消失.为什么会发生这种情况?我该如何解决这个问题?


int numtriangles = sector1.numtriangles;


glm::vec2 tex[test]; //Using a variable generates an error
glm::vec3 vertices[10]; //No error here

Run Code Online (Sandbox Code Playgroud)

c++ arrays

3
推荐指数
1
解决办法
3771
查看次数