簡體   English   中英

c++ open gl shader編譯失敗

[英]c++ open gl shader failed compilation

我正在嘗試學習 cpp 中的 gl 並嘗試創建一些着色器,閱讀其文檔並遵循 yt 教程。 它只是編譯失敗。 昨天它只是在控制台着色器“+ filePath +”中打印,今天編譯失敗,它打印:

錯誤:0:7:'gl_position':未聲明的標識符
錯誤:0:7:“xy”:字段選擇需要左側的結構、向量或矩陣錯誤:0:7:“分配”:無法從“highp float 的 2 分量向量”轉換為“highp float”
錯誤: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");
    }
}

頂點着色器無法編譯,因為它必須是gl_Position而不是gl_position GLSL 區分大小寫。 請參閱頂點着色器 - 輸出

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM