c ++ open gl shader не удалось собрать - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь изучить gl в cpp и пытаюсь создать несколько шейдеров, читая его документацию и следуя руководству yt. Это просто сбой компиляции. В прошлом это было просто печать в консоли Shader "+ filePath +" не удалось скомпилировать Сегодня это печать, что:

ОШИБКА: 0: 7: 'gl_position': необъявленный идентификатор
ОШИБКА: 0: 7: 'xy': для выбора поля требуется структура, вектор или матрица слева сторона руки ОШИБКА: 0: 7: «assign»: невозможно преобразовать из «2-компонентного вектора highp float» в 'highp float'
ОШИБКА: 0: 8: 'z': для выбора поля требуется структура, вектор или матрица слева сторона руки ОШИБКА: 0: 9: 'w': для выбора поля требуется структура, вектор или матрица слева сторона стороны

Shader shaders / colorShading.vert не удалось скомпилировать Введите любой ключ, чтобы выйти ...

это мой исходный код шейдера:

#version 130

in vec2 vertexPosition;

void main()
{
    gl_position.xy = vertexPosition * 2;
    gl_position.z = 0.0;
    gl_position.w = 1.0;
}

/////////////////////////////////////////////// ///////

#include "GLSLProgram.h"
#include "Error.h"

#include <fstream>
#include <vector>

GLSLProgram::GLSLProgram() :_numAttributes(0), _programID(0), _vertexShaderID(0), _fragmentShaderID(0)
{
}


GLSLProgram::~GLSLProgram()
{

}

void GLSLProgram::compileShaders(const std::string& vertexShaderFilePath, const std::string& framgmentShaderFilePath)
{
    _vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    if (_vertexShaderID == 0)
    {
        fatalError("Vertex shader failed to be created!");
    }

    _fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    if (_fragmentShaderID == 0)
    {

        fatalError("Fragment shader failed to be created!");
    }



    compileShader(vertexShaderFilePath, _vertexShaderID);
    compileShader(framgmentShaderFilePath, _fragmentShaderID);
}

void GLSLProgram::linkShaders()
{

    // Attach Shaders to Program
    glAttachShader(_programID, _vertexShaderID);
    glAttachShader(_programID, _fragmentShaderID);

    // Link the Program.
    glLinkProgram(_programID);

    GLuint isLinked = 0;
    glGetProgramiv(_programID, GL_LINK_STATUS, (int *)&isLinked);
    if (GL_FALSE == isLinked) {

        GLint maxLength = 0;
        glGetProgramiv(_programID, GL_INFO_LOG_LENGTH, &maxLength);

        std::vector<char> errorLog(maxLength);
        glGetProgramInfoLog(_programID, maxLength, &maxLength, &errorLog[0]);

        glDeleteProgram(_programID);
        glDeleteShader(_vertexShaderID);
        glDeleteShader(_fragmentShaderID);

        std::printf("%s\n", &(errorLog[0]));
        fatalError("Shaders failed to link!");

        return;

    }

    glDetachShader(_programID, _vertexShaderID);
    glDetachShader(_programID, _fragmentShaderID);
    glDeleteShader(_vertexShaderID);
    glDeleteShader(_fragmentShaderID);

}

void GLSLProgram::addAttribute(const std::string& attributeName)
{
    glBindAttribLocation(_programID, _numAttributes++, attributeName.c_str());
}

void GLSLProgram::use()
{
    glUseProgram(_programID);
    for (int i = 0; i < _numAttributes; i++)
    {
        glEnableVertexAttribArray(i);
    }
}

void GLSLProgram::unuse()
{
    glUseProgram(0);
    for (int i = 0; i < _numAttributes; i++)
    {
        glDisableVertexAttribArray(i);
    }
}

void GLSLProgram::compileShader(const std::string & filePath, GLuint& id)
{
    std::ifstream fileptr(filePath);
    if (fileptr.fail()) {
        // Not sold on this
        perror(filePath.c_str());
        fatalError("Failed to Open " + filePath);
    }

    std::string fileContents = "";
    std::string line;

    while (std::getline(fileptr, line))
    {
        fileContents += line + "\n";
    }

    fileptr.close();

    // This is weird
    const GLchar * contentsPtr = fileContents.c_str();
    glShaderSource(id, 1, &contentsPtr, 0);

    glCompileShader(id);

    GLint success = 0;
    glGetShaderiv(id, GL_COMPILE_STATUS, &success);

    if (success == GL_FALSE) {

        GLint maxLength = 0;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &maxLength);

        std::vector<GLchar> errorLog(maxLength);
        glGetShaderInfoLog(id, maxLength, &maxLength, &errorLog[0]);

        glDeleteShader(id);

        std::printf("%s\n", &(errorLog[0]));
        fatalError("Shader " + filePath + " failed to Compile");
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Вершинный шейдер не удалось скомпилировать, потому что он должен быть gl_Position вместо gl_position.GLSL чувствителен к регистру.См. Вершинный шейдер - Выходы :

void main()
{
    gl_Position.xy = vertexPosition * 2;
    gl_Position.z = 0.0;
    gl_Position.w = 1.0;
}
...