2016-07-01 6 views
-2

Я пытался заставить шейдеры работать. Они этого не делают.openGL, GLFW, 1281 ошибка на glShaderSource, самый следующий файл glShaderSource отлично работает как-то

std::cout << "a " << glGetError() <<std::endl; //making sure things work 
GLuint vertexShader = 0; 
GLuint fragmentShader = 1; 
glCreateShader(GL_VERTEX_SHADER); 
std::cout <<"b " << glGetError() <<std::endl; 
glCreateShader(GL_FRAGMENT_SHADER); 
std::cout <<"c " << glGetError() <<std::endl; 
glShaderSource(vertexShader, GLsizei(1), (const char**)&VertexShaderSource, NULL);//ERROR 
std::cout <<"d " << glGetError() <<std::endl; 
glShaderSource(fragmentShader, GLsizei(1), (const char**)&FragmentShaderSource, NULL);//is somehow fine 
std::cout <<"e " << glGetError() <<std::endl; 
glCompileShader(vertexShader); 
std::cout <<"f " << glGetError() <<std::endl; 
glCompileShader(fragmentShader); 
std::cout <<"g " << glGetError() <<std::endl;' 

Теперь выход:

a 0 
b 0 
c 0 
d 1281 
e 0 
f 1281 
g 0 

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

шейдеры являются:

const std::string VertexShaderSource ="#version 330 core" 
            "" 
            "layout (location = 0) in vec3 position;" 
            "" 
            "void main()" 
            "{" 
            " gl_Position = vec4(position.x, position.y, position.z, 1.0);" 
            "}"; 

const std::string FragmentShaderSource ="#version 330 core" 
            "" 
            "out vec4 color;" 
            "" 
            "void main()" 
            "{" 
            " color = vec4(1.0f, 1.0f, 1.0f, 1.0f);" 
            "}"; 

И если проходя строку таким образом ((const char**)&VertexShaderSource) не так, то почему второй вызов работает нормально?

ответ

3

Вы должны установить vertexShader и fragmentShader результату glCreateShader вместо жестко прописывать его 0 и 1.

GLuint vertexShader; 
GLuint fragmentShader; 
vertexShader = glCreateShader(GL_VERTEX_SHADER); 
std::cout <<"b " << glGetError() <<std::endl; 
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
std::cout <<"c " << glGetError() <<std::endl; 

Функция glCreateShader возвращает 0 если это вызов не был успешным.

В своем коде вы установите vertexShader жёстко прописанные в 0 и OpenGL выдает сообщение об ошибке для , потому что вы передаете 0 в качестве идентификатора для glShaderSource.

1281 является GL_INVALID_VALUE ошибкой и сообщается if shader is not a value generated by OpenGL.glShaderSource: Errors

Кроме этого вы (const char**)&VertexShaderSource неправильно, чтобы получить адрес памяти, где а std::string хранит данные, которые вы должны использовать .c_str(): How to pass an std::string to glShaderSource?

0

Вы неправильно передаете строку, правильный путь - VertexShaderSource.c_str().

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

  • Нет связанных вопросов^_^