GLSL Shader (ошибка компиляции) - PullRequest
0 голосов
/ 10 июня 2018

Я прочитал все рекомендуемые посты, я пробовал эти решения, но ни одно из них не помогло.

Вкратце проблема заключается в третьем аргументе

glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

Этот кодработа:

const char *vertexShaderSource = "#version 120 \n"
                         "attribute vec3 pos;\n"
                         "attribute vec2 texCoord;\n"
                         "varying vec2 texCoord0;\n"
                         "uniform mat4 transform;\n"
                         "void main()\n"
                         "{\n"
                         "   gl_Position = transform * vec4(pos, 1.0);\n"
                         "   texCoord0 = texCoord;\n"
                        "}\0";

Но я хочу прочитать его из файла, следующий код работает

std::string s= "vertex";
std::ifstream file(s.c_str());
std::stringstream buffer;

buffer << file.rdbuf();
std::string str = buffer.str();
std::cout << str; 

И выводит:

#version 120
attribute vec3 pos;
attribute vec2 texCoord;
varying vec2 texCoord0;
uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(pos, 1.0);
    texCoord0 = texCoord;
}

Я знаю, что янельзя просто преобразовать строку с кодом, подобным следующему:

const char *vertexShaderSource = str.c_str();

и передать его в: glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); Поэтому я использовал следующий код, чтобы предотвратить его прекращение существования:

char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0';

Passing glShaderSource(vertexShader, 1, &writable, NULL); не работает также.Я все время получаю сообщение об ошибке, даже с другим кодом копирования и вставки из учебников

 0:1(4): preprocessor error: syntax error, unexpected HASH_TOKEN

Что еще я могу сделать?

Я прочитал эти сообщения: Чтениешейдер из файла .txt с использованием структуры

чтение шейдеров GLSL из файла

1 Ответ

0 голосов
/ 11 июня 2018

Вот код, который я использую для загрузки источников шейдеров:

ifstream iStream(filename);
stringstream buffer;
buffer << iStream.rdbuf();
string source = buffer.str();

const char* sources[] = { source.c_str() };
glShaderSource(handle, 1, sources, 0);

Как вы можете видеть, string можно присвоить непосредственно glShaderSource;нет необходимости создавать его копию.Посмотрите на спецификацию для c_str(), если вы не уверены.

Не знаете, в чем проблема в вашем случае.Я успешно использовал окончания строк \r\n и \n.Может быть, у вас есть U+FEFF символ спецификации в начале файла?Это может быть с "хешем", упомянутым в ошибке компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...