2013-06-28 23 views
0

下述R代碼生成一個HTML文件,並打開其在瀏覽器中呈現:WebGL的與RGL 0.93.935ř包

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,它的工作原理。

我已發佈html output of rgl 0.93.928html output of rgl 0.93.935

我報道這個問題鄧肯默多克(的rgl作者),他給了我下面的解決方案火狐:類型和運行「關於:配置」在地址欄中,並打開參數webgl.prefer-native-glwebgl.force-enabled。然後HTML呈現工作。

我的問題:

  • 如何做到與谷歌瀏覽器?

  • 是否可以更改HTML代碼中的某些內容,以便HTML渲染使用默認配置? (至於0.93.928版本)。

+0

由於輸出中唯一的區別是着色器,我建議嘗試將shadercode從舊版本複製到新版本。除此之外,用這麼深的嵌入HTML頁面的代碼幾乎不可能調試這個問題。 – havarc

+0

你好@havarc。你的意思是第12行到第78行代碼的第一部分,第12行代碼到第80行代碼的第二部分? –

+0

那麼這就是問題所在,我並沒有看到太多的東西。我唯一能做的就是通過Firebug html檢查器運行你的示例頁面,因爲所有內容都是通過JavaScript插入到更多的javascript中。要真正調試,我需要在純HTML和JS頁面。 – havarc

回答

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,你可能想再次聯繫Duncan Murdoch並給他發一個鏈接到這篇文章。

+0

謝謝!我今晚會嘗試。 –

+0

它的工作原理! http://pagist.github.io/?5936018謝謝。此外,我已經發送了一封電子郵件給鄧肯默多克,他要求我承認你! –