2016-12-31 14 views
0

Я хочу, чтобы скомпилировать вершинный шейдер:OpenGL не компилирует GLSL Shader. Отсутствующие расширения?

#version 430 

layout(location = 0)in vec3 vertexPosition; 
layout(location = 1)in vec3 vertexNormal; 
layout(location = 2)in vec2 vertexUV; 

out Vertex{ 
vec2 uv; 
vec4 normal; 
}vertexOut; 

void main(){ 
    gl_Position = vec4(
    vertexPosition.x, 
    vertexPosition.y, 
    vertexPosition.z, 
    1.0f); 
    vertexOut.uv = vertexUV; 
    vertexOut.normal = vec4(vertexNormal, 0.0f); 
} 

как этот

pShader.ID = glCreateShader(GL_VERTEX_SHADER); 
std::ifstream shaderFile; 
shaderFile.open(pShader.path); 

if (shaderFile.fail()) { 
    printf("!!!\nCannot open Shader File %s ! Shader compilation cancelled!", pShader.path.c_str()); 
} 
else { 
    std::string line; 
    while (getline(shaderFile, line)) { 
     pShader.content += line + '\n'; 
     ++pShader.lines; 
    } 
    const char* shaderContent = pShader.content.c_str(); 
    glShaderSource(pShader.ID, 1, &shaderContent, &pShader.lines); 
    glCompileShader(pShader.ID); 
    GLint success = 0; 
    glGetShaderiv(pShader.ID, GL_COMPILE_STATUS, &success); 
    if (success == GL_FALSE) { 
     //errror checking 
     } 

, но я получаю ошибку компиляции

Vertex Shader failed to compile with the following errors: 
ERROR: 0:3: error(#132) Syntax error "layou" parse error 
ERROR: errror(#273) 1 compilation errors. No code generated 

В моем пиксельный шейдер я также получаю "/"parse error, но я могу ее найти.

Я использую glew для загрузки добавок и glfw для ввода и контекста. Когда я запускаю glewinfo.exe, есть некоторые расширения, отмеченные как отсутствующие, но мои драйверы AMD Radeon HD 7800 обновлены. В чем проблема и что я должен делать?

эти glewinfo.exe результаты: http://m.uploadedit.com/ba3s/148318971635.txt

+0

проверить, что вы переходите в ['glShaderSource'] (http://docs.gl/gl4/glShaderSource), особенно ваш параметр' length', кажется, очень не корректен – PeterT

ответ

3

Проблема в том, что вы передаете неправильный длину glShaderSource. Последний параметр должен содержать количество символов в каждой строке. Поскольку вы можете передавать несколько строк одновременно, это массив с элементами count (второй параметр).

Правильный код в вашем примере будет:

const char* code = shaderContent.c_str(); 
int length = shaderContent.size(); 
glShaderSource(pShader.ID, 1, &code, &length); 

Кроме того, чтение всей строки файла по линии также не очень эффективным.

+0

Спасибо! Это сделал трюк. Можете ли вы быстро направить меня к способу чтения файла быстрее? А как насчет недостающих расширений? Общеизвестно, что этого не хватает? – stimulate

+1

Если ваша видеокарта не поддерживает их, да, это нормально. – BDL

+1

Проверьте этот вопрос о том, как прочитать весь файл сразу: http://stackoverflow.com/questions/116038/what-is-the-best-way-to-read-an-entire-file-into-a- stdstring-в-с – BDL