Вам нужно будет использовать префиксную строку. 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. Хотя, по общему признанию, они фактически ничего не делают;)