小编Ben*_*nes的帖子

使用顶点着色器计算球体的边界四边形

我正在尝试从图形纸中实现算法,并且算法的一部分将已知半径的球体渲染到缓冲区.他们说他们通过计算顶点着色器中的位置和大小来渲染球体,然后在片段着色器中进行适当的着色.

有没有猜到他们实际上是怎么做到的?位置和半径在世界坐标中是已知的,投影是透视的.这是否意味着球体将被投影为圆圈?

opengl geometry vertex-shader fragment-shader

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

参数值相等时的模板特化

我有一个表格的功能

template<int a, int b>
void f();
Run Code Online (Sandbox Code Playgroud)

当a == b时,我想专攻.伪代码看起来像:

template<int a>
void f<a, a>(){ //something}

template<int a, int b>
void f<a, b>(){ //something different}
Run Code Online (Sandbox Code Playgroud)

这是否可能没有部分模板专业化问题?

编辑:感谢您的快速回复.该方法实际上是在类中,更像是这样:

<typename a> class A{ 
    template<int b, int c> f(); 
}; 

A inst; 
inst.f<1,1>(); 
inst.f<1,2>(); 
Run Code Online (Sandbox Code Playgroud)

c++ templates specialization template-specialization

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

enable_if有条件地包含成员函数

我有一个模板类,其类型是迭代器.我想根据模板参数的iterator_category启用/禁用特定成员函数.特别是,operator--如果模板参数是双向迭代器,我想启用.我的尝试是这样的:

    typename std::enable_if<
       std::is_base_of<std::bidirectional_iterator_tag,
                    MyTemplateParameter>::value,
    MyType&>::type
    operator --() {
    //do work
    return *this;
  }
Run Code Online (Sandbox Code Playgroud)

Clang告诉我(粗略地): error: no type named 'type' in 'std::__1::enable_if<false, MyTemplateParameter>'; 'enable_if' cannot be used to disable this declaration

有没有办法完成我正在尝试的东西?

以下是某些上下文中的示例:

    #include <iterator>
    #include <type_traits>

    template <typename TagType> 
    class test {
      public:
      typename std::enable_if<
         std::is_base_of<std::bidirectional_iterator_tag,
                        TagType>::value,
        test>::type
      operator --() {
         return *this;
      }

    };

    int main(){

      test<std::random_access_iterator_tag> t1;
      test<std::forward_iterator_tag> t2;

    /*
    breakTemps.cpp:13:2: error: no type named 'type' in 'std::__1::enable_if<false,     test<std::__1::forward_iterator_tag> >'; 'enable_if' cannot be used to …
Run Code Online (Sandbox Code Playgroud)

c++ templates enable-if c++11

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

交换临时参考元组

我正在编写一个自定义迭代器,当dereferenced返回一个引用元组时.由于元组本身是短暂的,我不认为我可以从operator*()返回引用.我认为我的迭代器在语义上是有意义的,因为它具有引用语义,即使operator*返回一个值.

问题是,当我尝试调用std :: swap(或者更确切地说,当std :: sort执行时),如下所示,我得到错误,因为交换需要l值.这个问题有一个简单的解决方法吗?

#include <vector>

class test {
  public:
  test()
    :v1(10), v2(10)
  {}

  class iterator {
    public:
    iterator(std::vector<int>& _v1,
             std::vector<int>& _v2)
      :v1(_v1), v2(_v2){}

    std::tuple<int&, int&> operator*(){
      return std::tuple<int&, int&>{v1[5], v2[5]};
    }
    std::vector<int>& v1;
    std::vector<int>& v2;
  };

  std::vector<int> v1, v2;
};



int main(){
  test t;
  //error, Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:3003:1: note: candidate function [with _Tp = std::__1::tuple<int &, int &>] not viable: expects an l-value for 1st argument

  //deep within the bowels of std::sort ...
  std::swap(*(test::iterator(t.v1, t.v2)),
            *(test::iterator(t.v1, t.v2)));
}
Run Code Online (Sandbox Code Playgroud)

c++ swap tuples rvalue

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

专门为stval :: swap for rvalues

在标准(20.2.2 [utility.swap])中,为左值引用定义了std :: swap.我知道这是你想交换两件事的常见情况.但是,有时交换rvalues是正确和可取的(当临时对象包含引用时,如此处:交换引用的临时元组).

为什么没有rvalues超载?对价值进行无意义交换的风险是否超过潜在收益?

有没有合法的方法来支持交换包含引用的rvalue std :: tuple对象?对于用户定义的类型,我会专门使用swap来按值接受它的参数,但是对于像std :: tuple这样的库类型来说,这似乎没有犹豫不决.

c++ c++11

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

如何在vtkStructuredGrid上设置数据值

我正在尝试用分析字段填充结构化网格,但是尽管阅读了vtk文档,但我还没有找到如何在网格点实际设置标量值或设置网格的间距/原点信息.从下面的代码开始,我该怎么做

  1. 将空间信息与网格相关联(即单元格0,0,0位于坐标0,0,0处,间距在每个方向上均为dx)
  2. 将标量值与每个网格点相关联.首先,我只需要一个,但最终我想在每个点存储3个数据(不是矢量,3个不同的标量).
grid = vtk.vtkStructuredGrid()
numPoints = int((maxGrid - minGrid)/dx)
grid.SetDimensions(numPoints, numPoints, numPoints)
Run Code Online (Sandbox Code Playgroud)

vtk

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

片段着色器眼空间未缩放的深度坐标

我正在尝试使用GLSL片段着色器中场景中对象的未缩放距离(与前裁剪平面的真实距离)。gl_FragCoord.z值比我预期的要小。在我的顶点着色器中,我仅使用ftransform()设置gl_Position。我期望2到3之间的值在15到20之间。

如何获得真实的眼空间深度?谢谢!

opengl glsl fragment-shader

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

当用作类型或异常规范时,"见下文"是什么意思?

通过C++标准(当前草案http://isocpp.org/files/papers/N3690.pdf,sec 20.8.3就是这样一个地方),通过LLVM的libc ++标题,我发现"见下文"用作类型和异常规范.它似乎在没有类型存在时使用,但是使用2个单词短语而不是某种有效的标识符似乎很奇怪.

它是在标准或其他地方讨论的吗?为什么/如何使用它?

c++ standards typedef noexcept c++11

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

g ++认为我没有传递引用

当我调用一个引用的方法时,g ++抱怨我没有传递引用.我认为呼叫者不必为PBR做任何不同的事情.这是有问题的代码:

//method definition
void addVertexInfo(VertexInfo &vi){vertexInstances.push_back(vi);} 

//method call:
sharedVertices[index]->addVertexInfo(VertexInfo(n1index, n2index));
Run Code Online (Sandbox Code Playgroud)

这是错误:

GLUtils/GLMesh.cpp: In member function 'void GLMesh::addPoly(GLIndexedPoly&)': GLUtils/GLMesh.cpp:110: error: no matching function for call to 'SharedVertexInfo::addVertexInfo(VertexInfo)' GLUtils/GLMesh.h:93: note: candidates are: void SharedVertexInfo::addVertexInfo(VertexInfo&)

c++ g++ pass-by-reference

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