c++ - 将 emscripten 与 opengl 着色器一起使用

标签 c++ opengl glsl emscripten

我无法让 emscripten 与 openGL 着色器一起工作。该项目使用 emscripten 和 gcc 编译得很好,但是当我尝试运行 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 提供的输出中加载为 char 数组 我在 linux 上使用 c++11。该程序在我 native 运行时运行良好,并且我尝试在 Firefox 和 Chromium 中运行 emscripten 输出。

好像是不同版本之间的问题。有没有办法让 emscripten 与我目前拥有的东西一起工作,或者我必须以不同的方式编写我的着色器?如果我必须重写我的着色器,我应该如何编写它们?

最佳答案

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

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

关于c++ - 将 emscripten 与 opengl 着色器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31327550/

相关文章:

c++ - 宽度不均匀时纹理缩放错误

c++ - 未找到 dyld 符号,但 nm 以其他方式报告(OS X 更新问题)

c++ - glUniform 无法设置采样器值

opengl - 如何强制 GLSL 分支?

c++ - 链接列表的成员值意外更改

c++ - 如何在 C++ 中正确三角化多边形

c++ - 使用 strcpy 为 char *data 成员复制构造函数

c++ - OpenGL 中的快速文本渲染

c++ - 计算一个数的幂

c++ - 如何计算指针的哈希值?