小编Eta*_*tan的帖子

使用深度缓冲区和GL_LINES

我想绘制一个删除了隐藏边缘的对象的边缘.我想要应用的想法是首先将对象的面渲染到深度缓冲区,然后在第二次渲染中绘制边缘并启用深度测试.

由于不是所有的三角形边都应该是可见的,所以边是单独存储的(简单示例:在立方体中,对角线边缘不应该是可见的,尽管它们在那里,因为四边形被渲染为两个三角形).因此使用绘制面,使用单独的顶点缓冲区GL_TRIANGLES绘制边GL_LINES.

问题是隐藏边缘部分用此设置显示,可见边缘部分隐藏.我怎样才能取得适当的结果?

  • 没有深度测试:

    没有深度测试

  • 深度测试:

    通过深度测试

  • 渲染到深度缓冲区的面:

    只面对面

我使用带有附加颜色和深度缓冲区的帧缓冲区来绘制我的对象.

// Color buffer setup.
glBindTexture(GL_TEXTURE_2D, objectEdges);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

// Depth buffer setup.
glBindRenderbuffer(GL_RENDERBUFFER, objectFaces);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 640, 360);

// Framebuffer setup.
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, objectEdges, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 
                          GL_RENDERBUFFER, objectFaces);
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
assert(glGetError() == GL_NO_ERROR);
Run Code Online (Sandbox Code Playgroud)

此设置没有任何问题.我绘制我的对象如下:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); …
Run Code Online (Sandbox Code Playgroud)

opengl rendering visibility depth-buffer opengl-es-2.0

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

如何从二进制数据中调用函数

我有一些二进制数据,其中包含一堆函数,并希望调用其中一个.我知道这些函数的签名以及相对于文件开头的偏移量.调用约定是默认约定:__cdecl.该文件已加载到具有执行权限的内存页面中.

例如(A,B,C是一些类型的)

void myFunction (A *arg1, B arg2, C arg3); // Signature
int myOffset = 0x42; // Offset
Run Code Online (Sandbox Code Playgroud)

我该如何指定myOffset要点myFunction

c++ function-pointers

2
推荐指数
1
解决办法
1778
查看次数

缩短字节向量上的push_back系列

在我的代码中,我想使用字节向量将一些数据存储在内存中.问题是,我当前的方法使用了许多代码行:

std::vector<byte> v;
v.push_back(0x13);
v.push_back(0x37);
v.push_back(0xf0);
v.push_back(0x0d);
Run Code Online (Sandbox Code Playgroud)

我怎样才能缩短这个程序,以便我有例如:

std::vector<byte> v(4) = "\x13\x37\xf0\x0d"; // example code - not working
Run Code Online (Sandbox Code Playgroud)

c++ vector

2
推荐指数
1
解决办法
1006
查看次数

在 Swift 中获取 bool 的位模式

在 ObjC 中,可以通过将 bool 类型转换为 UInt8 来检索 bool 的位模式。

例如

  • 真=> 0x01
  • 假=> 0x00

然后可以将该位模式用于进一步的位操作操作。


现在我想在 Swift 中做同样的事情。

到目前为止我所做的工作是

UInt8(UInt(boolValue))
Run Code Online (Sandbox Code Playgroud)

但这看起来并不是首选方法。

我还需要 O(1) 内的转换,而不需要依赖于数据的分支。所以,像下面这样的东西是不允许的。

boolValue ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

另外,是否有一些关于 UInt8 和 UInt 初始值设定项实现方式的文档?例如,如果从 bool 转换的 UInt 初始值设定项使用数据相关分支,我也无法使用它。

当然,后备方法始终是使用进一步的按位运算来完全避免 bool 值(例如,使用 C 中的按位运算符检查数字是否非零)。


  • Swift 是否提供了一种优雅的方式来访问 Bool 的位模式/将其转换为 UInt8,时间复杂度为 O(1),无需数据依赖分支?

int boolean bit-manipulation type-conversion swift

2
推荐指数
1
解决办法
1702
查看次数

将所有函数调用记录到控制台

我经常会通过将每个函数调用记录到控制台并查找错误情况中的差异来开始调试类.是否有一些属性可以应用于类以启用此类跟踪?必须输入这些是非常累人的

Console.WriteLine("classname: methodname")
Run Code Online (Sandbox Code Playgroud)

到每个方法并在之后删除它们(删除可以通过条件编译来完成,但是当你拥有所有这些冗余时查看代码并不是很好)

c# logging trace

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

使非对象资源符合RAII标准

在我的代码中我使用了HANDLEs windows.h.他们像是一样使用

HANDLE h;
if (!openHandleToSomething(arg1, arg2, &h)) {
    throw std::exception("openHandleToSomething error");
}
/* Use the handle in other functions which can throw as well */
if (!CloseHandle(h)) {
    throw std::exception("closeHandle error");
}
Run Code Online (Sandbox Code Playgroud)

如您所见,您必须将此插入CloseHandle到可能在获取和释放过程中发生的每个异常中.因此,你可能会忘记一个(或者有一个你不知道的奇特的SEH异常)并且瞧,你的内存泄漏了.

最近,我已经阅读了RAII,它应该消除这种情况的麻烦,并应CloseHandle自动调用.我也看到std::auto_ptr<someType>C++ 中有类似的东西可以解决分配的资源问题new.

但是,因为我不使用new,因为HANDLE只是typedef编辑void *,我想知道我应该如何使用std::auto_ptr<someType>.不知何故,它应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }).创建一个类将是另一种方法,因为析构函数在其实例超出范围时被调用.然而,为每一件简单的事情设一个课程实在是太过分了.

我该如何解决这些意外的内存泄漏?

请注意,我更喜欢纯C++中没有库和大依赖关系的解决方案,除非它们非常小并且无论如何都要在大多数环境中使用.

c++ raii auto-ptr

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

结构声明中的"解析错误"

我想在C中使用一些基本结构,如下所示:

struct p {
    int a;
    int b;
    p * next;
}
Run Code Online (Sandbox Code Playgroud)

然而,它无法编译与error: parse error before "p"在线p * next;.

你知道这个问题的原因是什么吗?

c gcc struct

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

从其调用方法中使NSTimer无效

我已经使用[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:]安排了一个计时器,并希望在它触发的某个时刻使它无效.

- (id)init
{
    [NSTimer scheduledTimerWithInterval:1 target:self selector:@selector(fired:) userInfo:nil repeats:YES];
}

- (void)fired:(NSTimer *)timer
{
    if (someCondition) {
        [timer invalidate];
    }
}
Run Code Online (Sandbox Code Playgroud)

这是允许的吗?文件说明

您必须从安装了计时器的线程发送此消息.如果从另一个线程发送此消息,则可能无法从其运行循环中删除与计时器关联的输入源,这可能会阻止线程正常退出.

如果这不是完成此任务的正确方法:正确的方法是什么?

multithreading objective-c nstimer ios

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

LNK2019和LNK1120具有模板功能

SO上遇到这两个链接器错误的问题后,我再次使用它们.然而,这一次来源似乎在于另一点.

编译器错误表明它找不到带签名的函数""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const ".

但是,将内容移动myClass.cppmain.cpp工作中.不知道为什么(所有其他内容myClass.cpp都没有这个问题.(其他功能都没有模板化).

myClass.h

#ifndef X
#define X
class MyClass {
public:
    template<class T>
    T myFunction (int someArgument) const;
};
#endif
Run Code Online (Sandbox Code Playgroud)

myClass.cpp

#include "myClass.h"
template<class T>
T MyClass::myFunction (int someArgument) const {
    return T();
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include "myClass.h"
int main () {
    MyClass a();
    a.myFunction<unsigned int>(42);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?

c++ linker-errors

0
推荐指数
2
解决办法
2968
查看次数

LNK2001使用自定义结构的std :: vector

我想要一些数据缓存,其中包含一些我可以通过UpdateCache函数更新的对象.但是,我遇到的问题是a LNK2001后跟a LNK1120.

HeaderFile.h

#ifndef headerfile_included
#define headerfile_included
#include <vector>
struct MyObject {
    unsigned int A;
    unsigned int B;
};
class MyClass {
private:
    static std::vector<MyObject> myObjectCache;
public:
    static void UpdateCache ();
};
#endif
Run Code Online (Sandbox Code Playgroud)

CodeFile.cpp

#include "HeaderFile.h"
void MyClass::UpdateCache () {
    myObjectCache.clear();
    /* Repopulate cache with new data */
}
Run Code Online (Sandbox Code Playgroud)

我从链接获得的错误消息是

错误LNK2001:未解析的外部符号""private:static class std :: vector> MyClass :: myObjectCache"(?myObjectCache @ MyClass @@ 0V?$ vector @ UMyObject @@ V?$ allocator @ UMyObject @@@ std @@@ STD @@ …

c++ stl linker-errors

0
推荐指数
1
解决办法
1369
查看次数

困惑!PHP如果不工作

我有点困惑.可能只是我很厚!基本上,我有以下功能:

// Check if a verified email
function verified($username)
{
    global $conn;
    if($username == '') { return; } 
    $q = $conn->prepare("SELECT * FROM users WHERE Username='".$username."' AND Verified = 1");
    $q->execute();

    return $q->rowCount();
}
Run Code Online (Sandbox Code Playgroud)

然后我的脚本中有以下代码:

if (verified($_SESSION['Username'] == '0')
Run Code Online (Sandbox Code Playgroud)

现在我已经回应了上面的功能并且它0应该返回它应该但是由于某种原因,如果上面似乎并不同意它确实是一个0.我究竟做错了什么?!

php if-statement function

0
推荐指数
1
解决办法
77
查看次数