【发布时间】:2020-05-12 15:46:55
【问题描述】:
我不知道为什么我在使用最新 emscripten 1.39 的顶点着色器中使用 #version 300 es 会收到“不支持的着色器版本”错误消息。使用#version 100 可以正常工作。
const GLchar* vertex_shader_code[] = {
"#version 300 es\n"
"precision mediump float; \n"
"void main() { \n"
"gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n"
"} \n"
};
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_version compiled;
SDL_version linked;
SDL_VERSION(&compiled);
SDL_GetVersion(&linked);
printf("Compiled SDL version: %d.%d.%d\n", compiled.major, compiled.minor, compiled.patch);
printf("Linked SDL version: %d.%d.%d\n", linked.major, linked.minor, linked.patch);
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(CANVAS_WIDTH, CANVAS_HEIGHT, 0, &window, &renderer);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_code, 0);
glCompileShader(vertex_shader);
auto compile_success = 0;
auto compile_info_lenght = 0;
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &compile_success);
if(compile_success == GL_FALSE) {
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &compile_info_lenght);
std::string vertex_shader_log(compile_info_lenght, ' ');
glGetShaderInfoLog(vertex_shader, compile_info_lenght, NULL, &vertex_shader_log[0]);
int n = vertex_shader_log.length();
char char_array[n + 1];
strcpy(char_array, vertex_shader_log.c_str());
printf("%s\n", char_array);
glDeleteShader(vertex_shader);
return 0;
}
对于构建我使用emcc -s main.cpp -o index.html --shell-file shell.html -s USE_SDL=2 -s FULL_ES3=1
消息:
Compiled SDL version: 2.0.9
Linked SDL version: 2.0.9
ERROR: unsupported shader version
我做错了什么?
【问题讨论】:
-
你为什么在
SDL_Init()之前打电话给SDL_GL_SetAttribute()? -
嗨@genpfault,我现在直接在 SDL_Init() 之后尝试了它,但不幸的是同样的错误。
-
另外,如果您要使用 OpenGL ES,为什么还要靠近 SDL_Renderer 的东西?您不能(正式)在两者之间进行互操作,无法查询 SDL_Renderer 的 GL 状态,它可能会或可能不会破坏。
-
如果您还指定
-s MAX_WEBGL_VERSION=2,有什么变化吗? -
可能还需要
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES)来强制 SDL 使用更多 EGL-y/GLES-y 代码路径。 可能。取决于 Emscripten 端口人员在这一周对 SDL 做了多少暴力 :)
标签: opengl-es glsl sdl emscripten emcc