小编Kyl*_*mek的帖子

为什么在opengl投影矩阵中符号很重要

我正在研究计算机视觉问题,需要使用校准相机渲染3d模型.我正在编写一个将校准后的相机矩阵分解为模型视图矩阵和投影矩阵的函数,但是我在opengl中遇到了一个无法解释的有趣现象(至少在我看来).

简短的描述是否定投影矩阵导致没有渲染(至少在我的经验中).我希望将投影矩阵乘以任何标量都没有效果,因为它会转换不受缩放影响的齐次坐标.

以下是我的理由,为什么我发现这是出乎意料的; 也许有人可以指出我的推理存在缺陷的地方.

想象一下以下透视投影矩阵,它给出了正确的结果:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]
Run Code Online (Sandbox Code Playgroud)

乘以相机坐标得到均匀的剪辑坐标:

[x_c]   [ a b c 0 ]   [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c]   [ 0 0 f g ]   [Z_e]
[w_c]   [ 0 0 h 0 ]   [W_e]
Run Code Online (Sandbox Code Playgroud)

最后,为了得到规范化的设备坐标,我们将x_c,y_c和z_c除以w_c:

[x_n]   [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n]   [z_c/w_c]
Run Code Online (Sandbox Code Playgroud)

现在,如果我们否定P,则应该否定得到的剪辑坐标,但由于它们是齐次坐标,因此乘以任何标量(例如-1)不应对得到的标准化设备坐标产生任何影响.但是,在openGl中,否定P会导致无法渲染.我可以将P乘以任何非负标量并获得完全相同的渲染结果,但只要乘以负标量,就不会渲染.这里发生了什么??

谢谢!

opengl graphics projection homogenous-transformation

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

C++ Exp与Log:哪个更快?

我有一个C++应用程序,我需要比较两个值,并决定哪个更大.唯一的复杂因素是一个数字在日志空间中表示,另一个不在.例如:

double log_num_1 = log(1.23);
double num_2 = 1.24;
Run Code Online (Sandbox Code Playgroud)

如果我想比较num_1num_2,我可以选择使用log()或者exp(),我想知道如果有一个更容易计算比其他(即运行在更短的时间,一般).你可以假设我正在使用标准cmath库.

换句话说,以下是语义等价的,因此速度更快:

if(exp(log_num_1) > num_2)) cout << "num_1 is greater";
Run Code Online (Sandbox Code Playgroud)

要么

if(log_num_1 > log(num_2)) cout << "num_1 is greater";
Run Code Online (Sandbox Code Playgroud)

c++ math performance

11
推荐指数
4
解决办法
8396
查看次数

GPU中的图像强度总和

我有一个应用程序,我需要采取图像的平均强度大约100万图像.它"感觉"就像GPU片段着色器的工作,但片段着色器用于每像素本地计算,而图像平均是全局操作.

我考虑的一种方法是将图像加载到纹理中,应用2x2框模糊,将结果加载回N/2 x N/2纹理并重复直到输出为1x1.但是,这将采用着色器的log n应用程序.

有没有办法一次性完成?或者我应该分解并使用CUDA/OpenCL?

opengl gpu image-processing glsl

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

C++中的Yaml Emitter

是否有用于发出YAML的C++库?维基百科提到了libyaml的c ++包装器,但链接已被破坏.官方YAML网站仅提供yaml-cpp,这也是在这个 SO问题中提出的,但cpp-yaml只是一个解析器,而不是发射器.我运气不好吗?

编辑:我正在寻找面向对象的接口,因此需要C++.我知道我可以在C++代码中使用libyaml的C接口,但这并不理想.

c++ yaml yaml-cpp

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

C++——typedef“内部”模板参数?

想象一下,我有一个这样的模板函数:

template<typename Iterator>
void myfunc(Iterator a, typename Iterator::value_type b)
{ ... }
Run Code Online (Sandbox Code Playgroud)

有没有办法通过为 Iterator::valuetype 声明一个 typedef 来实现同样的事情,我可以在函数签名中使用它?例如,我希望能够做这样的事情:

template<
    typename Iterator,
    typedef Iterator::value_type type>
void myfunc(Iterator a, type b)
{ ... }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用默认模板参数和 Boost 概念检查来确保始终使用默认值:

template<
    typename Iterator,
    typename type = typename Iterator::value_type >
void myfunc(Iterator a, type b)
{
     BOOST_STATIC_ASSERT((
         boost::is_same<
             typename Iterator::value_type, 
             type
         >::value
     ));
     ...
}
Run Code Online (Sandbox Code Playgroud)

...但如果语言支持此类事情,那就太好了。

编辑

我可能应该使用类而不是函数,因为默认参数不是函数的标准。

template<
    typename T,
    typename V = typename T::value_type>
class A : public B<T, V>  
{
    BOOST_STATIC_ASSERT((boost::is_same<typename T::value_Type, V>::type));
};
Run Code Online (Sandbox Code Playgroud)

c++ templates typedef

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

模板代码无法编译(延迟查找)

我有两个奇怪的情况,似乎代码应该编译,但它没有.首先,请考虑下面的代码,它成功编译:

struct A
{
    template <class T>
    void member_func(T t)
    {
        global_func(t);
    }
};

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

但是如果我通过前缀"::"完全限定global_func,它就不会编译错误"'global_func'未在此范围内声明":

struct A
{
    template <class T>
    void member_func(T t)
    {
        ::global_func(t);
    }
};

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我尝试将global_func传递给boost :: bind,它不会编译(相同的错误):

#include <boost/bind.hpp>

class A
{
    template <class T>
    void member_func(T t)
    {
        boost::bind(global_func)(t);
    }
};

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

为什么不在这些情况下编译?似乎没有实例化member_func()模板方法,因此它不应该找到缺少的函数错误.

c++ templates compilation

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

为什么Ruby认为公元100年有366天?

下面的表达式在Ruby中返回'366',暗示100 AD是闰年(它不是):

(Date.ordinal(101) - Date.ordinal(100)).to_i
Run Code Online (Sandbox Code Playgroud)

与DateTime相同.

但是,Date.leap?(100)正确返回false.

版本1.9.1的结果相同.和2.0.0.

是什么赋予了?我应该提交错误报告吗?

更新

此外,在公元1582年,短短10天!

(Date.ordinal(1583) - Date.ordinal(1582)).to_i
 => 355
Run Code Online (Sandbox Code Playgroud)

ruby datetime date leap-year

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