Я пытаюсь изучить 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");
}
}