カスタム ゲーム エンジンに取り組んでいますが、これまでのところ、すべてが正常に機能しています。
奇妙なエラーに遭遇するまで。
シェーダー プログラムを検証しようとすると、GL_FALSE が返されます。適切なデバッグを確実にするために、何かが失敗したときにエラー メッセージのログ情報を確認しますが、このエラーには情報ログ メッセージがなく、ファイルを正しく読み取るかどうかを確認しました。そこにエラーはありません...それで、私はちょっと立ち往生しています.私は成功せずにインターネット全体を見ました.ここにいる誰かが私を助けてくれることを願っています.
前もって感謝します!
メイン関数で、頂点シェーダーとフラグメント シェーダーの 2 つのシェーダー ファイルを使用して新しいシェーダー プログラムを作成します。どちらもエラーなしでコンパイルされます。
GLuint shaderProgram = glCreateProgram();
std::string vertexFile = FileUtils::read_file("shaders/basic.vert");
std::string fragmentFile = FileUtils::read_file("shaders/basic.frag");
const char* vertexSource = vertexFile.c_str();
const char* fragmentSource = fragmentFile.c_str();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vertexSource, NULL);
glCompileShader(vertex);
GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cerr << "Failed to compile the vertex shader!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteShader(vertex);
return -1;
}
glAttachShader(shaderProgram, vertex);
GLuint fragment = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(fragment, 1, &fragmentSource, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment , length, &length, &error[0]);
std::cerr << "Failed to compile the fragment shader!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteShader(fragment);
return -1;
}
glAttachShader(shaderProgram, fragment);
glValidateProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_VALIDATE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
std::cerr << "Failed to validate the shader program!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteProgram(shaderProgram);
return -1;
}
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
std::cerr << "Failed to link the shader program!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteProgram(shaderProgram);
return -1;
}
glUseProgram(shaderProgram);
FileUtils クラスの read_file 関数を次に示します。
std::string FileUtils::read_file(const char* filepath)
{
FILE* file = fopen(filepath, "rt");
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char data[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
return result;
}
ファイルをコンソールに出力して、パスとファイルが正しく、エラーがないことを確認したため、ファイルが正しくロードされることはわかっています。
PS
コードにエラー (変数名としての「シェーダー」など) が表示された場合、これは元のコードを編集してすべてを 1 つのコード ブロックに収める必要があったためです。
glValidateProgram はglLinkProgram
、 の前に配置する必要がありますglUseProgram
。
ここからの引用:
glValidateProgram は、現在の OpenGL の状態で、プログラムに含まれる実行可能ファイルを実行できるかどうかを確認します。
プログラムがリンクされていないと、実行できません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加