2016-02-23 2 views
1

У меня есть шейдеры, которые работают с GLES 3.0:GLSL версии совместимости

#version 300 es 

#ifdef GL_ES 
precision mediump float; 
#endif 

in vec2 v_tex_coord; 
uniform sampler2D s_texture; 
uniform vec4 u_color; 

out vec4 fragmentColor; 

void main() 
{ 
    fragmentColor = texture(s_texture, v_tex_coord)*u_color; 
} 

Я хотел бы, чтобы они работали с OpenGL 4.1 (не ES). Существует ли способ объявить как ES, так и настольные версии в одном шейдере?

ответ

3

Вам нужно будет использовать префиксную строку. glShaderSource принимает массив строк, которые концептуально будут объединены вместе перед обработкой. Поэтому вам нужно будет удалить объявление #version из ваших шейдерных файлов и поместить объявление версии в строку, которая создается во время выполнения. Что-то вроде этого:

GLuint CreateShader(const std::string &shader) 
{ 
    GLuint shaderName = glCreateShader(GL_VERTEX_SHADER); 

    const GLchar *strings[2]; 
    if(IS_USING_GLES) 
    strings[0] = "#version 300 es"; 
    else 
    strings[0] = "#version 410 core\n"; 

    strings[1] = (const GLchar*)shader.c_str(); 
    glShaderSource(shaderName, 2, strings, NULL); 

    //Compile your shader and check for errors. 

    return shaderName; 
} 

Ваше время выполнения должно знать, является ли это ES или настольным GL.

Кроме того, нет необходимости в этом ifdef вокруг вашего заявления precision. Прецизионные объявления были частью рабочего стола GL некоторое время, задолго до 4.1. Хотя, по общему признанию, они фактически ничего не делают;)

Смежные вопросы