Я довольно новичок в 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;
}
}
Вы не можете смешивать 'in/out' и' attribute/varying'. Это похожие вещи, но в разных версиях GLSL/OpenGL. – BDL
Любая версия 120 и 'атрибут/переменная', или версия 150+, и' in/out'. – pleluron
@BDL: Я думаю, вы можете смешивать их, так как атрибут/переменная просто устарели. В зависимости от версии они могут быть доступны только в профиле совместимости. –