2017-01-18 2 views
-1

Я довольно новичок в OpenGL и просто начал с базовой программы с вершинным шейдером и шейдером фрагментов. Все работало, пока я не попытался отправить данные из вершинного шейдера в шейдер фрагмента. Я читал код онлайн и делал это отлично. я использую в вершинном шейдере и в шейдере фрагментов, я смотрел онлайн везде для решения и не мог найти ничего, и его трудно отлаживать, когда вы не знаете много о GLSL или OpenGL. Вот шейдеры. (Плохо только вывешиваем шейдеры, так как все остальное работает нормально вершиннойOpenGL не может отправлять переменные из вершинного шейдера в фрагментарный шейдер

#version 120 
varying vec4 ourColor; 
attribute vec3 position; 

void main() 
{ 
gl_Position = vec4(position, 1.0); 
ourColor = vec4(1.0,0.1,0.2,0.5); 
} 

и фрагмент:.

#version 120 
varying vec4 ourColor; 

void main() 
{ 
gl_FragColor = ourColor; 
} 

Ошибка является: Fragment Shader содержит пользователя изменяющийся, но связан без вершинного шейдера Я пробовал использовать ключевое слово flat и различное ключевое слово, тот же результат. И спасибо в продвинутом для вашего времени. Также я попытался изменить версию, а затем использовать in и out, такую ​​же ошибку. Вот код шейдера: (его в шейдерном классе, это Shader.cpp)

 Shader::Shader(const std::string & fileName) 
    { 
    m_program = glCreateProgram(); 
    //vertex shader 
    m_shaders[0] = CreateShader(LoadShader(fileName + ".vs"), GL_VERTEX_SHADER); 
    m_shaders[0] = CreateShader(LoadShader(fileName + ".fs"),  
      GL_FRAGMENT_SHADER); 


    for(unsigned int i = 0; i < NUM_SHADERS; i++) 
     glAttachShader(m_program, m_shaders[i]); 


    glBindAttribLocation(m_program, 0, "position"); 


    glLinkProgram(m_program); 
    CheckShaderError(m_program, GL_LINK_STATUS, true, "Error: Program linking failed. "); 

    glValidateProgram(m_program); 
    CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Error: Program is invalid. "); 
} 
//----------- 
Shader::~Shader(void) 
{ 
    for(unsigned int i = 0; i < NUM_SHADERS; i++) 
    { 
     glDetachShader(m_program, m_shaders[i]); 
     glDeleteShader(m_shaders[i]); 
    } 

    glDeleteProgram(m_program); 

} 
//---------- 
void Shader::Bind() 
{ 
    glUseProgram(m_program); 
} 
static GLuint CreateShader(const std::string & text, GLenum shaderType) 
{ 
    GLuint shader = glCreateShader(shaderType); 
    if(shader == 0) 
    { 
     std::cerr << "Error: Shader creation failed! " << std::endl; 
    } 
    const GLchar* ShaderSourceStrings[1]; 
    GLint ShaderSourceStringsLengths[1]; 
    ShaderSourceStrings[0] = text.c_str(); 
    ShaderSourceStringsLengths[0] = text.length(); 
    glShaderSource(shader, 1, ShaderSourceStrings, ShaderSourceStringsLengths); 
    glCompileShader(shader); 
    CheckShaderError(shader, GL_COMPILE_STATUS, false, "Error: Shader compilation failed"); 
    return shader; 
} 
//----------- 
static std::string LoadShader(const std::string & fileName) 
{ 
    std::ifstream file; 
    file.open((fileName).c_str()); 
    std::string output; 
    std::string line; 
    if(file.is_open()) 
    { 
     while(file.good()) 
     { 
      getline(file, line); 
      output.append(line + "\n"); 
     } 
    } 
    else 
    { 
     std::cerr << "unable to load shader file: " << fileName << std::endl; 
    } 
    return output; 
} 
//----------- 
static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string & errorMessage) 
{ 
    GLint success = 0; 
    GLchar error[1024] = {0}; 
    if(isProgram) 
     glGetProgramiv(shader, flag, &success); 
    else 
     glGetShaderiv(shader, flag, &success); 
    if(success == GL_FALSE) 
    { 
     if(isProgram){ 
      glGetProgramInfoLog(shader, sizeof(error), NULL, error); 
     std::cout << "error from program" << std::endl; 
     } 
     else{ 
      glGetShaderInfoLog(shader, sizeof(error), NULL, error); 
      std::cout << "error from shader" << std::endl; 
     } 
      std::cerr << errorMessage << ": '" << error << "'" << std::endl; 
     } 
    } 
+1

Вы не можете смешивать 'in/out' и' attribute/varying'. Это похожие вещи, но в разных версиях GLSL/OpenGL. – BDL

+2

Любая версия 120 и 'атрибут/переменная', или версия 150+, и' in/out'. – pleluron

+0

@BDL: Я думаю, вы можете смешивать их, так как атрибут/переменная просто устарели. В зависимости от версии они могут быть доступны только в профиле совместимости. –

ответ

2

Окончательное обновление:

Вот ошибка.

m_shaders[0] = 
m_shaders[0] = 

Fragment Shader содержит пользователя изменяющийся, но связан без вершинного шейдера.

Связано без вершинного шейдера? Это определенно вызовет проблемы. Код должен выглядеть неопределенно так:

GLuint load_shader(GLenum shader_type, ...) { 
    GLuint shader = glCreateShader(shader_type); 
    ... load shader source code ... 
    glCompileShader(shader); 
    GLint success; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success); 
    if (!success) { 
     // boom 
    } 
    ... glGetShaderInfoLog ... 
    return shader; 
} 

GLuint load_program(...) { 
    GLuint prog = glCreateProgram(); 
    // Attach both fragment and vertex shader 
    glAttachShader(prog, load_shader(GL_VERTEX_SHADER, ...)); 
    glAttachShader(prog, load_shader(GL_FRAGMENT_SHADER, ...)); 
    // Then link them together 
    glLinkProgram(prog); 
    GLint success; 
    glGetProgramiv(program, GL_LINK_STATUS, &success); 
    if (!success) { 
     // boom 
    } 
    ... glGetProgramInfoLog ... 
} 

Это справедливый бит шаблонного кода, и есть много возможностей для кода, чтобы содержать ошибки, поэтому общие для что-то неправильно, особенно так как практически все в OpenGL - это всего лишь typedef int GLxxx; или что-то в этом роде.


В GLSL 120, in и out не являются классификаторы для хранения. Вместо этого используйте varying.

// Same in vertex and fragment shader. 
varying vec4 ourColor; 

В качестве альтернативы используйте новую версию GLSL.

#version 330 
out vec4 ourColor; 
in vec3 position; 

#version 330 
in vec4 ourColor; 
out vec4 fragColor; 
+0

Я сказал в вопросе, что я уже пробовал использовать переменную (вместо того, чтобы входить и выходить), также изменение версии не помогло:/ее странно, я все пробовал – user7437896

+0

Почему вы не обновляете вопрос своей «изменяющейся» версией шейдеров, а не теми, которые у вас есть сейчас, которые явно не могут работать из-за несоответствия ключевых слов/версий. – Jherico

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