-2

https://learnopengl.com/チュートリアルに基づいて独自のシェーダーを構築していました。
問題は、シェーダープログラムをリンクするときに次のエラーが発生することでした

VERTEX SHADER LOG

FRAGMENT SHADER LOG
WARNING: warning(#272) Implicit version number 110 not supported by GL3 forward compatible context

SHADER LINKING LOG
Vertex shader(s) failed to link, fragment shader(s) failed to link.
Vertex link error: INVALID_OPERATION.
ERROR: error(#97) No program main found
fragment link error: INVALID_OPERATION.
ERROR: error(#97) No program main found

私が構築したシェーダークラスは

#pragma once


#include <glew/glew.h>

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

class Shader
{
    private:

    unsigned int ID;

    void checkShaderCompile(unsigned int shaderID, std::string type)
    {
        char compileLog[1024];
        glGetShaderInfoLog(shaderID, 1024, NULL, compileLog);
        std::cout << type << " LOG" << std::endl;
        std::cout << compileLog << std::endl;
    }

    void checkProgramLink()
    {
        char linkLog[1024];
        glGetProgramInfoLog(ID, 1024, NULL, linkLog);
        std::cout << "SHADER LINKING LOG" << std::endl;
        std::cout << linkLog << std::endl;
    }

    std::string getVertexSource(const char* vertexPath)
    {
        std::string vertexSource;
        std::ifstream vertexFile;

        vertexFile.exceptions(std::ifstream::badbit | std::ifstream::failbit);

        try
        {
            vertexFile.open(vertexPath);

            std::stringstream vertexStream;
            vertexStream << vertexFile.rdbuf();

            vertexSource = vertexStream.str();
        }
        catch (std::ifstream::failure e)
        {
            std::cout << "CANNOT OPEN VERTEX SHADER" << std::endl;
        }

        return vertexSource;
    }

    std::string getFragmentSource(const char* fragmentPath)
    {
        std::string  fragmentSource;
        std::ifstream  fragmentFile;

        fragmentFile.exceptions(std::ifstream::badbit | std::ifstream::failbit);

        try
        {
            fragmentFile.open(fragmentPath);

            std::stringstream fragmentStream;
            fragmentStream << fragmentStream.rdbuf();

            fragmentSource = fragmentStream.str();
        }
        catch (std::ifstream::failure e)
        {
            std::cout << "CANNOT OPEN FRAGMENT SHADER" << std::endl;
        }

        return fragmentSource;
    }

    public:
    Shader(const char* vertexPath, const char* fragmentPath)
    {

        std::string vertexSource = getVertexSource(vertexPath);
        std::string fragmentSource = getFragmentSource(fragmentPath);

        const char* vertexCode = vertexSource.c_str();
        const char* fragmentCode = fragmentSource.c_str();

        //creating and compiling vertex shader
        unsigned int vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShaderID, 1, &vertexCode, NULL);
        glCompileShader(vertexShaderID);
        checkShaderCompile(vertexShaderID, "VERTEX SHADER");

        //creating and compiling frgment shader
        unsigned int fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShaderID, 1, &fragmentCode, NULL);
        glCompileShader(fragmentShaderID);
        checkShaderCompile(fragmentShaderID, "FRAGMENT SHADER");

        //creating and linking a shader program
        ID = glCreateProgram();
        glAttachShader(ID, vertexShaderID);
        glAttachShader(ID, fragmentShaderID);
        glLinkProgram(ID);
        checkProgramLink();


        glDeleteShader(vertexShaderID);
        glDeleteShader(fragmentShaderID);
    }

    void use()
    {
        glUseProgram(ID);
    }
};

ご覧のとおり、私が作成した論理エラーはなく、fragmentCode && vertexCode 文字列は、作成したシェーダー ファイル
で頂点がどこにあるかと同じでした。

#version 330
layout(location = 0) in vec3 vertexCoordinates;

void main()
{
    gl_Position = vec4(vertexCoordinates, 1.0);
}

そしてフラグメントは

#version 330

out vec4 finalColor;

void main()
{
    finalColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
}
4

2 に答える 2

1

OpenGL は、バージョンやコンテキストに注意を払う必要がある場合があり、最善の方法は、すべて (特に GPU ドライバー) が更新されていることを確認することです。お使いのコンピューターがサポートしている場合は、OpenGL バージョン 4.3 または 4.6 を使用することをお勧めします。頂点シェーダーはコンパイルされていますが、フラグメントはコンパイルされていません。これは、同じ形式を使用していることを考えると、非常に奇妙です。これは非常に非回答であり、ここで何をすべきかではなく、ここで確認すべきことです。これらはすべて互いに影響し合うため、問題はエラーの場所ではない可能性があります。

于 2021-01-28T20:51:44.203 に答える