[英]Why does my GLSL shader fail compilation with no error message?
我正在使用OpenGL和C ++構建游戲。 我正在使用GLFW和GLAD。 我目前正在設置簡單的着色器,但是我完全被編譯問題所困擾。 簡而言之, 着色器編譯失敗,沒有錯誤消息 。
這是我的頂點着色器(用於繪制2D圖像和文本):
#version 330 core
layout (location = 0) in vec2 vPosition;
layout (location = 1) in vec2 vTexCoords;
layout (location = 2) in vec4 vColor;
out vec4 fColor;
out vec2 fTexCoords;
uniform mat4 mvp;
void main()
{
vec4 position = mvp * vec4(vPosition, 0, 1);
position.y *= -1;
gl_Position = position;
fColor = vColor;
fTexCoords = vTexCoords;
}
這是創建着色器,加載着色器源,編譯着色器以及檢查錯誤的相關代碼。
GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);
std::string source = FileUtilities::ReadAllText(Paths::Shaders + filename);
GLchar const* file = source.c_str();
GLint length = static_cast<GLint>(source.size());
glShaderSource(shaderId, 0, &file, &length);
glCompileShader(shaderId);
GLint status;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE)
{
GLint logSize = 0;
glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &logSize);
std::vector<GLchar> message = std::vector<GLchar>(logSize);
glGetShaderInfoLog(shaderId, logSize, nullptr, &message[0]);
glDeleteShader(shaderId);
std::cout << std::string(message.begin(), message.end());
}
使用該代碼, logSize
返回為1,這意味着我無法訪問GL提供的錯誤消息。 據我所知,該消息根本不存在。 我已經看到了這里發布的問題,其中的問題是缺少對glCompileShader
調用。 如您所見,我的代碼確實調用了該函數。
在嘗試解決此問題時,我已經確認了幾件事。
GLchar const*
或GLint
(變量file
和length
)沒有強制轉換問題。 兩者看起來都正確。 logSize
的值(例如1000),則得到的消息就是零。 沒有錯誤消息存在。 glfwInit()
和相關函數。 查詢glGetString(GL_VERSION)
確實會返回目標版本(3.3.0)。 有誰知道如何解決這一問題? 如我所說,我的進度被完全阻止了,因為如果沒有有效的着色器就無法渲染任何東西(2D或3D)。
謝謝!
問題是您永遠不會將任何着色器源上載到着色器。
這行的第二個參數:
glShaderSource(shaderId, 0, &file, &length);
告訴OpenGL將0代碼字符串加載到着色器(什么都沒有)。 將其更改為1,它應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.