Распечатать журнал компиляции шейдеров opengl с помощью wprintf - PullRequest
0 голосов
/ 30 июня 2018

Следуя инструкциям на opengl-tutorial.org Я понимаю, что я не могу распечатать журнал компиляции шейдеров напрямую с помощью printf, потому что я делаю это в приложении для рабочего стола Windows. Я попытался преобразовать его в LPWSTR, используя этот метод:

//compile the shader
glShaderSource(fShader, 1, &pFsCode, NULL);
glCompileShader(fShader);

//check shader compilation
glGetShaderiv(fShader, GL_COMPILE_STATUS, &result);
glGetShaderiv(fShader, GL_INFO_LOG_LENGTH, &logLen);
if (logLen > 0) {
    //get compile log
    vector<char> fErr(logLen + 1);
    glGetShaderInfoLog(fShader, logLen, NULL, &fErr[0]);

    //try to convert log to LPWSTR
    wchar_t msg[100];
    swprintf(msg, sizeof(msg) / sizeof(*msg), L"%s\n", &fErr[0]);

    //print it
    wprintf(msg);
}

По какой-то причине я получаю этот вывод:

⤱㨠攠牲牯䌠㄰ㄲ›瘣牥楳湯㌠〰洠獵⁴敢映汯潬敷⁤祢攠ੳ⠰⤲㨠攠牲牯䌠㈰㄰›湵畳灰牯整⁤敶獲潩〳ਰ⠰⤲㨠攠牲牯䌠〰〰›祳瑮硡攠牲牯‬湵硥数瑣摥✠✨‬硥数瑣湩⁧㨢∺愠⁴潴敫⠢ਢ⠰⤴㨠攠牲牯䌠㔷㈳

Может кто-нибудь сказать мне, почему я получаю этот испорченный вывод?

Вся помощь приветствуется.

Ответы [ 2 ]

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

Как объясняет @genpfault в своем ответе SO В спецификации OpenGL говорится о *GetString командах, возвращающих строки UFT-8. О glGetShaderInfoLog ничего не сказано, но кажется разумным, что он также возвращает строку в кодировке UTF-8.

Даже если это ASCII, он будет таким же при преобразовании в UTF-8, потому что первые 127 кодов UTF-8 совпадают с кодами ASCII.

Лучшим вариантом будет распечатать строки UTF-8, если это возможно в C ++ без какого-либо преобразования. Но на сегодняшний день это не в Windows, которая использует UFT-16 для внутреннего использования, или в Linux и его использование UTF-32.

Для преобразования используйте std :: codecvt . Например, см. этот вопрос SO

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

Вы не конвертируете char s в wchar_t s, используя swprintf(..., "%s\n", ...), потому что согласно https://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx %s означает следующее:

При использовании с функциями printf указывает однобайтовую или многобайтовую строку символов; при использовании с функциями wprintf указывает строку широких символов. Символы отображаются вплоть до первого нулевого символа или до достижения значения точности.

Поскольку вы действительно используете здесь функцию *wprintf, %s уже ожидает широкую строку, но вы даете ей неширокую строку. Таким образом, текст ascii (в данном случае 1) : error C0121: #version 300 must be followed by ...) интерпретируется как широкая строка, что приводит к мусору.

Согласно этой же веб-странице, %S может быть самым быстрым решением для решения вашей проблемы здесь («при ​​использовании с функциями wprintf задает однобайтовую или многобайтовую строку символов» - что %s для нормального Printf).

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