小编Mik*_*e E的帖子

在单个OpenGL程序中附加多个相同类型的着色器?

在阅读OpenGL规范时,我注意到它提到你可以在一个程序中包含多个相同类型的着色器(即多个GL_VERTEX_SHADER附带glAttachShader).特别是在OpenGL 4.2,§2.11.3,程序对象:"相同类型的多个着色器对象可以附加到单个程序对象......".

OpenGL管道程序和子程序可能适用于此处,但这是在存在之前定义的(事实上它可以追溯到2.1规范,§2.15.2),所以我正在寻找这个想法的前GL4示例.当我做一些简单的测试时,我发现包含多个void main()导致链接错误.有人知道一个使用它的实际例子吗?

opengl

19
推荐指数
2
解决办法
6739
查看次数

是否值得添加一个支持移动的setter?

这个帖子在我进入它之前有点摇摆我想清楚我在问什么:你是否已经为你的代码添加了启用移动的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)

c++ visual-studio-2010 move-semantics c++11

7
推荐指数
2
解决办法
3008
查看次数

CMake:获取路径的完整表示减去相对元素

我想将一个已设置为路径元素组合的变量(可能是绝对路径和相对路径)并从中获取绝对路径.像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默认路径).

cmake

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

为什么这个计算着色器比顶点着色器慢得多?

我正在探索使用计算着色器将骨骼变形应用于网格顶点,而不是使用流输出的顶点着色器.我发现计算着色器的执行速度远低于顶点着色器,但在我把它写下来之前,我想确定我没有做错.

对于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)

compute-shader vertex-shader direct3d11

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

是否可以更改异步方法的任务创建选项?

我有一个异步方法,我想给这个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.通常,它是在调用线程上调用的,但它不会尝试在调用线程上继续执行.

我希望这可以通过方法属性来控制,但是我找不到任何可以帮助的方法.是否可以更改编译器为异步方法生成的创建选项?尝试是否有意义?

.net c# async-await

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

在pimpl类中初始化默认值的最佳位置?

我对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往往更具可读性,也许更易于维护.这里有什么东西,我没有看到哪种方式可能会使标尺倾斜?

c++ pimpl-idiom

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