GLSL着色器程序链接失败求助:编译正常无报错日志
GLSL着色器链接失败排查(编译成功但链接日志为空)
我遇到GLSL着色器程序无法正常链接的问题,着色器编译成功但链接日志为空。调用以下代码:
CompileShaders("Data/Shaders/ui", 0b01, MainUiShader);
时提示错误:
ERROR: Cant link shaders
相关函数头文件代码
void CompileShader(std::string ShaderFile, GLenum ShaderType, GLuint ShaderVariable) { LoadFile(ShaderFile); ShaderVariable = glCreateShader(ShaderType); const char* ShaderSource = TempData0.c_str(); glShaderSource(ShaderVariable, 1, &ShaderSource, NULL); glCompileShader(ShaderVariable); glGetShaderiv(ShaderVariable, GL_COMPILE_STATUS, &TempValue); if (!TempValue) {glGetShaderInfoLog(ShaderVariable, 4096, NULL, Log); std::cout << "ERROR: shader compilation fail\n"; std::cout << Log << std::endl;} else {std::cout << "Shader compiled\n";}} void CompileShaders(std::string ShaderFile, int8_t ShaderTypes, GLuint ShaderVariable) { ShaderVariable = glCreateProgram(); if ((0b01 & ShaderTypes) > 0) { CompileShader(ShaderFile.append(".vsh"), GL_VERTEX_SHADER, Stemp[0]); glAttachShader(ShaderVariable, Stemp[0]); std::cout << ShaderFile; ShaderFile = ShaderFile.substr(0, ShaderFile.size() - 4);} CompileShader(ShaderFile.append(".fsh"), GL_FRAGMENT_SHADER, Stemp[2]); glAttachShader(ShaderVariable, Stemp[2]); std::cout << ShaderFile; glLinkProgram(ShaderVariable); glGetProgramiv(ShaderVariable, GL_LINK_STATUS, &TempValue); if (!TempValue) { std::cout << "ERROR: Cant link shaders"; glGetProgramInfoLog(ShaderVariable, 512, NULL, Log); std::cout<<Log; } }
主程序代码
#include "main.h" int main() { //GLFWInitialization: glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); ResetWindow(); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } glGenBuffers(1, &VBO); glGenVertexArrays(1, &VAO); CompileShaders("Data/Shaders/ui", 0b00, MainUiShader); while (Window) { if (glfwWindowShouldClose(Window)) { glfwTerminate(); return 0; } glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBindVertexArray(VAO); glBufferData(GL_ARRAY_BUFFER, sizeof(position), position, GL_DYNAMIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glUseProgram(MainUiShader); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(Window); glfwPollEvents(); } }
着色器代码
ui.fsh(片段着色器)
#version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); }
ui.vsh(顶点着色器)
#version 330 core layout (location = 0) in vec3 position; void main() { gl_Position = vec4(position.x + 0.5, position.y, position.z, 1.0); }
所有变量已正确定义,OpenGL初始化正常。本应绘制橙色三角形,但因片段着色器无法工作而显示为黑色,恳请帮忙排查链接失败原因。
内容的提问来源于stack exchange,提问作者BlastFurnace
相关产品推荐
相关产品推荐

