在阅读OpenGL规范时,我注意到它提到你可以在一个程序中包含多个相同类型的着色器(即多个GL_VERTEX_SHADER附带glAttachShader).特别是在OpenGL 4.2,§2.11.3,程序对象:"相同类型的多个着色器对象可以附加到单个程序对象......".
OpenGL管道程序和子程序可能适用于此处,但这是在存在之前定义的(事实上它可以追溯到2.1规范,§2.15.2),所以我正在寻找这个想法的前GL4示例.当我做一些简单的测试时,我发现包含多个void main()
导致链接错误.有人知道一个使用它的实际例子吗?
这个帖子在我进入它之前有点摇摆我想清楚我在问什么:你是否已经为你的代码添加了启用移动的setter并且你发现它值得付出努力吗?我发现我可以发现的行为有多少可能是特定于编译器的?
我在这里看到的是,在我设置复杂类型的属性的情况下,添加启用移动的setter函数是否值得.这里我启用了移动功能Bar
,Foo
并且具有Bar
可以设置的属性.
class Bar {
public:
Bar() : _array(1000) {}
Bar(Bar const & other) : _array(other._array) {}
Bar(Bar && other) : _array(std::move(other._array)) {}
Bar & operator=(Bar const & other) {
_array = other._array;
return *this;
}
Bar & operator=(Bar && other) {
_array = std::move(other._array);
return *this;
}
private:
vector<string> _array;
};
class Foo {
public:
void SetBarByCopy(Bar value) {
_bar = value;
}
void SetBarByMovedCopy(Bar value) {
_bar = std::move(value);
}
void SetBarByConstRef(Bar …
Run Code Online (Sandbox Code Playgroud) 我想将一个已设置为路径元素组合的变量(可能是绝对路径和相对路径)并从中获取绝对路径.像boost::filesystem::system_complete()
C++中的东西.例如,我有类似的东西:
set(EXTERNAL_LIB_DIR "${CMAKE_SOURCE_DIR}/../external" CACHE PATH "Location of externals")
Run Code Online (Sandbox Code Playgroud)
哪个有效,但在UI中它有点难看,因为它可能最终看起来像C:/dev/repo/tool/../external
.我想知道是否有一个CMake内置命令将其转换为C:/dev/repo/external
我去之前脚本宏来执行它.find_path
有点这样做,但它要求路径已经存在,值得寻找的东西在那里.无论路径是否存在,我都希望它能够工作(例如,我可能会将它用于覆盖的CMAKE_INSTALL_PREFIX
默认路径).
我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器.我发现计算着色器的执行速度远低于顶点着色器,但在我把它写下来之前,我想确定我没有做错.
对于300个骨骼的100,000个顶点和1,000帧动画数据的测试数据,顶点着色器运行大约0.22ms,而计算着色器在0.85ms处运行4倍.时间是通过D3D API计时器查询(而不是cpu计时器)完成的.
deform_structs.hlsl
struct Vertex {
float3 position : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD;
float3 tangent : TANGENT;
float4 color : COLOR;
};
struct BoneWeights {
uint index;
float weight;
};
StructuredBuffer<matrix> g_bone_array : register(t0);
Buffer<uint> g_bone_offsets : register(t1);
Buffer<uint> g_bone_counts : register(t2);
StructuredBuffer<BoneWeights> g_bone_weights : register(t3);
Run Code Online (Sandbox Code Playgroud)
bone_deform_cs.hlsl
#include "deform_structs.hlsl"
StructuredBuffer<Vertex> g_input_vertex : register(t4);
RWStructuredBuffer<Vertex> g_output_vertex : register(u0);
[numthreads(64,1,1)]
void BoneDeformCS(uint id : SV_DispatchThreadID) {
Vertex vert = g_input_vertex[id.x];
uint offset = g_bone_offsets[id.x];
uint count …
Run Code Online (Sandbox Code Playgroud) 我有一个异步方法,我想给这个TaskCreationOptions.LongRunning
标志.使用包装调用的非异步方法很容易Task
:
void Foo() { Thread.Sleep(5000); }
var task = Task.Factory.StartNew(Foo, TaskCreationOptions.LongRunning);
Console.WriteLine(task.CreationOptions);
// LongRunning
Run Code Online (Sandbox Code Playgroud)
或者任何一种变体(Task.Run,new Task等).但是,似乎没有办法将方法定义为async并返回Task
:
async Task FooAsync() { await Task.Delay(TimeSpan.FromSeconds(10.0)); }
Task fooTask = FooAsync();
Console.WriteLine(FooTask.CreationOptions);
// None
Run Code Online (Sandbox Code Playgroud)
尝试将其包装在长时间运行的任务中也是一个空启动:
async Task FooAsync() { await Task.Delay(TimeSpan.FromSeconds(10.0)); }
Task<Task> wrapTask = Task.Factory.StartNew(FooAsync, TaskCreationOptions.LongRunning);
Console.WriteLine(wrapTask.CreationOptions);
// LongRunning
Console.WriteLine(wrapTask.Unwrap().CreationOptions);
// None
Run Code Online (Sandbox Code Playgroud)
在这种情况下,wrapTask
确实如此LongRunning
,但它几乎立即返回(FooAsync
调用后不久await Task.Delay(...)
),因此设置该标志实际上可能是不合需要的.我最终想要等待的是wrapTask.Unwrap()
.
在我的测试中,我发现事实上,代码在FooAsync
从一个线程池线程返回之后执行await
.通常,它是在调用线程上调用的,但它不会尝试在调用线程上继续执行.
我希望这可以通过方法属性来控制,但是我找不到任何可以帮助的方法.是否可以更改编译器为异步方法生成的创建选项?尝试是否有意义?
我对PImpl进行了大量的使用,我发现自己正在讨论的是准确初始化Pimpl结构的成员.选项是为Private
结构创建构造函数并在那里初始化它们,或者在主类的构造函数中初始化它们.
myclass.hpp:
class MyClass {
public:
MyClass();
~MyClass();
private:
struct Private; unique_ptr<Private> p;
};
Run Code Online (Sandbox Code Playgroud)
myclass.cpp:
#include "myclass.hpp"
#include <string>
struct MyClass::Private {
int some_var;
std::string a_string;
// Option A
Private() :
some_var {42},
a_string {"foo"}
{}
};
MyClass::MyClass() : p(new MyClass::Private) {
// Option B
p->some_var = 42;
p->a_string = "foo";
}
Run Code Online (Sandbox Code Playgroud)
目前我并没有真正看到两者之间的区别,除非我出于某种原因想要创建新Private
对象或复制它们或其他东西,然后选项A可能更好.它还能够初始化初始化列表中的变量,以获得它的价值.但是,我发现选项B往往更具可读性,也许更易于维护.这里有什么东西,我没有看到哪种方式可能会使标尺倾斜?