【发布时间】:2015-11-03 05:14:16
【问题描述】:
在 Eigen 中可以非常轻松(且安全)地创建单通道 R32F 纹理:
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());
可以使用类似的方法来生成 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());
在我的机器上似乎一切正常,但是,此过程会导致任何问题吗?尤其是考虑到 Eigen 文档中提到的内容: http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html#user_defined_scalars
【问题讨论】: