1

以下 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 输出

我已将此问题报告给 Duncan Murdoch( 的作者rgl),他为我提供了以下Firefox解决方案:在地址栏中键入并运行“about:config”,然后将参数webgl.prefer-native-glwebgl.force-enabled设置为true。然后 HTML 渲染工作。

我的问题:

  • 如何使用谷歌浏览器?

  • 是否可以更改 HTML 代码中的某些内容以使 HTML 呈现与默认配置一起使用?(至于 0.93.928 版本)。

4

1 回答 1

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;
}

它在 main 函数之外定义了变量,该函数跳过了值赋值,因此无法编译并出现除零失败。解决方案是将 main 函数的开头直接移动到定义块上方的变量值之后:

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,您可能需要再次联系 Duncan Murdoch 并向他发送此帖子的链接。

于 2013-07-05T12:54:13.467 回答