WebGL的与RGL 0.93.935ř包渲染(WebGL rendering with rgl 0

2019-09-28 18:09发布

下述R代码生成一个HTML文件,并打开其在浏览器中:

library(rgl)
M <- rbind(
  c(0,0,0),
  c(-1,4,0),
  c(4,9,0),
  c(6,3,0)
  )
  quads3d(M,col='red')
browseURL(paste("file://", writeWebGL(dir=file.path(tempdir(), "webGL"), 
          width=500), sep=""))

渲染是在3D空间中的互动平面多面体。

随着最新版本rgl(0.93.935),HTML呈现为Windows用户的工作(以及iOS用户,我认为)使用默认配置的浏览器。 与旧版本0.93.928,它的工作原理。

我已经发布了RGL 0.93.928的HTML输出及RGL 0.93.935的HTML输出 。

我报道这个问题邓肯默多克(作者rgl ),他给了我为Firefox以下解决方案:类型和运行“about:config中”,在地址栏,并打开参数webgl.prefer-native-glwebgl.force-enabledtrue。 然后HTML呈现作品。

我的问题:

  • 如何做到与谷歌浏览器?

  • 是否有可能改变的HTML代码的东西,以便在HTML渲染的工作原理与默认配置? (作为0.93.928版本)。

Answer 1:

至于困难,因为得到的问题那么简单,是解决它。

作为RGL的最新版本,我可以收购问题所在的HTML输出的片段着色器内:

varying vec4 vCol; // carries alpha
varying vec4 vPosition;
varying vec3 vNormal;

vec3 eye = normalize(-vPosition.xyz);
const vec3 emission = vec3(0., 0., 0.);
const vec3 ambient1 = vec3(0., 0., 0.);
const vec3 specular1 = vec3(1., 1., 1.);// light*material
const float shininess1 = 50.;
vec4 colDiff1 = vec4(vCol.rgb * vec3(1., 1., 1.), vCol.a);
const vec3 lightDir1 = vec3(0., 0., 1.);
vec3 halfVec1 = normalize(lightDir1 + eye);

void main(void) {
    vec4 lighteffect = vec4(emission, 0.);
    vec3 n = normalize(vNormal);
    n = -faceforward(n, n, eye);
    vec3 col1 = ambient1;
    float nDotL1 = dot(n, lightDir1);
    col1 = col1 + max(nDotL1, 0.) * colDiff1.rgb;
    col1 = col1 + pow(max(dot(halfVec1, n), 0.), shininess1) * specular1;
    lighteffect = lighteffect + vec4(col1, colDiff1.a);
    gl_FragColor = lighteffect;
}

它定义的变量以外在其上跳过值分配的主要功能,因此失败,除法被零故障进行编译。 该解决方案是移动变化值后的定义块直接上方的主函数的开始:

varying vec4 vCol; // carries alpha
varying vec4 vPosition;
varying vec3 vNormal;

void main(void) {
    vec3 eye = normalize(-vPosition.xyz);
    const vec3 emission = vec3(0., 0., 0.);
    const vec3 ambient1 = vec3(0., 0., 0.);
    const vec3 specular1 = vec3(1., 1., 1.);// light*material
    const float shininess1 = 50.;
    vec4 colDiff1 = vec4(vCol.rgb * vec3(1., 1., 1.), vCol.a);
    const vec3 lightDir1 = vec3(0., 0., 1.);
    vec3 halfVec1 = normalize(lightDir1 + eye);

    vec4 lighteffect = vec4(emission, 0.);
    vec3 n = normalize(vNormal);
    n = -faceforward(n, n, eye);
    vec3 col1 = ambient1;
    float nDotL1 = dot(n, lightDir1);
    col1 = col1 + max(nDotL1, 0.) * colDiff1.rgb;
    col1 = col1 + pow(max(dot(halfVec1, n), 0.), shininess1) * specular1;
    lighteffect = lighteffect + vec4(col1, colDiff1.a);
    gl_FragColor = lighteffect;
}

如所期望这将显示的对象。

您可能需要再次联系邓肯默多克和送他一个链接到这篇文章,如果像你说的你是不是在HTML和WebGL精通。



文章来源: WebGL rendering with rgl 0.93.935 R package