C++ c++;open gl着色器编译失败

C++ c++;open gl着色器编译失败,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我正在尝试学习cpp中的gl,并尝试创建一些着色器,阅读其文档并遵循yt教程。 只是编译失败了。 yestarday只是在控制台着色器中打印“+filePath+”未能编译 今天,它指出: 错误:0:7:“gl_位置”:未声明的标识符 错误:0:7:“xy”:字段选择需要左侧的结构、向量或矩阵 手边 错误:0:7:“分配”:无法从“高浮点的2分量向量”转换 到“高浮动” 错误:0:8:“z”:字段选择需要左侧的结构、向量或矩阵 手边 错误:0:9:“w”:字段选择需要左侧的结构、向量或矩阵 手边

我正在尝试学习cpp中的gl,并尝试创建一些着色器,阅读其文档并遵循yt教程。 只是编译失败了。 yestarday只是在控制台着色器中打印“+filePath+”未能编译 今天,它指出:

错误:0:7:“gl_位置”:未声明的标识符
错误:0:7:“xy”:字段选择需要左侧的结构、向量或矩阵 手边 错误:0:7:“分配”:无法从“高浮点的2分量向量”转换 到“高浮动”
错误:0:8:“z”:字段选择需要左侧的结构、向量或矩阵 手边 错误:0:9:“w”:字段选择需要左侧的结构、向量或矩阵 手边

着色器着色器/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");
    }
}
#包括“GLSLProgram.h”
#包括“Error.h”
#包括
#包括
GLSLProgram::GLSLProgram():_numAttributes(0),_programmaid(0),_vertexShaderID(0),_fragmentShaderID(0)
{
}
GLSLProgram::~GLSLProgram()
{
}
void GLSLProgram::compileshader(常量std::string和vertexShaderFilePath,常量std::string和framgmentShaderFilePath)
{
_vertexShaderID=glCreateShader(GL_VERTEX_着色器);
如果(_vertexShaderID==0)
{
fatalError(“无法创建顶点着色器!”);
}
_fragmentShaderID=glCreateShader(GL\u FRAGMENT\u着色器);
如果(_fragmentShaderID==0)
{
fatalError(“无法创建碎片着色器!”);
}
编译器标头(vertexShaderFilePath,_vertexShaderID);
compileShader(fragmmentshaderfilepath,_fragmentShaderID);
}
void GLSLProgram::linkShaders()
{
//将着色器附加到程序
glAttachShader(_programmaid,_vertexShaderID);
glAttachShader(_programmaid,_fragmentShaderID);
//链接程序。
glLinkProgram(_programID);
GLuint isLinked=0;
glGetProgramiv(GLGETPROGRAMID、GL链接状态(int*)和isLinked);
如果(GL_FALSE==isLinked){
闪烁最大长度=0;
glGetProgramiv(_programID、GL_INFO、LOG_LENGTH和maxLength);
标准::向量错误日志(最大长度);
glGetProgramInfoLog(_programID、maxLength、maxLength和errorLog[0]);
glDeleteProgram(_programID);
glDeleteShader(_vertexShaderID);
glDeleteShader(_fragmentShaderID);
std::printf(“%s\n”和(errorLog[0]);
fatalError(“着色器链接失败!”);
返回;
}
glDetachShader(_programID,_vertexShaderID);
glDetachShader(_programID,_fragmentShaderID);
glDeleteShader(_vertexShaderID);
glDeleteShader(_fragmentShaderID);
}
void GLSLProgram::addAttribute(常量std::string和attributeName)
{
glBindAttribLocation(_programmaid,_numAttributes++,attributeName.c_str());
}
void GLSLProgram::use()
{
glUseProgram(_programmaid);
对于(int i=0;i<\u numAttributes;i++)
{
GlenableVertexAttributeArray(i);
}
}
void GLSLProgram::unuse()
{
glUseProgram(0);
对于(int i=0;i<\u numAttributes;i++)
{
GLDisableVertexAttributeArray(i);
}
}
void GLSLProgram::compileShader(const std::string和filePath,GLuint和id)
{
std::ifstream fileptr(filePath);
if(fileptr.fail()){
//这个不卖
perror(filePath.c_str());
fatalError(“打开失败”+文件路径);
}
std::string fileContents=“”;
std::字符串行;
while(std::getline(fileptr,line))
{
fileContents+=行+“\n”;
}
fileptr.close();
//这很奇怪
const GLchar*contentsPtr=fileContents.c_str();
glShaderSource(id,1和contentsPtr,0);
glCompileShader(id);
闪烁成功=0;
glGetShaderiv(id、GL\u编译状态和成功);
如果(成功==GL_假){
闪烁最大长度=0;
glGetShaderiv(id、GL\u INFO\u LOG\u LENGTH和maxLength);
标准::向量错误日志(最大长度);
glGetShaderInfoLog(id、maxLength、maxLength和errorLog[0]);
glDeleteShader(id);
std::printf(“%s\n”和(errorLog[0]);
fatalError(“着色器”+filePath+“未能编译”);
}
}

顶点着色器无法编译,因为它必须是
gl\u位置
而不是
gl\u位置
。GLSL区分大小写。见:


顶点着色器无法编译,因为它必须是
gl\u位置
,而不是
gl\u位置
。GLSL区分大小写。见:


着色器无法编译,但我们没有其源代码…”错误:0:7:“gl_位置”,它必须是
gl_位置
,GLSL区分大小写,只是输入错误:着色器无法编译,但我们没有其源代码…”错误:0:7:“gl_位置”,它必须是
gl_位置
,GLSL区分大小写,只是一个打字错误:你是对的!非常感谢。现在它显示:错误:0:8:“构造函数”:太多参数着色器/colorShading.frag未能编译,请输入任何键退出…@IliasKarypidis这是片段着色器中的错误。请显示您的片段着色器toOnOW问题解决了,但我得到MS VisualC++运行库错误。调试断言失败!表达式:矢量下标超出范围有人能帮我吗?@IliasKarypidis没有,没有任何具体信息。“调试断言失败”可以在程序中的任何位置。你必须调试你的程序。调试断言发生在哪里。除此之外,这是一个新问题。你说得对!非常感谢。现在它显示:错误:0:8:“构造函数”:太多参数着色器/colorShading.frag未能编译,请输入任何键退出…@IliasKarypidis这是片段着色器中的错误。请显示您的片段着色器toOnOW问题解决了,但我得到MS VisualC++运行库错误。调试断言失败!表达式:矢量下标超出范围有人能帮我吗?@IliasKarypidis没有,没有任何具体信息。“调试断言失败”可以是
void main()
{
    gl_Position.xy = vertexPosition * 2;
    gl_Position.z = 0.0;
    gl_Position.w = 1.0;
}