Textures 使用Eigen创建OpenGL纹理

Textures 使用Eigen创建OpenGL纹理,textures,eigen,opengl-3,Textures,Eigen,Opengl 3,单通道R32F纹理可以在Eigen中轻松(安全)创建: glGenTextures(1, &_tex); glBindTexture(GL_TEXTURE_2D, _tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

单通道R32F纹理可以在Eigen中轻松(安全)创建:

    glGenTextures(1, &_tex);
    glBindTexture(GL_TEXTURE_2D, _tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    int rows = 480, cols = 640;
    static Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> A(rows,cols);
    A.setConstant(rows, cols, 0.0f);
    for(int row=0; row<A.rows(); row++)
        for(int col=0; col<A.cols(); col++)
            A(row,col) = .5f + .5*sin( 10* /*period*/ 2*3.14*row/A.rows() );
    glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, cols, rows, 0, GL_RED, GL_FLOAT, A.data());
glGenTextures(1,&u-tex);
glBindTexture(GL_纹理_2D,_tex);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
int行=480,cols=640;
静态特征::矩阵A(行,列);
A.设置常数(行、列、0.0f);
对于(int row=0;row)

类似的方法可用于生成RGB32F纹理:

    glGenTextures(1, &_tex);
    glBindTexture(GL_TEXTURE_2D, _tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    int rows = 480;
    int cols = 640;
    static Eigen::Matrix<Eigen::Vector3f, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> A(rows,cols);
    for(int row=0; row<A.rows(); row++)
        for(int col=0; col<A.cols(); col++)
            A(row,col) = vec3(row/((float)A.rows()), col/((float)A.cols()), 0);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, cols, rows, 0, GL_RGB, GL_FLOAT, A.data());
glGenTextures(1,&u-tex);
glBindTexture(GL_纹理_2D,_tex);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
int行=480;
int cols=640;
静态特征::矩阵A(行,列);
对于(int行=0;行:

在我的机器上似乎一切正常,但是,此过程会导致任何问题吗?特别是考虑到Eigen文档中提到的内容:

这一切都是好的和合法的。但是,可能(有时)会有一些问题。在你的情况下,你用
A(i,j)
所做的一切都是分配的。当试图使用算术运算时,有时会出现一些问题(例如)。根据你的使用情况,你可能不会遇到任何此类问题。

这一切都是好的和合法的。但是,可能(有时)可能会有一些问题。在您的情况下,您使用
A(i,j)
所做的一切都是赋值的。当尝试使用算术运算时,有时会出现一些问题(例如)。根据您的使用情况,您可能不会遇到任何此类问题。

正如Avi所说,这样的用例非常好

为了好玩,以下是无循环版本:

Array<float,Dynamic,Dynamic,RowMajor> A;
A.colwise() = 0.5f + 0.5*sin(ArrayXf::LinSpaced(rows,0,10*2*3.14));

在您的情况下,这是一种过分的做法,但可能有助于执行更复杂的操作,或者在图像的
数组
周围编写一个小包装器。

正如Avi所说,这样的用例非常好

为了好玩,以下是无循环版本:

Array<float,Dynamic,Dynamic,RowMajor> A;
A.colwise() = 0.5f + 0.5*sin(ArrayXf::LinSpaced(rows,0,10*2*3.14));

在您的情况下,这太过分了,但可能有助于执行更复杂的操作,或者在图像的
Array
周围编写一个小包装器。

我看到您使用了“Array”而不是矩阵。为什么会这样呢?因为
Array
更适合存储一组数字,我们希望在这些数字上按系数计算。例如,
sin(Array)
按正弦系数计算,而
sin(matrix)
表示矩阵运算符sine。我看到您使用了“Array”而不是矩阵。为什么会这样?因为
Array
更适合存储一组我们希望按系数计算的数字。例如,
sin(Array)
按正弦系数计算,而
sin(matrix)
表示矩阵运算符sine。
typedef Array<float,Dynamic,Dynamic,RowMajor> RowArrayXXf;
typedef Map<RowArrayXXf,0,Stride<Dynamic,3> > Channel;
Channel A_red(  A.data()->data()+0, rows, cols, Stride<Dynamic,3>(3*cols,3));
Channel A_green(A.data()->data()+1, rows, cols, Stride<Dynamic,3>(3*cols,3));
Channel A_blue( A.data()->data()+2, rows, cols, Stride<Dynamic,3>(3*cols,3));
A_red.colwise() = ArrayXf::LinSpaced(rows,0,1);
A_green.rowwise() = ArrayXf::LinSpaced(cols,0,1).transpose();
A_blue.setZero();