2015-07-09 159 views
3

我无法使emscripten使用openGL着色器。该项目与emscripten和gcc都编译得很好,但是当我尝试运行emscripten输出时失败。在opengl着色器中使用emscripten

我从编译顶点着色器中得到的错误:

ERROR: 0:1: 'core' : invalid version directive 
ERROR: 0:3: 'layout' : syntax error 

的错误,我从编译片段着色器得到:

ERROR: 0:1: 'core' : invalid version directive 
ERROR: 0:3: 'in' : storage qualifier supported in GLSL ES 3.00 only 
ERROR: 0:3: '' : No precision specified for (float) 
ERROR: 0:5: 'out' : storage qualifier supported in GLSL ES 3.00 only 
ERROR: 0:5: '' : No precision specified for (float) 

我编译这个项目的命令:

em++ src/*.cpp -Iinclude/ -o test.html -std=c++11 -s USE_GLFW=3 -s FULL_ES3=1 

顶点着色源:

#version 330 core 

layout (location = 0) in vec3 position; 
layout (location = 1) in vec3 in_color; 

uniform mat4 model; 
uniform mat4 projection; 

out vec3 out_color; 

void main() 
{ 
    gl_Position = projection * model * vec4(position, 1.0f); 
    out_color = in_color; 
} 

片段着色器源:

#version 330 core 

in vec3 out_color; 

out vec4 color; 

void main() 
{ 
     color = vec4(out_color, 1.0); 
} 

的着色器被装载作为从输出由xxd -i我在C++ 11在Linux上的工作提供字符数组。该程序工作得很好,当我运行它本地,我已经尝试在Firefox和铬运行emscripten输出。

这似乎是不同版本之间的问题。有没有办法让emscripten与我目前的功能一起工作,还是必须以不同的方式编写着色器?如果我不得不重写我的着色器,我应该如何编写它们?

+0

尝试从'#version'删除'core' ;无论如何,这是默认设置。 –

+0

我删除了'核心',摆脱了关于核心的错误,但其余的错误依然存在。 – TheRoach

回答

5

着色器代码必须是WebGL着色器代码才能在浏览器上工作。我不认为emscripten将着色器代码(本例中为GLSL 3.3)转换为与webGL兼容的GLSL ES 1.0。

你必须在顶点/片段着色/在使用attribute,而不是in在顶点着色器,为varying并使用gl_FragColor作为片段着色器的输出变量。也不支持layout,并且变量需要精确定义。检查WebGL备忘单here

0

在当前的emscripten中,您可以使用WebGL2和GLSL ES 3.00。你需要改变你的#version线

#version 300 es 

您还需要一个默认精度添加到您的片段着色器。

如果是我我只是换我的代码glShaderSource是像

GLint shaderSourceWrapper(GLint shader, const std::string src) { 
    #ifdef __EMSCRIPTEN__ 
    // replace '#version.*' with '#version 300 es' 
    // if it's a fragment shader add 'precision highp float' 
    // do anything else relevant like warn if there are 
    // unsupported #extension directives 
    #endif 
    glShaderSource(shader, ...) 

甚至做到这一点在JavaScript的水平like this