我想绘制一个删除了隐藏边缘的对象的边缘.我想要应用的想法是首先将对象的面渲染到深度缓冲区,然后在第二次渲染中绘制边缘并启用深度测试.
由于不是所有的三角形边都应该是可见的,所以边是单独存储的(简单示例:在立方体中,对角线边缘不应该是可见的,尽管它们在那里,因为四边形被渲染为两个三角形).因此使用绘制面,使用单独的顶点缓冲区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) 我有一些二进制数据,其中包含一堆函数,并希望调用其中一个.我知道这些函数的签名以及相对于文件开头的偏移量.调用约定是默认约定:__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
?
在我的代码中,我想使用字节向量将一些数据存储在内存中.问题是,我当前的方法使用了许多代码行:
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)
?
在 ObjC 中,可以通过将 bool 类型转换为 UInt8 来检索 bool 的位模式。
例如
然后可以将该位模式用于进一步的位操作操作。
现在我想在 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 中的按位运算符检查数字是否非零)。
我经常会通过将每个函数调用记录到控制台并查找错误情况中的差异来开始调试类.是否有一些属性可以应用于类以启用此类跟踪?必须输入这些是非常累人的
Console.WriteLine("classname: methodname")
Run Code Online (Sandbox Code Playgroud)
到每个方法并在之后删除它们(删除可以通过条件编译来完成,但是当你拥有所有这些冗余时查看代码并不是很好)
在我的代码中我使用了HANDLE
s 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中使用一些基本结构,如下所示:
struct p {
int a;
int b;
p * next;
}
Run Code Online (Sandbox Code Playgroud)
然而,它无法编译与error: parse error before "p"
在线p * next;
.
你知道这个问题的原因是什么吗?
我已经使用[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)
这是允许的吗?文件说明
您必须从安装了计时器的线程发送此消息.如果从另一个线程发送此消息,则可能无法从其运行循环中删除与计时器关联的输入源,这可能会阻止线程正常退出.
如果这不是完成此任务的正确方法:正确的方法是什么?
在SO上遇到这两个链接器错误的问题后,我再次使用它们.然而,这一次来源似乎在于另一点.
编译器错误表明它找不到带签名的函数""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const "
.
但是,将内容移动myClass.cpp
到main.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)
我该怎么做才能解决这个问题?
我想要一些数据缓存,其中包含一些我可以通过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 @@ …
我有点困惑.可能只是我很厚!基本上,我有以下功能:
// 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
.我究竟做错了什么?!