这是我目前使用两个功能的说明。

在这两种情况下,我都创建一个本地副本:std::vector<GLfloat>std::vector<GLdouble>的实例。

是否有不涉及副本的快捷方式,我可以以更直接的方式从Rcpp::NumericMatrix转到GLfloat * / GLdouble *

#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;

//' @export
// [[Rcpp::export("glLoadMatrixf")]]
void gl_load_matrixf(Rcpp::NumericMatrix m) {

  std::vector<GLfloat> float_v = Rcpp::as<std::vector<GLfloat> >(m);
  const GLfloat * _float_v = &float_v[0];

  glLoadMatrixf(_float_v);
}

//' @export
// [[Rcpp::export("glLoadMatrixd")]]
void gl_load_matrixd(Rcpp::NumericMatrix m) {

  std::vector<GLdouble> double_v = Rcpp::as<std::vector<GLdouble> >(m);
  const GLdouble * _double_v = &double_v[0];

  glLoadMatrixd(_double_v);
}

最佳答案

在我的系统上,GLfloatGLdouble定义为:

typedef float GLfloat;
typedef double GLdouble;


R的数字数据类型始终为double。因此,您可以直接使用&m[0]m.begin()来获取可转换为GLdouble *的内容,而无需复制数据。对于GLfloat,这是不可能的,因为它要求(有损)强制类型转换,以从R使用的(64位)double转换为(32位)float

一些代码如图所示:

Sys.setenv(PKG_LIBS="-lGL -lglfw")

Rcpp::sourceCpp(code = '
#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;

// [[Rcpp::export("glLoadMatrixd")]]
void gl_load_matrixd(Rcpp::NumericMatrix m) {

     const GLdouble * _double_v = &m[0];

     glLoadMatrixd(_double_v);
}
')


glLoadMatrixd(matrix(runif(10), 2, 5))


顺便说一句,我不知道这样一个矩阵应该有什么尺寸。 2x5可能不正确...

08-25 06:00