Почему я получаю ошибку компоновки, когда не должно быть ничего плохого - PullRequest
0 голосов
/ 19 апреля 2020

Я Java разработчик и недавно перешел на C ++. Я пытался сделать небольшую программу OpenGL, и я столкнулся с проблемой. Всякий раз, когда я пытаюсь скомпилировать свою шейдерную программу, она выдает ошибку компоновки. Вот оно:

ERROR::SHADER::PROGRAML::LINKING_ERROR
Link info
---------
error: "TexCoord" not declared as an output from the previous stage

Вот файлы шейдера:

Вершина:

#version 440 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

void main()
{
    gl_Position = vec4(aPos, 1.0);
    ourColor = aColor;
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

Фрагмент

#version 440 core

out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

// texture sampler
uniform sampler2D texture1;

void main()
{
    FragColor = texture(texture1, TexCoord);
}

А вот и создание шейдера:

int success;
char infoLog[512];

const char* vertexSource;
const char* fragmentSource;

// Load in shader source

std::ifstream inFile;

inFile.open(vertexPath);

std::string temp = "";
std::string source = "";

if (inFile.is_open())
{
    while (std::getline(inFile, temp))
        source += temp + "\n";
}
else
{
    std::cout << "ERROR::SHADER::VERTEX::COULD_NOT_OPEN_SOURCE_FILE" << std::endl;
}

inFile.close();

vertexSource = source.c_str();

temp = "";
source = "";

inFile.open(fragmentPath);

if (inFile.is_open())
{
    while (std::getline(inFile, temp))
        source += temp + "\n";
}
else
{
    std::cout << "ERROR::SHADER::FRAGMENT::COULD_NOT_OPEN_SOURCE_FILE" << std::endl;
}

inFile.close();

fragmentSource = source.c_str();

unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, nullptr);
glCompileShader(vertexShader);

glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
    glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
    std::cout << "ERROR::SHADER::VERTEX::COULD_NOT_COMPILE\n" << infoLog << std::endl;
}

unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, nullptr);
glCompileShader(fragmentShader);

glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
    glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
    std::cout << "ERROR::SHADER::FRAGMENT::COULD_NOT_COMPILE\n" << infoLog << std::endl;
}

// Program

ID = glCreateProgram();
glAttachShader(ID, vertexShader);
glAttachShader(ID, fragmentShader);
glLinkProgram(ID);

glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
{
    glGetProgramInfoLog(ID, 512, nullptr, infoLog);
    std::cout << "ERROR::SHADER::PROGRAML::LINKING_ERROR\n" << infoLog << std::endl;
}

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glUseProgram(0);

Насколько я понимаю, я должен получить эту ошибку, только если две переменные, которые я пытаюсь связать, не имеют одинаковое имя или тип, но они есть. Я просто не понимаю.

Спасибо.

1 Ответ

2 голосов
/ 19 апреля 2020

По сути, у вас есть ...

std::string source;
const char *vertexSource;
const char *fragmentSource;

...read into source...

vertexSource = source.c_str();

...read into source...

fragmentSource = source.c_str();

Указатель, сохраненный в vertexSource, будет недействительным при втором чтении в source. Из документации

Указатель, полученный с помощью c_str (), может быть признан недействительным:

  • Передача неконстантной ссылки на строку любому стандартная библиотечная функция или
  • Вызов неконстантных функций-членов в строке, за исключением операторов [], at (), front (), back (), begin (), rbegin (), end () и rend ().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...