簡體   English   中英

為什么我的GLSL着色器無法編譯而沒有錯誤消息?

[英]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 (變量filelength )沒有強制轉換問題。 兩者看起來都正確。
  • 如果我人為地增加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.

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