GLSL是否有+/-无穷大或NaN的任何预定义常数?我这样做是一种解决方法,但我想知道是否有一种更清洁的方式:
// GLSL FRAGMENT SHADER
#version 410
<snip>
const float infinity = 1. / 0.;
void main ()
{
<snip>
}
Run Code Online (Sandbox Code Playgroud)
我知道这个isinf函数,但我需要为变量赋予无穷大,这对我没有帮助.
是否符合C++ 11标准(或者,如果不符合,至少通常可接受)的方式来确定地址是否与缓存行边界对齐?
像这样的事情:
T* p = SOMETHING;
bool aligned = reinterpret_cast< std::uintptr_t > (p) % CACHE_LINE_SIZE == 0;
Run Code Online (Sandbox Code Playgroud) 我试图使用tbb多线程现有的递归算法.单线程版本使用尾调用递归,从结构上看,它看起来像这样:
void my_func() {
my_recusive_func (0);
}
bool doSomeWork (int i, int& a, int& b, int& c) {
// do some work
}
void my_recusive_func (int i) {
int a, b, c;
bool notDone = doSomeWork (i, a, b, c);
if (notDone) {
my_recusive_func (a);
my_recusive_func (b);
my_recusive_func (c);
}
}
Run Code Online (Sandbox Code Playgroud)
我是tbb新手所以我的第一次尝试使用了parallel_invoke函数:
void my_recusive_func (int i) {
int a, b, c;
bool notDone = doSomeWork (i, a, b, c);
if (notDone) {
tbb::parallel_invoke (
[a]{my_recusive_func (a);},
[b]{my_recusive_func (b);},
[c]{my_recusive_func (c);}); …Run Code Online (Sandbox Code Playgroud) 有没有人有任何使用TBB有效并行化std :: partition的技巧?这已经完成了吗?
这是我在想的:
*我希望在平均情况下,与阵列的长度相比,该区域将是小的,或者与在连续块中分区阵列所需的交换相比较.
我尝试之前的任何想法?
我正在开发一个glsl着色器程序,作为在"闭源"应用程序中运行的插件的一部分.应用程序(maya)是使用opengl 2.1编写的,但是我们的显卡支持opengl/glsl 4.1,我想在程序中使用镶嵌和几何着色器.应用程序设置opengl视口和传统的模型/视图矩阵堆栈,我无法控制代码的那一部分.
我的传递顶点着色器使用GLSL 1.2并且工作正常:
// GLSL VERTEX SHADER
#version 120
void main ()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
我的传递几何着色器使用glsl 4.1并且在应用程序中也可以正常工作:
// GLSL GEOMETRY SHADER
#version 410
layout (lines_adjacency) in;
layout (line_strip, max_vertices = 2) out;
void main ()
{
gl_Position = gl_in[1].gl_Position;
EmitVertex();
gl_Position = gl_in[2].gl_Position;
EmitVertex();
EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)
但这只是一个传递测试.在我的真实几何着色器中,我需要在世界空间中进行一些计算,但几何着色器点在视图空间中.我的问题是:我可以在4.1几何着色器中访问gl_ModelViewProjectionMatrix吗?我知道传统的矩阵堆栈已经在glsl 4.1中被弃用,而不是统一变量,但我无法改变应用程序.我不能在几何着色器中使用glsl 1.2,因为我需要lines_adjacency输入类型.我是否需要在我的插件的C++源代码中将矩阵复制到一个统一变量中?或者是否有一个"后门"直接从glsl 4.1获取它?或者其他我没想到的东西?
是否可以构造具有初始大小的std :: vector并将其元素就位构建?我的存储类型不可复制,因此无法使用,因为初始值被构造为临时值并复制到元素:
#include <iostream>
#include <memory>
#include <vector>
struct A
{
A(int i = 0) : i_ (i) {};
int i_;
std::unique_ptr<int> p_; // not copyable
};
int main()
{
std::vector<A> v (10, 1); // error
}
Run Code Online (Sandbox Code Playgroud)
这接近于我要达到的目标,也许还算不错,但是我想知道是否有更清洁的方法:
int main()
{
//std::vector<A> v (10, 1); // error
std::vector<A> v;
v.reserve (10);
for (int i = 0; i < 10; ++i) {
v.emplace_back (1);
}
}
Run Code Online (Sandbox Code Playgroud)
我仅限于c ++ 11,但出于好奇,我对c ++ 17解决方案也很感兴趣。
我正在尝试使用std::bind来调用,std::reference_wrapper::get但我无法编译.我确定我忽略了一些明显的东西,但编译错误并没有帮助我.此代码是人为设计的,并不代表我的实际用例:
#include <functional>
#include <iostream>
struct A
{
void p() {std::cout << this << '\n';};
};
using ARef = std::reference_wrapper< A >;
int main()
{
A a;
a.p();
auto p = std::bind (&A::p, std::placeholders::_1);
p (a); // ok
ARef ar (a);
p (ar.get()); // ok
auto get = std::bind (&ARef::get, std::placeholders::_1);
p (get (ar)); // error
}
Run Code Online (Sandbox Code Playgroud)
编辑:这与clang编译好.
gcc 6.3.0输出: http ://coliru.stacked-crooked.com/a/00bffc7549193cb8
main.cpp: In function 'int main()':
main.cpp:21:19: error: no match for call to '(std::_Bind<std::_Mem_fn<A& (std::reference_wrapper<A>::*)() …Run Code Online (Sandbox Code Playgroud) 是否存在C++ 17 STL并行算法的标准调度程序规范,还是完全依赖于实现?串行算法具有复杂性保证,但调度程序实现对于非均匀任务负载的性能至关重要,规范是否解决了这个问题?如果没有标准化的调度程序,似乎很难保证跨平台性能.