【问题标题】:Can't link glsl vertex shader无法链接 glsl 顶点着色器
【发布时间】:2016-11-11 22:47:23
【问题描述】:

我正在学习 OpenGL 并尝试做一些简单的纹理。因此,我将纹理坐标作为属性提供。

我的顶点着色器有一个奇怪的错误:

#version 150

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main()
{
    Color = color;
    Texcoord = vec2 (1.0, 0.5); /* just for debugging hardcode texcords */
    gl_Position = vec4( position, 0.0, 1.0 );
}

着色器编译正常,但是当我尝试链接着色器所属的程序时,glGetProgramInfoLog() 日志显示:

错误:编译的顶点着色器已损坏。

当我删除时

in vec2 texcoord;

错误消失。我如何命名属性并不重要。一旦我添加第三个,我就会收到此错误。

没有编译错误。就是这个链接错误。

我在 OS X 10.8.3 上使用 OpenGL 3.2 核心上下文。我使用 GLEW。

更新:

现在我可以链接这个了:

#version 150

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main()
{
    Color = color;
    gl_Position = vec4( position, 0.0, 1.0 );
}

但我一添加

Texcoord = texcoord;

着色器损坏的主要功能。我很绝望。这是什么?

【问题讨论】:

  • 片段着色器中有in vec2 Texcoord 吗? (我不确定,但可能是名称相同的问题,除了字母的大小写,我总是选择不同的名称)编译时删除未使用的变量,这将防止链接错误。
  • 如果将 'texcoord' 重命名为其他名称会怎样?
  • 如果我们能看到您的片段着色器以及用于编译/链接您的程序的重要 OpenGL 调用的一小段摘录,这可能会对我们有所帮助。只需阅读 #150 的规范,我就看不出你的顶点着色器有什么问题。
  • 问题不在于着色器,而在于我从磁盘加载着色器文件的函数。我这样做了: const char* shaderSource = loadFile(path.c_str()).c_str();其中 loadFile() 以纯文本形式返回包含着色器的 std::string。不知何故,这并不是每次都奏效。我将其更改为 string shaderString = loadFile(path.c_str()); const char* shaderSource = shaderString.c_str(); .这确实有效。我不知道为什么。请为此创建并回答(不是评论)。
  • 如果您找到解决方案,您可以(并鼓励)回答您自己的问题。 There's nothing wrong with that。不过,关于这个问题:如果其他人无法从您的解决方案中受益,您可能会发现这个问题会变得过于本地化。例如,如果您的修复只是程序某些部分的错字您从未在问题中提及,那么这很可能。

标签: opengl glsl


【解决方案1】:

您在上面的评论中说要更改您的代码

const char* shaderSource = loadFile(path.c_str()).c_str();

string shaderString = loadFile(path.c_str());
const char* shaderSource = shaderString.c_str();

解决了您的问题。

std::string 对象正在被销毁,因为没有对它的引用,这反过来又会破坏 c 字符串缓冲区。读取时该缓冲区的内容是什么,这取决于运气。

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多